Yinelenen geometrileri bulmak için CBS analizi


9

Çalıştığım şehrin tüm binalarını ve evlerini içeren büyük bir şekil dosyam var (yaklaşık 90.000 özellik). Binaların / evlerin verileri, kasabanın ölçme mühendisleri tarafından kaydedilir ve kötü uygulama ve farklı sörveyörlerin bu verilere erişimi nedeniyle, birçok bina / ev iki kez kaydedilir ve haritada kopya olarak gösterilir.

Bazıları tam olarak çoğaltılır (diğerinin üzerinde görünür), diğerleri iki nesne arasında bir boşlukla çoğaltılır (bir nesne diğerinin içindeyse - ekli ekran görüntüsüne bakın).

resim açıklamasını buraya girin

Bu verileri temizlemek istiyorum, böylece kasabada sadece doğru binalara / evlere sahibim, bu yüzden sorum şu:

Tüm çoğaltılmış özellikleri (hem kesin olanları hem de başkalarının içinde bulunanları) bulmak için çalıştırabileceğim herhangi bir CBS analizi veya SQL ifadesi var mı? Hem ArcGIS hem de QGIS var, bu yüzden tüm önerilerinize açığım.


Özdeş Aracı Sil aracını keşfetmeyi deneyebilirsiniz . Ancak, kurumsal lisans düzeyi gerektirir. Sen de kullanılabilir başka seçenekler de inceleyebilirsiniz Teknik maddesinde 36031 mu ArcGIS tanımlamak için bir yol sağlar veya yinelenen kaldır geometriye sahip bulunmaktadır en iyi bahis Veri Yorumcu extenstion . bu araçların hiçbiri bölünmüş geometrilerinize
değinmeyecektir

Ayrıca, sekmeli bileşenlerin aynı silme aracında karşılaştırılmayacağını da dikkate almanız gerekir. Bunun bir cevap olmadığını biliyorum ama umarım problem çözmede yardımcı olur.
MDHald

Veri bir veritabanında mı? Hangi tür?
Russell, ISC'de

Seçeneklerden biri , çakışma yerlerinin çıktısını alabilecek ArcMap'teki Kesişim Aracını ( bu cevapta açıklandığı gibi) kullanıyor olabilir . Bu, hangi poligonun silineceğini manuel olarak kontrol etmeyi ve karar vermeyi gerektirir, ancak kesin olmayan kopyalar durumunda, bunu yine de yapmanız gerektiğini düşünüyorum.
Erica

4
'Yinelenen' teriminin kullanımı bu soruda biraz yanıltıcıdır. Kesin, özdeş, yığılmış kopyalar söz konusu olduğunda, evet, bunlar kopyalardır (veya olabilir - öznitelikler değişebilir) ve diğerleri önerdiği gibi, bu Lisans düzeyine sahipseniz, Aynı veya Sil aracını kullan. Ama eğer hiç kaybolmuşlarsa ya da farklı bir şekilse, aslında kendileri kopyaları değildir. Gelişmiş lisansınız varsa, Çakışma Olmaması gereken denetimini çalıştırarak bir coğrafi veritabanı topolojisine bakarım. Gelişmiş olmadan, Luigi'nin cevabının önerdiği gibi QGIS ve bir eklenti için de aynı şey yapılabilir.
Chris W

Yanıtlar:


4

QGIS, Topology Checker eklentisi probleminizi problemli bir şekilde çözebilir


3
Bir topolojinin muhtemelen verileri temizleme sorununa en iyi tek çözüm olduğunu kabul ediyorum. Ancak, eklentiye bir bağlantı ve topolojinin ne olduğunu veya ne yaptığını ve hangi kontrolü çalıştıracağınızı kısaca açıklayarak cevabınızı biraz genişletmek isteyebilirsiniz. Yazdığınız cevabın düşük kalite olarak işaretlenmesinden korkuyorum.
Chris W

ok: eklentinin açıklaması burada: docs.qgis.org/2.2/en/docs/user_manual/plugins/… ve "üst üste gelmemeli " sorunu çözebilir. Eklentinin video kılavuzu burada: youtube.com/watch?v=huhkTZkoKC8 .
Luigi Pirelli

6

Python'un itertools'unu ve bir SearchCursor'ı , aradığınız mekansal ilişkileri bulmanın çok etkili bir yolu için kullanırdım. Sen dahil edebilirsiniz geometri yöntemlerini overlaps , containsve equalgeometri özelliklerine ulaşmak için.

  1. İş akışını daha iyi organize etmek ve tekrarlanabilirlik için bir işlev oluşturarak işe başlayın

    def findOverlaps(x):

  2. Bireysel özellik geometrisi üzerinde döngü yapmak için bir arama imleci açın

    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:

  3. itertools.combinations()giriş yinelemeli elemanların alt dizilerini döndürmek için kullanıncur

    for feature1,feature2 in itertools.combinations(cur, 2):

  4. Aşağıdaki yöntemlerle geometri özellikleri giriş equals(), overlaps()ve contains(). Bunlar mantıklı bir sırada kurulur - gerekirse belirli hedeflerinize ulaşmak için bunu düzenleyebilirsiniz.

        if feature1[1].equals(feature2[1]):
            print "{} equals {}".format(feature1[0],feature2[0])
        if feature1[1].overlaps(feature2[1]):
            print "{} overlaps {}".format(feature1[0],feature2[0])
        if feature1[1].contains(feature2[1]):
            print "{} contains {}".format(feature1[0],feature2[0])
    
  5. Çalıştır ...

