Lạm phát kích thước tập tin bình thường với gdalwarp?


19

Sau khi sử dụng gdalwarpđể chiếu và căn chỉnh theo lưới (thông qua -tap), một số trình quét tôi nhận thấy rằng các trình quét đầu ra lớn hơn đáng kể so với các trình quét gốc. Một tìm kiếm web khá kỹ lưỡng đã đưa ra vấn đề Trac này :

Frank Warmerdam giải thích lý do:

"Khi xem xét cẩn thận, sự khác biệt trong tệp được đề cập là do gdal_translate sử dụng giao diện TIFFWriteScanline () để ghi tệp đầu ra từ bên trong GTiffDataset :: CreateCopy? () Và điều này chỉ ghi nhiều nhất là 'dải' cuối cùng của tập tin như được yêu cầu để hoàn thành khu vực hình ảnh. Nhưng gdalwarp đi qua giao diện blockio ghi dải hoàn chỉnh cuối cùng, ngay cả phần rơi ra khỏi phần cuối của tập tin. "

Tuy nhiên, vấn đề Trac này đã được 7 năm tuổi và tôi biết một số thay đổi đối với các tiện ích GDAL, bao gồm cả gdalwarpđã được thực hiện kể từ đó. Tôi muốn biết nếu lý do trên vẫn còn và nếu lạm phát kích thước tệp tôi thấy là "bình thường". Từ "bình thường" ở đây có thể được hiểu là không gây ngạc nhiên hoặc mong đợi , nhưng quan trọng hơn: có bất cứ điều gì có thể được thực hiện để giảm thiểu các hiệu ứng tức là giảm kích thước tệp raster đầu ra không? Dưới đây là bảng lạm phát kích thước tệp tôi đang gặp phải.

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

Các tệp TIFF đầu vào đã được tạo trong ArcGIS và do đó có các tệp Worldfiles, XML và DBF bên ngoài nhưng chúng không tạo ra sự khác biệt về kích thước tệp. Đây là một gdalwarpcuộc gọi mẫu vì tôi đã sử dụng nó trong tất cả các trường hợp này; thực thi thực tế đã được xử lý bởi Python subprocess( subprocess.Popen):

$ 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

Tôi hiểu rằng trong các trường hợp hiếm hoi, nén tạo ra một tệp lớn hơn, nhưng hiệu quả là như nhau mà không cần nén LZW. Các tỷ lệ trong bảng là với nén LZW.

Câu trả lời:


30

Đây là một vấn đề nổi tiếng và lâu đời mà gdalwarp không giải quyết tốt việc nén . Giải pháp là gdalwarp mà không nén sau đó gdal_translate với nén.

Để tránh hai quá trình dài, trước tiên hãy chuyển sang VRT, thực sự nhanh chóng, sau đó gdal_translate với tùy chọn -co nén = lzw.

I E

$ 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

Nếu sử dụng GDAL 2x, bạn có thể kết hợp điều này thành một thao tác duy nhất bằng cách viết VRT đến /vsistdoutvà đặt đường dẫn đó gdal_translatevà chỉ định /vsistdinlàm đầu vào. Ví dụ:

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

Cảm ơn giải pháp của bạn, mà tôi đã sử dụng thành công để tránh lỗi tràn số nguyên. Nhưng trong khi nó giải quyết được lỗi, tôi nhận được một mô hình kỳ lạ trên ngọn đồi của mình. Tôi đã đăng một câu hỏi riêng ở đây, sẽ rất tuyệt nếu bạn có thể xem: gis.stackexchange.com/questions/292632/ chủ
Tim Autin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.