Dallanmış çokgen şekli mi tespit ediyorsunuz?


13

Milyonlarca çokgen içeren sürekli bir kapsama sahip bir vektör katmanım var. Onları şekillerine göre sınıflandırmam gerekiyor. Zaten kompakt gibi peyzaj ekolojisi birkaç şekil dizinleri kullanıyorum ( 4piA / P ^ 2 ), ortalama genişliği ( 2A / P ), şekil numarası ( P / sqrt (A) ), ben de gördüm bu cevabı için yuvarlaklığı / kompakt hesaplanması çokgen?

Benim sorunum, tüm bu metriklerin sadece bir miktar alan ve çevre kullanmasıdır. Fraktal Boyut indeksi bile sadece alan ve çevre kullanıyor ( 2ln (0.25P) / ln (A) ). Fakat aynı alanı ve çevreyi ancak kesinlikle farklı bir şekli olan iki çokgeni nasıl ayırt edebilirim? Bu dallı çokgen A gibi:

dallı çokgen vs kavisli şerit

ki eğri şerit B ile aynı alan ve çevre ile çizmeye çalıştım. Tüm bilinen dizinlerim onlar için aynı olacak. Ancak benim için basit şeritleri (yeni ay gibi kavisli olanlar dahil) karmaşık dallı şekillerden ayırmak çok önemlidir.

Çokgen B'yi kasıtlı olarak düz bir şerit olarak değil, kavisli bir şerit olarak gösteririm, çünkü düz uzatılmış şekilleri tespit eden İlgili Çember indeksinin farkındayım, ancak çokgenlerim de aynı dairesel halkalara sahip olabilir. Convex gövdesi inşa edip Apolygon / Aconvex alanlarının bir oranını hesaplasam bile , burada çok benzer olabilir.

Peki, vektör verilerindeki dallı çokgen A'yı çokgen B'den otomatik olarak nasıl ayırt edebilirim ? (Bunları rasterlere dönüştürmek son derece küçük hücre boyutu, muazzam veri kümesi ve hafıza eksikliğini gerektirecektir, bu yüzden mümkün değildir). Diğer parametreleri içeren başka şekil indeksleri var mı? İdeal olarak, yöntem sadece açıkça dallanmış çokgenleri değil, C ve D'yi bile ayırt edecektir:

resim açıklamasını buraya girin

Benim tek fikrim dışbükey gövde oluşturmak ve daha sonra çokgeni dışbükey gövdesinden silmek ve bıraktığı (büyük) parçaların sayısını saymak (çokgeni çokgene silmek, tüm katmanı değil). Bu sınır karmaşıklığını gösterebilir.

Daha sonra Python'da uygulayacağım matematiksel çözümleri / algoritmaları memnuniyetle karşılıyorum.


1
Fazla Python'a ihtiyacınız yok. Deneyin ! şekil !. dışbükey örtü (). simetrik Fark (! şekil!) Alan hesap makinesinde. Önce küçük bir alt küme kopyasını deneyin. Doğru sözdizimi için yaylı geometri yardımına bakın.
FelixIP

Bu harika bir soru olabilir, ancak şu anda QGIS veya ArcGIS Desktop'ı sorup sormadığınızı yazıp daha sonra Python'a atmak suretiyle birden fazla soru soruyorsunuz. Neyi denediğinizi tam olarak belirledikten sonra, potansiyel cevaplayıcıların nerede sıkıştığınıza yardımcı olması daha kolaydır. İlk cevabınızı zorlamamak için QGIS'e odaklanmanızı öneririm.
PolyGeo

1
Bir şekil dosyası zaten 2 gb aştığı için Esri coğrafi veritabanında veri var. QGIS'de veya bir yerde çalışan bir çözüm varsa, bu konuda bir şeyler yapabilirim. Ama belirli bir yazılımın içinde sormuyorum. Ben bir metrik, karmaşık kenarlıklı (dallı) bir şekli matematiksel olarak tespit etmek için bir yöntem soruyorum. 1 soru. Formül içeren bilimsel makale de iyi olurdu, kendim nasıl uygulayacağımı düşüneceğim.
nadya

1
İlk düşüncem seninkiyle aynıydı, orijinali dışbükey (veya içbükey) gövdesinden çıkardıktan sonra kalan çokgenlerin sayısı ve boyutu arasındaki farklara bakıyordu (ayrıca alfa şekillerine de bakınız).
user2856

1
Sadece iskelet hesaplanacak kadar hızlı olsaydı, 4A / PL, alan, çevre, kompaktlık için en uzak iskelet düğümleri arasındaki uzunluğu hesaplamak için kullanırdım. Aynısı yazılı en büyük daire için de geçerlidir.
FelixIP