enter code herefindOverlaps (fc)


import itertools, arcpy

fc = r'C:\path\to\your\fc'

def findOverlaps(x):
    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
        for feature1,feature2 in itertools.combinations(cur, 2):
            if feature1[1].equals(feature2[1]):
                print "{} equals {}".format(feature1[0],feature2[0])
            if feature1[1].overlaps(feature2[1]):
                print "{} overlaps {}".format(feature1[0],feature2[0])
            if feature1[1].contains(feature2[1]):
                print "{} contains {}".format(feature1[0],feature2[0])

findOverlaps(fc)

resim açıklamasını buraya girin

Ekran görüntüsü örtüşen, örtüşen ve özdeş ve benzersiz çeşitli özellikler gösterir.

resim açıklamasını buraya girin


2

Senin için neyin işe yarayabileceği hakkında bir fikrim var. Bazı varsayımlara dayanacaktır, ancak olası özdeş özellikler listenizin daraltılmasına yardımcı olacaktır. Bu otomatik bir işlem olmaz, ancak kopyalara manuel olarak bakılması gerekir. Yorumlara dayanarak, otomatik araçlar özellikleri karşılaştırmaz, bu yüzden özellikleri yanlışlıkla silmemenize yardımcı olur.

ArcMap Kullanımı

(1) İşlerin yanlış gitmesi durumunda şekil dosyanızın bir kopyasını oluşturun.

(2) Şekil dosyasına çift olarak bir sütun ekleyin.

(3) Yapabileceğiniz en açıklayıcı (en kesin) biçimi kullanarak her özellik için alan hesaplayın. Yuvarlamanın bir sorun olmayabileceği bir şey.

(4) Bu sütunda bir özet (özetle) çalıştırın. Özetle benzersiz bir tanımlayıcı seçtiğinizden ve hem önce hem de son olarak işaretlediğinizden emin olun.

(5) Çıktı tablonuzda, sayım alanının 1'den yüksek olduğu kayıtları arayın .

(6a) Özellikleri manuel olarak kontrol edin ve tekrarlayana kadar işlemi tekrarlayın.

(6b) Bu benzersiz kimliklerin bir listesini oluşturabilir ve özellikleri arcpy ile silebilirsiniz, ancak aynı alanda muhtemelen iki kimliği olmayan özelliğe sahip olma şansınız vardır.

ArcPy Kullanan Başka Bir Teknik

Yukarıdaki yanıtı oluştururken, bu verilerin birden çok yazarının bir şekilde çoğaltılmış özellikler için aynı benzersiz tanımlayıcıları kullanma olasılığını düşündüm. EĞER Eğer durum, sen arcpy içinde döngü aracılığıyla çiftleri bulmak mümkün olabilir.

Bunu ArcPy kullanarak yapmayı düşündüğüm, sisteminize vergilendirmek ve biraz zaman alabilir.

(1) Şekil dosyanızın bir kopyasını oluşturun (tekrar olması durumunda)

(2) Kopyaları belirtmek için yeni bir sütun ekleyin. 'Y' veya 'n' veya 0 veya 1 gibi bir şey veya işe yarayacak herhangi bir şey.

(3) Benzersiz tanımlayıcıyı saklamak için python'da bir liste oluşturun.

(4) Bir Güncelleme İmleci ( arcpy.UpdateCursor('LAYERNAME')) çalıştırın . Her kayıt için, bu tanımlayıcıyı içerip içermediğini görmek için listenizi kontrol edin ve varsa sütununuzu kopyalar için işaretleyin.

myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
  if str(row.UniqueIdentifier) in myList:
    #value duplicated
    row.DuplicateColumnName = "y"
  else:
    #not there, add it
    myList.append(row.UniqueIdentifier)
  rows.updateRow(row)

(5) Ardından, işaretli sütunlarla istediğinizi karşılaştırabilir veya yapabilirsiniz.

Muhtemelen bu karşılaştırmaları yapmanın daha iyi yolları vardır, ancak bunlar işe ya da en azından başlamanız gerektiğine inandığım iki.

Düzenle

Elrobis'in yorumuna dayanarak, yanlış özellikleri kaldırma şansını daha da azaltmak için minimum sınırlayıcı dikdörtgeni kullanabilirsiniz.

