Benzer satırları karşılaştırın ve katmanları güncelleyin


16

Burada sokakların temsili iki katman var ve fikir şu: En son katmanı (kırmızı çizgi ile) diğerinde depolanan bazı verilerle (açık mavi) güncellemek istiyoruz, ancak bu katmanlar Coğrafi konumdaki benzer, haritadaki yere bağlı olarak çok yakın ve biraz daha uzak olabilir ve bir çizginin diğerinde aynı olması durumunda yalnızca bir özellik eşleşir (codlog x codlog5).

Qgis katmanları.

Örneğin: Görüntünün ortasında, her iki katmanda da bir kare var, ancak haritadaki mavi olanın yeşil olanla aynı olduğunu ve son katmanı güncellediğini nasıl anlarım?

Nasıl yapabilirim? Bu konuda yardımcı olan herhangi bir eklenti veya araç var mı?


Kırmızı katmanı mavi katmandan veya mavi katmandan ek özelliklerle mi güncellemek istiyorsunuz?
dmh126

Öznitelikler. Durum: Kırmızı katman (a, b, c, d) sütunlarını ve mavi katman (d, e, f) sütunlarını içerir. Kırmızı katmana diğer katmandan sütunları (e, f) ve eşleşen sonuçlarını eklemek istiyorum.
Jhonatan Oliveira

Bir konflasyon eklentisi için bazı belgeler var . Geliştirmenin tamamlanıp tamamlanmadığından emin değilim.
Barbarossa

1
Jump'ı denedin mi?
radouxju

Ama blu çizgisinin "d" sütunu ve kırmızı olanın "d" sütunu benzersiz bir ortak kimlik mi? Ne içeriyorlar?
Sergio

Yanıtlar:


6

Bu harika bir soru, son zamanlarda benzer bir şey yapmak zorunda kaldım ama çok daha küçük bir veri kümesi ile, bu yüzden bazı ekstra görsel kalite kontrol ile basit bir kavşak kullanabildim ve iyiydi.

Ama işte bunun için bir fikrim var, kodum olmasa da, bu biraz ağır bir süreç. Kesinlikle önce tam veri kümesinden bir örnekle test edin. Muhtemelen buralarda bazı yararlı kodlar olabilir. (Girinti aşağıda biraz garipleşti.):

  1. iyi bir geometri setini alın (niteliklerin bitmesini istediğiniz yerde) ve bir tampon oluşturun *

  2. arabellek özelliklerinin her birini yineleyin:

    2a. özelliğin genel yönünü hesaplayın (max_y - min_y / max_x - min_x veya bunun gibi bir şey)

    2b. bu tek özelliği kullanarak diğer katmanda konum sorgusuna göre seçim yap

    1. konum sorgusuna göre seç ile eşleşen birden fazla özelliğe sahip olacaksınız, bu nedenle bu seçilen özellikleri tekrarlayın ve her birinin yönünü hesaplayın

    2. bu özelliğin tampon özelliğe en yakın yönelime sahip olduğu özelliklerden alın.

* Çok küçük bir mesafe (bir harita birimi ya da bir şey) ile başlayıp daha sonra daha önce aktardığınız özelliklerin üzerine yazmamaya dikkat ederek artan mesafelerle bu işlemi çalıştırırdım.

** Aslında arabellek özelliklerini oluşturmayı bırakabilir ve sadece arabellek mesafesi ile konum sorgusuna göre seçim yapabilirsiniz. QGIS'e pek aşina değilim, ama eminim bunu yapabilirsiniz.

Bunun tüm özellikleriniz için mükemmel bir şekilde çalışmasının bir yolu yoktur, ancak bu bir başlangıçtır ve daha sonra aktarımı kontrol etmek ve tamamlamak için iyi bir KG / KK stratejisi geliştirmeye gelir.

DÜZENLEME Bunun hakkında daha fazla düşünmek, çok küçük bir tampon mesafesiyle başlayıp önerdiğim gibi en iyi eşleşmeye sahip özelliği seçmeniz durumunda sistemi tamamen kıracak temel bir örnek:

resim açıklamasını buraya girin

Yanlış kırmızı çizgiden öznitelikler alınacaktı. Bundan kaçınmak için, bir tür tolerans oluşturmak isteyebilirsiniz ve yalnızca özelliklerinin yönü (orijinal mavi özelliğin yönüne kıyasla) bu toleransın içine düşerse.

