Karmaşık bir şekil dosyasını bir ızgaraya bölme


11

Ben çokgen / çokgen özellikleri ile (dosya yaklaşık 500mb) terbiyeli detaylı bir shapefile var. Aslında sahil şeridini temsil eden özellikleri ile tüm dünyanın bir şekil dosyası. Bir ızgara kullanarak bu verileri bölmek gerekir. Açık olmak gerekirse, verileri 'sıralamak' istemiyorum, ama aslında çokgenleri fayanslara ayırıyorum. Bu sorunun daha önce sorulduğunu fark ettim ama bulduğum çözümler benim için işe yaramadı.

Denedim:

  • QGIS kullanma ve şekil dosyası içeriğimi bir vektör ızgarasıyla kesişme - sonuçlar korkunç. Büyük kara kütlelerinin çoğu sihirli bir şekilde kayboluyor, ancak daha küçük toprak parçaları bazen bunu yapıyor gibi görünüyor. Bu yöntemin çok daha basit verilerle (yani daha az puan) gerçekten iyi çalıştığını belirtmeliyim.

  • OGR'nin Kesişim araçlarını kullanma. Hem ogr2ogr aracılığıyla hem de kendi C ++ aracımı yuvarlayarak denedim. Her ikisi de QGIS ile aynı probleme sahiptir. Ayrıca basit dosyalar için bu sorunu sergilemezler, ancak daha karmaşık olanları başarısız olurlar. Referans olarak, Avustralya ve Yeni Zelanda'nın 20mb'nin altında bir şekil dosyası kullanıyorum ve hem QGIS hem de OGR bunu 'gridize edemiyor'.

Birisi bir noktada bir kavşak fonksiyonuna sahip olduğu için PostGIS kullanılmasını önerdi - ancak PostGIS'in ST_Intersect'i OGR ile aynı GEOS arka ucunu kullanıyor. Aslında ikisi de söyleyebildiğim kadarıyla aynı işlevi çağırıyor, bu yüzden PostGIS'in farklı sonuçlar vereceğini düşünmüyorum.

Başka ne denemek için öneriler arıyordum. Son derece ayrıntılı şekil dosyalarını döşemelere ayırabilecek sağlam bir uygulamaya veya araç setine ihtiyacım var.

DÜZENLEME: Daha fazla bilgi ekleme