ArcMap'i kullanarak Veri Yönetimi'nde Minimum Sınırlayıcı Geometri aracını çalıştırabilirsiniz . Seçenekleri kontrol ettikten sonra, CONVEX_HULL seçeneğini kullanmak muhtemelen en iyi olacağını düşünüyorum .

Eğer karşılaştırırsanız MBG_APodX / Y1 , MBG_APod_X / Y2 birlikte alanlarını MBG_Orientation çiftleri için, çoğaltılmış özellikleri bir fikir edinmek mümkün olmalıdır. Karşılaştırmak için yukarıda tarif ettiğim Özetle yöntemini kullanmanızı öneririm . Yinelenenleri bulmak için sınırlayıcı dikdörtgenin köşelerinden (koordinatlar) birini seçin. Birkaç tesadüfi 'eşleşme' elde edebilirsiniz, ancak diğer köşeleri artı yönlendirmeyi ekledikten sonra, sonuç özelliklerinin yinelenmesi oldukça güvenli bir bahis olacaktır.

Kullanmasam da ve bu araçtaki sonuçlardan tam olarak emin olmasam da, ArcMap'te Özet İstatistikler aracını kullandıysanız ortaya çıkan şekil dosyasını daha kolay inceleyebilirsiniz . Görünüşe göre, tek sütun seçeneğim yerine birden çok sütunu bu şekilde özetleyebilirsiniz.

Yinelenmeyen bir özelliği silme olasılığından endişe etmeden bunu yapmanın tamamen otomatik bir yolu olacağını sanmıyorum. Bu yöntemler, manuel olarak gözden geçirmeniz gereken özellik sayısını sınırlamaya yardımcı olmalıdır.


Bunların çokgenler olduğunu varsayıyorum. Çizgiler ise uzunluk kullanabilirsiniz. Noktalar X / Y koordinatları ile en kolaydır.
Branco

2
Ben de "eşit alan özellikleri" hakkında düşündüm, ama bldg ayak izleri istenmeyen kibrit oluşturmak için aynı tür şekiller yeterli olabilir bana çarpıcı. Özelliklerin MBR kesişimi ile işleri daha da hassaslaştırmak için olasılıkları artıracağını düşünüyorum. Yani, aynı alana sahiplerse (ve aynı özellik olabilirse) ve MBR'leri kesişirse, muhtemelen aynı özelliğin iki neslidir. bu mantıklı mı?
elrobis

2

Bunu SQL'de bir uzamsal kendi kendine birleştirme kullanarak yapabilirsiniz. Hangi SQL lehçesini kullandığınızı belirtmezsiniz, bu nedenle bu örnek Postgres / Postgis kullanır, ancak Oracle veya SQL Server'a kolayca uyarlanabilir. Geom adlı bir sütunda geometri depolanmış olarak binalar denilen bir tablo varsayarsak:

SELECT a.id, b.id from buildings a, buildings b WHERE 
  ST_INTERSECTS(a.geom, b.geom) AND a.id < b.id;

Bu kesişimleri bulacaktır. Toplam eşitlik istiyorsanız ST_Intersects yerine ST_Equals kullanın. Veya ikisini birleştirin:

SELECT a.id, b.id from buildings a, buildings b WHERE 
   (ST_INTERSECTS(a.geom, b.geom) OR ST_EQUALS(a.geom, b.geom)) 
   AND a.id < b.id;

A.id <b.id, kendi kendine katılmadaki vakaların yalnızca yarısını düşündüğünüz anlamına gelir, bu da a) daha hızlı yapar ve b) çakışan çokgenlerin yarısını hepsini silmeden silmek için kullanabileceğiniz bir liste verir. . Açıkçası, bu hala bir O (n²) algoritmasıdır, ancak uygulamada, uzamsal bir dizininiz varsa çok daha hızlı olacaktır - bu, önemsiz olmayan herhangi bir veri kümesi için gerçekten toplam bir gereksinimdir.

Üst üste binmenin bazı tanımlarına uyacak şekilde biraz masaj yapmanız gerekebilir - kötü araştırılan komşu evleri silmek istemezsiniz.


Şekil dosyasında benzersiz bir özellik eksikse, a.rowidyerine kullanabilirsiniz a.id. rowidSQLite içinde size veri kümesinin iç kimliğini verecek bir anahtar kelimedir.
LuWi

1

Topology Checker eklentisi doğru kullanılırsa iyi bir araçtır. Verileriniz hakkında temel bilgilere sahip olmanız ve 'düzeltmeleri' manuel olarak yapmanız gerekir. Eklenti hata olduğunu düşündüklerini vurgulayacaktır. Daha sonra her birini incelemek ve siz ve verileriniz için uygun kararı vermek size kalmıştır. Katmanınızdaki 90.000 öğe ile Noel'de evde olabilirsiniz!

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.