Bir noktaya temas eden özellikler QGIS kullanarak satır katmanına geri dönüyor mu?


12

QGIS 2.14.4-Essen kullanıyorum. İki katmanım var:

  • YEAR sütunu olan noktalar içeren points.shp
  • points.shp ile noktaları tam olarak birleştiren çizgiler içeren lines.shp

YEAR niteliğini points.shp'den lines.shp'ye geri almak istiyorum. Her çizgi, her bir ucunda bir nokta bulunan tek bir segmenttir (aşağıdaki resme bakın). Almak istediğim ilk noktadan YEAR ve ikinci noktadan her satır özelliğine geri YEAR.

Örneğin: satır 1, YEAR = 2010 ile bir ilk noktaya ve YEAR = 2011 ile bir ikinci noktaya temas ediyor. '2010-2011' gibi bir şeyi satır 1 özniteliklerine geri döndürmek istiyorum. Sonuç şöyle görünmelidir:

id  | points
----+-----------------
1   | 2010-2011
2   | 2011-2012
3   | 2012-2016

resim açıklamasını buraya girin

QGIS kullanarak bunu başarmanın bir yolu var mı?

Yanıtlar:


9

@Radouxju cevabı geçerli olmasına rağmen , biraz daha ayrıntılı açıklayacağım.

  1. Çoklu çizgi özelliğinin nokta konumlarının tam üzerine bölündüğünden emin olmanız gerekir.
  2. Kullanın Join attribute by location. Nokta konumlarında bölme çizgisi özelliğini hedef katman olarak seçin - benim durumumda "patladı" olarak adlandırıyorum.
  3. Özet bölümünde, "Kesişen özelliğin özetini al" ı seçin. Burada, aracı iki kez çalıştırmak yerine; biri Min için ve Max için başka bir kez, bir kez çalıştırabilir ve hem Min hem de Maks.

resim açıklamasını buraya girin

  1. Çıkış dosyası aşağıdaki özniteliğe sahip olacaktır:

resim açıklamasını buraya girin

  1. 4. adımdaki yeni şekil dosyasına "Yıl" adlı yeni bir dize türü alanı ekleyin.
  2. Alan hesap makinesini kullanın ve mevcut alanı güncellemeye gidin. "Yıl" ı seçin ve aşağıdaki ifadeyi yazın:

    to_string ("MINYEAR2") + '-' + to_string ("MAXYEAR2")

  3. Son çıktı özelliği şu şekilde görünecektir:

resim açıklamasını buraya girin

  1. Nihai çıktı şu şekilde olacaktır:

resim açıklamasını buraya girin


Verilerinizi test ettikten sonra çıktı şu şekildedir:

resim açıklamasını buraya girin

Soldaki tablo, tamsayı tipi yeni bir alan oluşturulduktan sonraki nokta verileridir ve sağdaki tablo, yukarıda belirtilen 2. adımı kullanarak nokta verileriyle çizgiyi birleştirdikten sonradır. Sonra son verileri oluşturmak için 5-6. Adımları kullandım.

Güncelleme

Alan YIL ifadesini to_int () kullanarak tamsayı dizeye dönüştürmek için çalıştı ve çalıştı. Yani elle yapmanıza gerek yok. Ancak, alan türü Integerdeğil türünde olmalıdır Integer64. Alan uzunluğunun 9'a kadar olduğundan emin olun. 10 alan uzunluğunu seçerseniz, bu biçime dönüştürülür Interger64ve ile çalışmaz Interger64. Sonra adım 2-6'dan süreci takip edebilirsiniz.

To_int () ifadesini kullandıktan sonra son çıktı:

resim açıklamasını buraya girin

Soldaki yukarıdaki öznitelik tablosunda YEAR, string türünde ve YEAR2, to_int () ifadesi kullanılarak dönüştürülen type integer türünde. 2-6. Adımları izledikten sonra sağdaki nitelik tablosunda görebilirsiniz, MINYEAR2 ve MAXYEAR2 var, sonra YEAR alanında her şeyi birleştirmek için tekrar dizeye dönüştüm.


Çok teşekkürler! Birkaç kez yaptığım şey tam olarak bu. Points2One eklentisini kullanarak nokta katmanlarından çizgiler oluşturduğum için, çoklu çizgi özelliklerinin tam olarak nokta konumlarının üstünde olduğunu tahmin ediyorum. Bu veri alt kümesini deneyebilirsiniz: drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view ? Tekrar teşekkürler!
wiltomap

