PostGIS poligon geometrisi ile ilgili yardım - kapalı olmayan halkalar


10

Erik Westra'nın ( Amazon link ) süper kötü 'Python Geospatial Development' kitabının bir kopyasını aldım ve üzerinde çalışıyorum. Şu anda bana, coğrafi bir web uygulaması oluşturmaya hazırlanırken GSHHS kıyı şeridi verilerini bir şekil dosyasından PostGIS veritabanına yüklemeyi öğretiyor.

Benim sorunum şu: GSHHS verilerini PostGIS'e aktarmaya çalıştığımda, kıyı şeridi çokgenlerinin 'geçerli' olarak kabul edilmemesi nedeniyle reddediliyor. Özellikle, kıyı şeridi çokgenlerinin bazılarını (ancak hepsini değil) 'kapalı halkalar' olarak tanımlayan bir hata mesajı alıyorum.

Bu hatanın bana çokgenin ilk ve son noktalarının aynı olmadığını söylemeye çalıştığını anlıyorum. Ancak, bu doğru değildir. Çokgenlerin çoğunun WKT temsilini inceledim ve doğrular. Onlar kesinlikle başlayacak ve aynı koordinata ile sona erer.

Çokgenler OGR kütüphanesi kullanılarak şekil dosyalarından çıkarılır ve her çokgen özelliği WKT'ye aktarılır. Shapely aracılığıyla çokgeni yeniden oluşturmayı denedim ve WKB ile denedim, ancak boşuna. I olan shp2pgsql yükleyiciyi kullanarak, bir MultiPolygon tablo olarak PostGIS içine aynı veri yüklemek mümkün.

Orada birisinin olup olmadığını merak ediyordum:
(a) belki de aynı kitabı kullandı, aynı soruna saplandı ve benim için bir cevabı var mı?
(b) benzer bir sorunla karşılaştı ve bir çözüm buldu mu?
(c) başarısız olursa, PostGIS'e yüklemeden önce geçerli geometriyi sağlamak için bazı 'en iyi uygulama' tavsiyeleri var mı?

GÜNCELLEME: bir meslektaş 'kapalı halkalar' probleminin sadece başka bir problemin belirtisi olabileceğini ileri sürdü. PostGIS / PostgreSQL yapılandırmamın boyut sınırları olması mümkündür (ekleme işlemlerinde, alınan paketlerde, metin dizelerinde vb.).

Giriş olarak çok uzun WKT çokgenleri kullandığım için, PostGIS her çokgenin tamamlanmasına izin vermek için onları çok erken kesiyor olabilir. Yarın test edeceğim, ama kulağa muhtemelen gelebilir. Ülke sınırlarını eklemem yalnızca bazı kayıtları kabul ediyordu, diğerlerini kabul etmiyordu. Bellekten, kabul edilen geometriler Antigua gibi küçük ada ülkeleri içindi (ve muhtemelen kısa WKT temsilleri vardı).

Böylece bu geçersiz bir geometri iş parçacığı yerine bir PostGIS veritabanı yönetim iş parçacığı olabilir.


örnek bir shp dosyası sağlayabilir?
Mario Miler

Endişelenmeyin. Kullandığım GSHHS kıyı şeridi verileri buradan 96mb . Ben kullanıyorum Dünya sınır verileri Dünya Sınırlar Veri kümesi ise thematicmapping.org
Timmy

Yanıtlar:


6

Verilerinize ve kitap örneğine baktım, sorun kitapta işlenen verilerde üç geçersiz çokgen olması:

GSHHS_l_L1.shp

ID = 92-W

POLYGON ((-180.0 71.514793999999995,-179.69008299999999 71.577888999999999,-178.648889 71.577416999999997,-178.40644399999999 71.549916999999994,-177.406306 71.244167000000004,-177.877444 71.022889000000006,-179.500111 70.863749999999996,-179.93011100000001 70.979583000000005,-180.0 70.962072000000006))

ID = 486-W

POLYGON ((-180.0 -16.799126,-179.84419399999999 -16.691278,-179.80041700000001 -16.789193999999998,-179.850472 -16.878361000000002,-180.0 -16.959561))

GSHHS_l_L2.shp

ID = 7333-W

POLYGON ((-180.0 65.393473,-179.76583299999999 65.428332999999995,-179.95416700000001 65.385555999999994,-179.90972199999999 65.316389,-180.0 65.321635))

Bu bir örnek olduğundan, bu çokgenleri veri kümesinden silmek veya kodunuzda bir if ifadesi eklemek en kolayı olacaktır

if geometry.IsValid():
       cursor.execute("INSERT INTO gshhs (level, geom) VALUES (%s, ST_GeomFromText(%s, 4326))", (level, wkt))

Teşekkürler Mario, görünüşe göre TÜM girdi çokgenlerimi doğru bir şekilde doğrulamak yerine kendimin önünden geçiyordum. Cevabınız doğruydu - bu çokgenler OGR ile test edildiğinde geçersiz olarak ortaya çıktı. İlginç bir şekilde, QGis'de iyi görünüyordu, ancak ArcMap onları tam bir halkadan yoksun olarak gösterdi. Bu üç çokgenin hepsi dateline düştü ve sanırım şekil dosyası geometrisi datelin boyunca çokgen kenarını saymadı. Çözümünüz geçersiz çokgenleri tespit etmenin güzel ve kolay bir yoludur. Gönderiyi yanıt olarak işaretleyeceğim.
timmy

Yardımsever hissediyorsanız, işlemdeki bir sonraki adım için geçersiz çokgenleri düzelten iyi çözümleriniz var mı? OGR's .CloseRing () işlevini kullanarak denedim, ama boşuna. Ben sadece fonksiyon çağrısını görmezden geldi.
timmy

"Buffer trick" ( workshophops.opengeo.org/postgis-intro/validity.html ) biçimini düzgün ve başarılı ama başarılı olamadım. Düzgün geçersiz çokgen okuma ve ogr tampon işlemi yapmayacağım, şu anda neden bilmiyorum. Eğer cevapta yanılırsam, size bildiririm. Belki başka biri bu problemle daha başarılıdır. Afedersiniz.
Mario Miler

Sanırım çokgen doğrulamam şimdi çalışıyor. Bence OGR'nin .CloseRings () işlevini yanlış şekilde kullanıyordum. Çokgen (yani poly.CloseRings ()) yöntemi olarak çağrıldım. Bunun yerine, Doğrusal Halkayı poligondan ayıklamak ve sonra bunu çalıştırmak zorunda kaldım (yani lr = poly.GetGeometryRef (0); lr.CloseRings ()). Sonuçlar PostGIS'e başarıyla ekleniyor ve QGis'deki 3 problemli çokgenleri endişe duymadan kullanabiliyorum. HER poligonun geçerliliğini kontrol etmede sadece bir hesaplama maliyeti vardır.
timmy
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.