Simbamangu'ya yanıt olarak:

  • Şekil dosyası temel olarak OpenStreetMap'in sahil şerididir. Bu onların dev listesini e-posta yoluyla aldım 'işlenmiş_p' dosyasının (böylece onun fayans bölünmüş değil) birleştirilmiş bir sürümüdür. Karoları bölmelerinin (örtüşme ile 100km x 100km parçalarına) mutlaka istediğim şey olmadığını unutmayın - örtüşme istemiyorum ve ızgara boyutunu seçme özgürlüğünü istiyorum, ya da sadece varsayılan işleme_p.

  • Varsayılan olarak, sahil şeridi verilerinde QGIS tarafından bildirilen geometri hataları vardır. Bu hataları özellikle bu sorunu gidermek için tasarlanmış bulduğum bazı kodları kullanarak küçük bir araçla düzeltirim (kıyı şeridi verilerindeki geometri hatalarını onarma: https://github.com/tudelft-gist/prepair ). Bu araçla dosyaların üzerinde çalışmak, QGIS'in aldığı tüm hataları düzeltir. Kavşağı yalnızca dosyaları temizledikten sonra yapmaya çalışıyorum.

  • QGIS kullanarak yaptığım tam olarak: QGIS'de iyi göründüğünden emin olmak için verileri açın. Belirtilen aralıklarla Vector Grid'i kullanarak bir fayans katmanı oluşturarak ve daha sonra iki katmanı kesişerek - fayanslara bölmeyi deneyin. Daha küçük bir veri kümesi kullanmayı deneyin - daha küçük bir veri kümesi denemek için Okyanusya'daki özellikleri seçin (Aus, NZ) - bu şekil dosyasının boyutu <20mb'dir. Tekrar bölmeyi deneyin, çalışmıyor.

  • OGR ile ne yaptım: ogr2ogr doğrudan spat_extent ile '-spat' ve '-clipsrc' seçeneklerini kullanarak. Ayrıca WKT üzerinde çalışan küçük bir C ++ aracı yazdım, bu yüzden ogr2ogr kullanarak şekil dosyasını WKT'ye dönüştürdüm, sonra metin dosyasını uygulamama besliyorum. Dosya üzerinden çalışır ve burada belgelenen Intersection () yöntemini çağırır: http://www.gdal.org/ogr/classOGRGeometry.html . Ben doğrudan ogr2ogr kullanarak tam olarak aynı şeyi yapıyor düşünüyorum.

Brent'e yanıt olarak:

  1. Öyle. Her şey WGS84 Lat / Lon'da
  2. Tersinin doğru olduğunu düşünürdüm - belirli bir ızgara karoları seti için, her bir karoya daha uzamsal olarak yerelleştirilebilen bir grup parçalı özellik yerine bir dev çokgenle kesişmenin daha uzun süreceğini, ancak bu ilginç bir öneri - deneyeceğim ve rapor vereceğim.
  3. İşlem sırasında hiçbir öznitelik alanı tutulmaz, sadece geometriyle ilgileniyorum.
  4. Emin değilim, ama sanırım belirli bir ızgara döşemesinin üst üste binen çokgenleri seçmeli ve sonra kesişim yapmalıyım. Bu, QGIS ile manuel olarak çok hantaldır. Aracım bunu zaten bir sınırlama kutusu denetimi ile belirli bir ölçüde yapıyor. Biraz hızlanma var, ancak sonuç hala zayıf ve fark edilir derecede farklı değil.
  5. Bu bir seçenek değil. Şu anda, verileri 1 derece lat x 1 derece lon olacak şekilde bölmeye çalışıyorum ve tüm vakalarla çalışan genel / sağlam bir metodoloji arıyorum. Daha iyi sonuçlar alıp alamayacağımı görmek için ızgara boyutunu (yani 10x10) artırmayı denedim ve ızgara boyutu ile çıktı kalitesi arasında herhangi bir korelasyon görmüyorum.

Düzenleme 2:

Ben bu daha etrafında oynamayı denedim ve genel olarak sadece GEOS ve QGIS kullanarak sonuçlar güvenilmez gibi görünüyor (fTools kullanır, sırayla GEOS kullanırsa bilmiyorum). Izgara büyüklüğünün sonuçlarla hiçbir ilgisi olmadığını belirtmek yanlıştı - ızgara ne kadar büyükse, sonuçlar o kadar iyi (bu iyi bilmek ama yine de bir çözüm değil). İşte çoğunlukla çalışan, ancak bir döşemede kısmen başarısız olan gerçekten aralıklı bir kılavuzun ekran görüntüsü:

resim açıklamasını buraya girin

Geometri temiz - QGIS, "Geçerliliği Kontrol Et" aracıyla 0 hata gösteriyor. Bu soruna adım adım yaklaşmak istemiyorum; belirli özelliklerin görsel olarak görünür olmadığı (ve daha küçük fayanslarla olmayacak) olduğunda bu büyük bir veri kümesindeki kesişimin başarısız olup olmadığını doğrulamak pratik değildir.


Dünyayı veya Avustralya şekil dosyasını nereden buldunuz? Bu dosyanın geometrisinin bazı sorunları olabileceğinden şüpheleniyorum (Vector | Geometry Tools | QGIS'te Geometri Geçerliliğini Kontrol Edin). Daha küçük bir dünya şekil dosyası ve 5 derece fayans üzerinde bir kesişim denedim ve QGIS'de mükemmel çalışıyor.
Simbamangu

1
Geoscience Australia (20MB) ve 4 derece fayans 100K Avustralya sahil şeridi ile denenmiş, aynı zamanda iyi çalışıyor (QGIS 1.7.4, OSX 10.7). Verilerinizi ve ne yaptığınızı daha ayrıntılı olarak açıklayabilir misiniz?
Simbamangu

Tüm ekstra bilgiler için teşekkürler. OSM verileri hakkında garip bir şey olduğundan şüpheleniyorum; bahsettiğim veri kümesiyle deneyin ve daha iyi sonuçlar alıp almadığınızı görün. Geçmişte OSM göl verileri ile biraz tuhaflık yaşadığımı hatırlıyorum, aramaya çalışacağım.
Simbamangu

Veri kümesini veya hatta kırpılmış bir kısmını paylaşabilir misiniz (yukarıdaki örnekte olduğu gibi)?
Simbamangu

Yanıtlar:


7

Sonunda bunu yapmak için kendi aletlerimi yarattım.

Veri kurulumumu bölmek için OGR ile birlikte Clipper kütüphanesini ( http://www.angusj.com/delphi/clipper.php ) kullandım . Unutulmaması gereken bir şey, bu lib ile naif bir şekilde kesişmeler yapmaktır, bu yüzden dörtlü bir yaklaşım kullandım ... yani, dört ızgara hücresine bölün, istediğiniz çözünürlüğü elde edene kadar her birini dört taneye bölün, vb. Lib harika çalışıyor, doğu yarımküredeki sonuçları gösteren bir ekran görüntüsü ekledim:

resim açıklamasını buraya girin

Yukarıdaki sonuç, 1.33GHz işlemcide yaklaşık 4.5 saat sürdü.

Gelecekte birisinin benzer bir sorunla karşılaşması durumunda araçlar. Kavramların kanıtı olarak hacklendiklerini ve muhtemelen doğrudan kullanmamanız gerektiğini unutmayın (yine de bir şey için iyi bir başlangıç ​​noktası olabilir):

https://github.com/preet/scratch/tree/master/gis/polytoolkit

https://github.com/preet/scratch/tree/master/gis/shapefiles/shptk


Bağlantılı kod artık mevcut değil :-(
Shaun McDonald

Depoyu github.com/preet/scratch/tree/master/gis/polytoolkit adresine taşıdım . Tam olarak neyi başarmaya çalıştığınıza bağlı olarak, github.com/preet/scratch/tree/master/gis/shapefiles/shptk daha yararlı olabilir.
Pris

Sonrakiler daha faydalıdır. Şimdi PostGIS kullanan bir yöntem buldum, ancak bunun daha hızlı olup olmadığını öğrenmek ilginizi çekecekti. Derleme ve kurulum için bir benioku var mı?
Shaun McDonald

Bağlantıyı düzeltmek için cevabınızı düzenleyebilir misiniz? Teşekkürler
Afr

4

Kesinlikle geometri sorunlarınız var gibi görünüyor. İlk önce geometri sorunlarınızı ele almadıkça, kullanılan yazılıma bakılmaksızın kirli bir girdi dosyasından temiz sonuçlar elde etme olasılığı düşüktür. Geometri sorunlarınızı çözdükten sonra, hala sorun yaşıyorsanız aşağıdakileri deneyebilirsiniz:

1) Izgara veri kümenizin, dünya çokgen veri kümenizle aynı projeksiyona sahip olduğundan emin olun. Değilse, uygun projeksiyonda yeniden oluşturun.

2) Tüm özellikleri tek parçaya dönüştürün - işlenmesi çok daha kolay

3) Kesişme gerçekleştirildikten sonra özniteliklerinizi tekrar birleştirmenizi sağlayacak, yalnızca kimlik alanını koruyarak tüm yabancı alanları kaldırın - işlemek çok daha kolay

4) Tüm ızgara veri kümesini tüm dünya çokgen veri kümesiyle kesişmek yerine, ızgara çokgenleriniz üzerinde döngü yapmayı deneyin, dünya veri kümenizdeki kesişen çokgenleri seçip ızgara çokgeninize göre bir klip gerçekleştirin. Bu, herhangi bir sorunu izole etmenizi sağlar ve sonuçta orijinal hedefinize ulaşmak için sonuçları birleştirebilirsiniz.