Özellik tablosundaki YEAR alanı, string türünde. Yeni bir tamsayı türü alanı eklemeniz ve yılları manuel olarak girmeniz gerekir. Tamsayı türü alanını oluşturduktan ve düzenlemeleri kaydettikten sonra eski dize alanını kaldırın. Ardından, yukarıdaki ayrıntılı işlemi izleyin.
ahmadhanb

Alan YIL ifadesini to_int () kullanarak tamsayı dizeye dönüştürmek için çalıştı, ama aynı zamanda işe yaramadı. Yılları manuel olarak girdiğimde, beklendiği gibi çalıştı.
ahmadhanb

@Ahmadhanb
Shiko

Teşekkürler @ahmadhanb! Gerçek şu ki, yukarıda paylaştığım veriler bir alt küme. Birkaç bin satır ve puanım var, bu yüzden yıllara elle girmek oldukça fazla iş olacak! Bu bir hata mı?
wiltomap

5

Satırları birleştirmek için birleştirme noktaları birden fazla ilişkiniz olacaktır. "Özelliğe konuma göre katıl" ile, belirli bir özet yöntemini isteyebilirsiniz. Sizin durumunuzda, bunu iki kez yapın: bir kez minimum ve bir kez maksimum. Bundan sonra, yeni bir alandaki iki alanı birleştirebilir ve ihtiyacınız olan şeyle sonuçlanırsınız.

resim açıklamasını buraya girin

Saha hesaplayıcısında:

tostring(minYEAR) + '-' + tostring(maxYEAR)

Bu yöntem , her satır için COUNTdeğer içeren ve içeren ek bir sütun döndürür 2. Min ve Maks seçenekleri bu bilgileri döndürür. Çizgiler katmanını hedef katman ve puan katmanını birleştirme katmanı olarak seçtim, doğru mu?
wiltomap

Yıl alanı sayısal mı yoksa metin mi?
radouxju

YEARAlan tamsayıdır. Yeni bir sütun oluşturmaya çalıştım to_string("YEAR")ama sonuç tamamen aynı ...
wiltomap

Emin olmak için hızlı bir test yaptım (QGIS 2.8.3) ve işe yaradı. Sayınız 2 ise, her segment için doğru 2 puanınız olduğu anlamına gelir. Ama benimle mekansal birleştirme tarafından oluşturulan yeni çizgi vektöründe MINYEAR MAXYEAR özellik değerlerine sahibim. Sizin durumunuzda neden işe yaramadığını anlamıyorum. Başka bir dosyayla deneyebilir misiniz?
radouxju

4

Topolojinin mükemmel olduğunu varsaymak, ifadesiyle bir 'WKT' alanı oluşturmak

geom_to_wkt( $geometry) 

nokta katmanınızda şu ifadeyi kullanabilirsiniz:

min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))

bir metin dizesi oluşturarak boru katmanının alan hesaplayıcısında.

  • öznitelik (özellik, öznitelik_adı) Belirtilen bir özniteliğin değerini, burada
    elde edilen nokta özelliğinin yılı olan bir özellikten döndürür .
  • get_feature (katman, öznitelik, değer), bir katmanın belirli bir öznitelik değeri ile eşleşen ilk özelliğini döndürür. Burada
    , çizginizin başlangıç ​​ve bitiş köşeleriyle aynı koordinatlara (WKT biçiminde) sahip bir nokta bulup bulamayacağımızı kontrol ediyoruz .
  • start_point (geometri) bir geometriden ilk düğümü döndürür. İşte çizginizin ilk tepe noktası.
  • end_point (geometri) bir geometriden son düğümü döndürür. İşte çizginizin son tepe noktası.
  • geom_to_wkt (geometri), geometrinin İyi Bilinen Metin (WKT) temsilini döndürür. resim açıklamasını buraya girin

Hatta şu şekilde güncelleyebilirsiniz:

CASE
WHEN attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year') = attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
THEN attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
ELSE min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))
END

aynı yıla sahip iki puan bağlıysa sadece bir yıl göstermek için (200X-200X yerine 200X kazanma).

Bu yöntemin ana avantajı, verileriniz puanlarınızda değişirse, tek bir alan hesaplayıcıyla çok hızlı bir şekilde güncelleyebilmenizdir.
Bu kuralı, yeni satırlar oluşturduğunuzda Otomatik Alan olarak da ekleyebilirsiniz .
Alkış,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.