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:
- Öyle. Her şey WGS84 Lat / Lon'da
- 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.
- İşlem sırasında hiçbir öznitelik alanı tutulmaz, sadece geometriyle ilgileniyorum.
- 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.
- 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ü:
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.