5) Daha büyük ızgara çokgenleri kullanmayı deneyin.


+1 Gerçekten ilginç - kimlik alanını veya çok parçalı verileri verilerinizde tutarsanız coğrafi işlem hızını ne kadar etkiler?
Simbamangu

1
Asla farkları ölçmeye çalışmadım. Sadece aşırı coğrafi işlemlerin başarısız olduğu deneyimlerden konuşabiliyorum ve bunlar sorunun çözülmesine yardımcı olan şeyler.
Brent Edwards

(2) 'yi işe koymakta başarısız oldum. Özellikleri seçmek ve QGIS kullanarak bunları birleştirmeye çalışmak temelde sistemimi kilitliyor gibi görünüyor - belki de hala işleyen şeyler, ama bu oranda pratik değil: Sistemimi bir gecede QGIS ile hala birkaç özelliği birleştirmeye çalıştım veri seti ve hala sabah gidiyordu.
Pris

1
Herhangi bir birleştirme olmamalıdır. Amaç çok parçalı özellikleri patlatmaktır. Örneğin, başarısız döşemenin ekran görüntüsünde amaç, BC ve Alaska sahili boyunca ada özellikleri gibi gruplandırılmış, uzamsal olarak ayrık çokgenler içeren tüm kayıtlarınızı ayrı, tek parçalı çokgen kayıtlarına dönüştürmektir. Bu, QGIS'de Vektör> Geometri Araçları menüsü altındaki "Tek parçaya çok parçalı" aracı kullanılarak gerçekleştirilebilir.
Brent Edwards

Tek parçaya dönüştürme özelliğinizin ardından, her şeyin temiz olduğundan emin olmak için geometrinizi yeniden doğrulamanız gerekir.
Brent Edwards

0

Başka bir yaklaşım, bir nokta veri kümesi oluşturmak için bir vektörden raster dönüşümünü denemek ve daha sonra karolarınızı oluşturmak için bazı kod yazmak için temel veri kümesini kullanmak olabilir.

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.