Yanıtlar:


11

Aşağıdaki yönteme bir göz atabilirsiniz: çokgenlerinizi iskeletleyin ve daha ziyade benzersiz bir kaynak çokgen kimliğiyle orijinal çokgeninizle ilgili satır türü özellikleri üzerinde çalışın. Sanırım yapacak bazı tahminler var (örneğin, bir çoklu çizgiyi gerçek bir merkez çizgisi olarak ne zaman değerlendirmeliyiz: bir çoklu çizginin merkez çizgisi durumuna uygun olması için minimum uzunluk). Tek bir kaynak çokgen için merkez hattı sayısı 1'den fazla olduğunda, dallanır.

Dallanmış bir poligon, bir merkez çizgiye kadar temizlendiğinde, birden fazla çizgiye sahip olurken, düz bir çokgenin merkezde sadece bir büyük çizgiye sahip olabilir (aslında insan yorumuyla aynıdır).

Misal :

  • Y harfi çizdiğinizde, en az 2 sürekli kontur (= 2 çoklu çizgi) kullanırsınız, bu nedenle dallanır çünkü minimum kontur sayısı> 1'dir.
  • L harfi çizdiğinizde, en az 1 sürekli kontur kullanırsınız. Dallı değil.

Bu mantığa daha fazla örnek:

  • Bir A: 2 vuruş çizdiğinizde = dallanır
  • B: 3 vuruş yaptığınızda = dallanır
  • C: 1 konturu çizdiğinizde = dallı değil
  • vb

Hiçbir şey denemedim, sadece mantığı denedim, ama işe yarayacağını düşünüyorum.

Bakınız: Vektörleri QGIS / Python veya http://postgis.net/docs/ST_StraightSkeleton.html içinde iskeletize edin

Veya

Misal

Kaynak: PostGIS / Python'da bir Karmaşık Çokgenin merkez hattını çıkarma

EDIT: C & D vakaları için, zaten filtrelenmiş B şekillerine (dallanmamış) sahip olmanız gerekir.

  • Benzersiz bir kimliğin, merkez çizgisini ve kaynak çokgeni bağladığından emin olun.
  • Çokgenlerinizi çoklu çizgilere dönüştürün
  • Merkez çizgisi çoklu çizgisini ve kenar çizgisi çoklu çizgisini düzenli noktalarla yoğunlaştırın (daha sonra bellek problemlerinden kaçınmak için çok fazla değil, düzensiz bitleri "yakalamak" için yeterli.
  • Merkez çizgisinin noktaları ile sınır çizgisinin noktaları arasında bir mesafe matrisi oluşturun
  • Matris satırlarında yalnızca ID_centerline = ID_borderline olanları saklayın
  • Standart sapma değerine sahip olmak için istatistikler oluşturun
  • Yüksek SD değerleri için normal bir kontur olmadığını belirtmek için bir bağlı değer ayarlayın ve her bir benzersiz kimlik için gerekli göstergeyi oluşturun
  • Benzersiz kimliğin tabanındaki alana katılarak göstergeyi orijinal çokgene geri getirin.

Fikir için teşekkürler, merkez
çizgileri

Sadece, C ve D poligonlarımın ayırt edilmesi sorunu devam edecek
nadya

Farklı durumlar için farklı yöntemlere ihtiyaç duyabilir ve işi bölebilirsiniz. Bir kez dallı olmayan çokgenler (B) varsa, C ve D'yi denemek ve bulmak için B'yi geliştirebilirsiniz. Sorun, C'yi D'den ayırmak için hangi mantığı kullandığınızı görmemenizdir. kriterleri.
gisnside

1
C ve D arasındaki fark, C'de, çokgenin kenarlarının merkez çizgisinden yaklaşık olarak muntazam bir mesafe, D'de kenarların merkez çizgisinden muntazam olmayan bir mesafe olduğu görülmektedir.
csk

1
@csk Bunu görüyorum. Sanırım koda çevirmek, merkez çizgisi ve sınır çizgisi arasındaki mesafedeki istatistikleri hesaplamak olacaktır. Sınır çoklu çizgisini daha fazla nokta ile yoğunlaştırarak bu sınırı noktalara dönüştürerek + merkez çizgisindeki eşdeğer işe mesafe bırakarak bu davranış hakkında istatistikler verirsiniz. Standart sapma yüksekse, muhtemelen şekil düzensiz olacaktır. Bunu binlerce poligon üzerinde nasıl yapacağımı görmek zor ... orada güzel bir meydan okuma
gisnside
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.