Gdal_proximity ile bir özelliğe olan mesafeyi nasıl hesaplayabilirim?


28

ABD'deki en yakın ana nehre olan mesafeyi bulmak için gdal_proximity kullanıyorum (düşük 48 eyalet). NHD + ağ akış hatlarını Conus Albers'e (epsg: 5070), akış sırası> 5 olan nehirleri seçtiler ve rasterleştirdiler, nehirleri 255, yanan nehirleri 0 olarak seçtiler. 50km içinde siteler için en yakın nehir. Giriş dosyası kıta ölçeğinde 30 m çözünürlükte, bu yüzden çok büyük, ancak dönüşüm basit bir gdal_proximity komutu olmalıdır:

gdal_proximity.bat -values 255 -distunits GEO -maxdist 50000 -nodata -999 infile.tif outfile.tif -co COMPRESS=DEFLATE -co BIGTIFF=YES -co TILED=YES

Bu, neredeyse çalışıyor gibi görünüyor, ancak çıktıda garip bir geometrik desen üretiyor (resme bakın). Çıktıda bulunan veriler doğru işlendi. Çıktının neden bu kadar eksik olduğunu kimse söyleyebilir mi?

Nehire yakınlık

Düzenleme: Bunun isteğe bağlı parametrelerden herhangi birinin neden olup olmadığını test etmek için, bu yapılandırmada tekrar gdal_proximity koştum:

gdal_proximity.bat H:\data\tmp\NHDplus_network_flowline_SO6plus.tif H:/data/tmp/NHDplus_network_flowline_SO6plus_proximity.tif -values 255 -maxdist 50000 -of GTiff

Hangi esas olarak aynı sonucu verdi:

Nehire yakınlık, isteğe bağlı parametre yok

Benim tek düşüncem, bunun rasterin boyutu ile ilgili olabileceğidir (~ 100 gb sıkıştırılmamış. Bildiğim kadarıyla, bir BigTiff'in boyutunun bir sınırı yoktur, ama belki de gdal'ın alabileceği bir sınır vardır) etkili bir şekilde analiz etmek


1
döşemeyi kapatırsanız ne olur = EVET? Ayrıca, GEO'dan PIXEL'e değiştirirseniz çalışır mı? (Çıktı uygun olmayabilir, ancak sorunu daraltabilir)
Steven Kay

Öneri için teşekkürler - orijinal soruya bir cevap ekledik.
R Rhodes,

İnfile.tifinizin çözünürlüğü nedir?
shahryar

2
GDAL kullanarak partileri (satırlar) kullanarak verileri okumayı deneyebilir ve sorunun verinin kendisinin mi yoksa QGIS'in bunu görselleştirememekte olup olmadığına bakabilir misiniz? Bu sorunu bulmak için ilk adım, uzaysal kapsamı örnek bir AOI'ye indirgemek.
RutgerH

Yanıtlar:


3

Muhtemelen RAM tükendiğinde ve işletim sistemi bir disk belleği dosyasına döküldüğünde, bir yerde bir bellek sınırına çarptığınızdan şüpheleniyorum. İşlem sırasında sistem kaynaklarınızı izleyin. Sonuçlarınızın neden kıvrımlı yüzeylerde gerçekleştiği açık değil, ancak tüm verileri aynı koordinat sistemine yansıttığınızdan (kaydettiğinizden) emin olun.

Bu algoritmaya yardımcı olmak için sayısal veri tiplerine göz atalım . Rasterleştirilmiş akış ağının yalnızca ikili değerler içermesi gerekir; bu nedenle, Byteraster veri türü kullanarak kaynakları koruyabiliriz . Akışlar için 1, arkaplan için 0 değerini yazın:

gdal_rasterize -l streams -burn 1 -tr 50 50 -a_nodata 0 -te -2339101 311625 2227004 3134200 -ot Byte -of GTiff streams.shp streams.tif

Daha sonra, ilgilendiğimiz yakınlık olumlu ve 50.000 metreye eşit veya daha az. Uygun bir veri türü, işaretsiz bir 16 bit tam sayıdır UInt16. Ayrıca, 'veri yok' değerini maksimum 65535 olarak ayarlarsak, akış hücreleri için 0 değerini koruyabiliriz.

Gerekirse, 8 bit işaretsiz tamsayıya da inebilir UInt8ve ~ 200m yakınlık hassasiyetine sahip olabilirsiniz.

gdal_proximity.bat -srcband 1 -distunits GEO -values 1 -maxdist 50000 -nodata 65535 -ot UInt16 -of GTiff streams.tif proximity.tif

* 50m hücre boyutu kullandığımı unutmayın. Gdal_proximity ~ 20GB RAM harcadı ve makinemde ~ 5 dakika sürdü. RAM sınırlıysanız, giriş rasterini diğerlerinin de belirtildiği gibi yönetilebilir boyutlara bölün.

gdal_proximity sonuç

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.