Cách dễ nhất để tôi giải quyết vấn đề này là sử dụng Định dạng ảo GDAL . Định dạng này cho phép tôi coi toàn bộ tập hợp hình ảnh là một đối tượng hình ảnh duy nhất và biến đổi nó theo ba bước tương đối đơn giản.
Tạo bộ dữ liệu ảo
GDAL (bao gồm các tệp nhị phân Windows của Tamas Szekeres và các phiên bản gần đây của OSGeo4W ) bao gồm một tiện ích có tên gdalbuildvrt có thể được sử dụng để xây dựng bộ dữ liệu ảo ban đầu.
Một cách đơn giản để sử dụng điều này là thêm tất cả các hình ảnh của bạn vào một tệp văn bản, sau đó sử dụng tệp văn bản đó làm đầu vào cho gdalbuildvrt. Đây là một ví dụ (bạn sẽ cần đặt lại lệnh thứ hai trên một dòng):
dir /b *.tif > my_images.txt
gdalbuildvrt
-hidenodata
-vrtnodata "255 255 255"
-resolution highest
-input_file_list my_images.txt
my_image.vrt
Điều này sẽ để lại cho bạn một tệp XML mà bạn có thể coi là một hình ảnh duy nhất cho tất cả các hoạt động GDAL. Nó cũng thể hiện bên trong gật đầu là màu trắng, nhưng ẩn định nghĩa về nốt từ các công cụ đọc từ nó.
Tạo Tổng quan về mẫu
Tiếp theo, bạn sẽ thực hiện việc lấy mẫu lại và đầu ra của hình ảnh tổng quan. Bạn có thể làm điều này với gdal_translate hoặc gdalwarp . Đối với một trong hai điều này, hãy nhớ rằng kích thước kết quả sẽ là width * height * 3
(số lượng băng tần 8 bit) Byte. Nếu giá trị này lớn hơn 4GB, bạn sẽ muốn xem các tùy chọn GeoTIFF cho cú pháp để chỉ định BigTIFF làm đầu ra của bạn (-co "BIGTIFF = CÓ").
Đối với gdal_translate, bạn sẽ cần xác định kích thước của hình ảnh ảo bằng cách sử dụng lệnh gdalinfo tiện dụng . Lấy các kích thước này và chia từng kích thước cho một số yếu tố nhất quán để xác định chiều rộng và chiều cao đầu ra của tệp theo pixel.
Lệnh sẽ trông giống như (trên một dòng):
gdal_translate
-outsize 53120 14000
-co "TILED=YES"
-co "PROFILE=GEOTIFF"
-co "BLOCKXSIZE=256"
-co "BLOCKYSIZE=256"
my_image.vrt
my_image.tif
Đối với gdalwarp, bạn sẽ cần biết kích thước pixel kết quả; trong trường hợp này tôi đang sử dụng 0,5 mét. Bạn cũng sẽ muốn thực hiện một cuộc gọi về phương pháp lấy mẫu lại. Tôi thích cubicspline cho tổng quan orthophoto. Nó mềm hơn, nhưng bạn sẽ không sử dụng những độ phân giải này đến độ phân giải đầy đủ và theo kinh nghiệm của tôi, nó sẽ tạo ra một hình ảnh có thể nén hơn nếu bạn đang sử dụng một cái gì đó như JPEG hoặc ECW.
gdalwarp
-r cubicspline
-of GTiff
-dstnodata "255 255 255"
-tr 0.5 0.5
-co "PROFILE=GEOTIFF"
-co "BIGTIFF=YES"
-co "TILED=YES"
-co "BLOCKXSIZE=256"
-co "BLOCKYSIZE=256"
my_image.vrt
my_image.tif
Bạn cũng có thể muốn xem xét sử dụng các tùy chọn nén JPEG cho các tổng quan GeoTIFF được chia lại này; nó thu nhỏ tệp đầu ra đáng kể với ( theo Frank ) chỉ là một hình phạt hiệu suất cận biên.
-co "COMPRESS=JPEG"
-co "JPEG_QUALITY=80"
-co "PHOTOMETRIC=YCBCR"
Tổng quan
Bạn cũng sẽ muốn chạy lệnh gdaladdo tiện dụng trên hình ảnh kết quả để xây dựng "kim tự tháp" bên trong, để yêu cầu độ phân giải thấp hơn kích thước hình ảnh đầy đủ có thể được đáp ứng với một tập hợp con dữ liệu. Sự gia tăng hiệu suất là nhiều hơn giá trị không gian đĩa trong hầu hết các trường hợp. Bạn sẽ muốn chơi xung quanh với các cấp độ mà bạn sử dụng ở đây; Đối với hình ảnh rất lớn, bạn có thể có thể thả một số. Lệnh gdaladdo trông giống như thế này:
gdaladdo
-r average
my_image.tif
2 4 8 16 32 64 128 256
Tôi sẽ đề nghị thử nghiệm với các cấp độ này để có hiệu suất tối ưu. Bạn có thể thấy rằng một khoảng thời gian lấy mẫu khác nhau sẽ tốt hơn cho ứng dụng của bạn hoặc, dựa trên kích thước hình ảnh của bạn, rằng bạn có thể bỏ một số số cao hơn (hoặc cần nhiều hơn)
Ngoài ra, nếu bạn đang tạo tổng quan bên ngoài (sử dụng tùy chọn -ro), hãy xem xét thêm các dòng cấu hình nén JPEG:
--config COMPRESS_OVERVIEW JPEG
--config PHOTOMETRIC_OVERVIEW YCBCR
--config INTERLEAVE_OVERVIEW BAND
(Tôi tin rằng những thứ này được kế thừa từ GeoTIFF gốc cho các tổng quan được nhúng)
Ghi chú
Khi gặp vấn đề này, tôi đã hỏi trên kênh #gdal trên freenode.irc.net. Đây là một nguồn tài nguyên tuyệt vời và tôi hoàn toàn mang ơn Howard Butler, Frank Warmerdam và thậm chí cả Rouault vì đã giúp tôi giải quyết vấn đề này.