Gdalwarp ile dosya boyutu enflasyonu normal mi?


19

Birkaç gdalwarpraster projelendirmek ve hizalamak için -tapkullandıktan sonra çıktı rasterlerinin orijinal rasterlerden önemli ölçüde daha büyük olduğunu fark ettim. Oldukça kapsamlı bir web araması bu Trac sorununu ortaya çıkardı :

Frank Warmerdam bunun nedenini açıkladı:

"Dikkatli bir incelemede, söz konusu dosyadaki fark, gdal_translate'in çıktı dosyasını GTiffDataset :: CreateCopy? () İçinden yazmak için TIFFWriteScanline () arayüzünü kullanması ve bunun yalnızca son 'şeridin' tam görüntü alanına gereklidir gibi dosya. Ama gdalwarp dosyanın sonuna düşer komple nihai şeridi, hatta bir kısmını yazıyor blockio arabirimi üzerinden gider."

Ancak bu Trac sorunu ~ 7 yaşında ve GDAL yardımcı programlarında bazı değişiklikler olduğunu biliyorum, gdalwarpo zamandan beri yapıldı. Yukarıdaki muhakemenin hala devam edip etmediğini ve gördüğüm dosya boyutu enflasyonunun "normal" olup olmadığını bilmek istiyorum. Buradaki "normal" kelimesi , şaşırtıcı veya beklenen anlamına gelebilir , ancak daha da önemlisi: etkileri azaltmak için yani çıktı raster dosya boyutunu küçültmek için yapılabilecek herhangi bir şey var mı? Aşağıda, yaşadığım dosya boyutu enflasyonunun bir tablosu bulunmaktadır.

Input File Size (bytes)     Output File Size (bytes)    Inflation
1437380431                  1698334217                   18%
1428001178                  1698334433                   19%
  41683165                   137036637                  228%

Giriş TIFF dosyaları ArcGIS'de oluşturulmuştur ve bu nedenle harici Worldfiles, XML ve DBF dosyaları vardır, ancak bunlar dosya boyutundaki farkı oluşturmaz. İşte gdalwarptüm bu durumlarda kullandığım örnek bir çağrı; gerçek yürütme bir Python subprocess( subprocess.Popen) tarafından işlendi :

$ gdalwarp -tap -tr 30 30 -t_srs "+proj=aea +lat_1=20 +lat_2=60 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs" -co "COMPRESS=LZW" input_file.tif output_file.tif

Nadir durumlarda sıkıştırma daha büyük bir dosya yapar, ancak etki LZW sıkıştırma olmadan aynı olduğunu anlıyorum. Tablodaki oranlar LZW sıkıştırması ile verilmiştir.

Yanıtlar:


30

Gdalwarp'in sıkıştırmayla iyi başa çıkmadığı bilinen ve uzun süredir devam eden bir konudur . Çözüm sıkıştırma olmadan gdalwarp sonra sıkıştırma ile gdal_translate etmektir.

İki uzun işlemden kaçınmak için, önce gdalwarp'den VRT'ye, gerçekten hızlı, sonra gdal_translate -co sıkıştır = lzw seçeneği ile.

yani

$ gdalwarp -tap -tr 30 30 -t_srs "etc..." -of vrt input_file.tif output_file.vrt
$ gdal_translate -co compress=LZW output_file.vrt output_file.tif

GDAL 2x kullanıyorsanız, bunu VRT'ye yazarak /vsistdoutve bunu boruya bağlayarak ve giriş olarak gdal_translatebelirterek tek bir işlemde birleştirebilirsiniz /vsistdin. Örneğin:

gdalwarp -q -t_srs EPSG:32611 -of vrt input_file.tif /vsistdout/ | gdal_translate -co compress=lzw  /vsistdin/ output_file.tif

Bir tamsayı taşması hatasını önlemek için başarıyla kullandığım çözümünüz için teşekkürler. Ama hatayı çözerken, tepemde garip bir desen alıyorum. Burada ayrı bir soru yayınladım, bir göz atmanız
Tim Autin
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.