EDIT 2 Hata! Bu çokgenler mi? Sanırım gri bir arka plan üzerinde çizgiler olduklarını varsaydım. Çokgenlerlerse, bu yönelim kavramının iyi olup olmadığını gerçekten bilmiyorum. Ancak, kesişen tüm özellikleri seçebilir ve en çok çakışma olanı anlayabilirsiniz (Birlik tipi bir araç çalıştırın ve daha sonra en büyük alana sahip çokgeni kullanın ...).


Bu mantık sağlam. C # / ArcObjects öznitelikleri ile yanlış bir veri kümesinden öznitelikleri öznitelikleri olmayan doğru bir veri kümesine kopyalamak için benzer bir yaklaşım kullandım ...% 95 doğru. Sıkı alanlarda manuel kontrol / sabitleme gerekliydi, ancak hepsini manuel yapmaktan kesinlikle daha hızlıydı.
Michael Stimson

2

Kırmızı katmandan mavi katmana bazı öznitelikler eklemek istiyorsanız ve her iki katmanda da bir öznitelik yaygınsa, Vektör Birleştirme Ekle seçeneğini kullanmanız gerekir .

Burada bunun hakkında yazdım .

  1. Katman Panelinde kırmızı şekil dosyası katmanınıza sağ tıklayın ve Özellikler'i seçin .
  2. Ardından Katılımlar sekmesine gidin.
  3. Basın + düğmesine, yeni katılmak yaratacak.
  4. Birleştirme katmanı kırmızı şekil dosyası katmanınızdır. Birleştirme alanı, her ikisinde de ortak değerlere sahip alandır. Hedef alan, mavi katmandan katılmak istediğiniz alanınızdır.
  5. Bundan sonra şekil dosyaları tablonuzda yeni bir özellik alacaksınız.

Bu kadar.

Burada ekran görüntülerine sahip bir örnek var.


1

Onun yöntemi red_line katmanı oldukça kolay güncellenmesine izin verdiği için @ dmh126'dan gelen cevabı çok tercih ederim .

Sadece bir alternatif eklemek için , İşleme Araç Kutusu'ndan Nitelikleri birleştir tablo aracını kullanabilir ve ortak alanla katmanlarınızı seçebilirsiniz. Bu yöntemin var olanı güncellemek yerine yeni bir şekil dosyası oluşturduğunu unutmayın :

Nitelikler tablosuna katıl


0

Her iki katmanda da değerleri eski katmandan yeni katmana kolayca birleştirmek için kullanabileceğiniz benzersiz bir kimliğiniz varsa, çok kolay. Ancak bu durum böyle görünmüyor.

Değilse, oldukça zor bir sorundur. Acaba neden OpenJUMP ve eklentiyi kullanmayı öneren user30184'ten gelen yorum http://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcher neden cevap olarak gönderilmedi, çünkü bu durumda bana tamamen yasal geliyor.

Aksi takdirde bunu kodlamadan yapabileceğinizi sanmıyorum. QGIS ile düzgün bir şekilde kullanabilirsiniz ve tamponlama ile kesişmeyi birleştirirken bazı önemli otomatik kontroller yapabilmeniz gerekir.

Bir yaklaşım, makul derecede büyük kırmızı çizgiler tamponunu mavi çizgilerle karşılaştırmak ve eşleşen nitelikleri almak ve eşleştirilme oranını elde etmek olabilir. Sözde kodda:

for r_line in red_lines:
  r_line_buf = r_line.buffer()
  intersecting_b_lines = []
  for b_line in blue_lines:
    if r_line_buf.intersects(b_line):
      intersect_length = calculateIntersectionLength(r_line_buf,b_line)
      b_line_values = getAttributes(b_line)
      intersecting_b_lines.append((b_line_values,intersect_length))
  b_line_best_fit = findLongestLineWithinIntersected(intersecting_b_lines)
  r_line_length = r_line.length
  b_vs_r_line_ratio = compareLength(r_line_length,b_line_best_fit)
  saveToNewColumns(r_line, b_line_best_fit.Atribute1, b_line_best_fit.Atribute2..., b_vs_r_line_ratio)
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.