Cách tốt nhất để cắt một tập tin ECW raster lớn?


9

Tôi đang cố gắng cắt một ECW lớn (chi tiết bên dưới) nhưng tệp raster quá lớn để được xử lý hoàn toàn.

Một số chi tiết của ECW dưới đây

Trình điều khiển: ECW / ERDAS Wavelets nén (SDK 5.0)

kích thước tệp: 50gb Kích thước là 450000, 565081 Kích thước pixel: 0.15 0.15 COLORSPACE = RGB COMPRESSION_RATE_TARGET = 9 VERSION = 2 Số băng tần: 4

Khu vực tôi muốn quay là khoảng 1/5 của tập tin gốc.

Dưới đây là các phương pháp tôi đã thử nhưng không thành công:

  1. Đã sử dụng Arcgis để lưu ecw thành tiff / các định dạng khác ... (Tôi nhanh chóng từ bỏ)

  2. Qgis đã sử dụng và công cụ clipper của nó ... việc tạo tập tin bị kẹt ở mức khoảng 40%.

  3. Đã sử dụng gdal_translate ra khỏi OSGeo4W với các tùy chọn khác ngoài Qgis. (Đã thử rằng nghĩ rằng MAYBE giải phóng bộ nhớ không sử dụng Qgis sẽ là mánh khóe)

  4. Đã sử dụng gdal_retile nghĩ rằng tôi sẽ cắt hình ảnh thành từng mảnh và lấy cái tôi muốn. Lệnh "gdal_retile -ps 10000 10000 -of ecw -tileIndex brick.shp -targetDir input.ecw Điều này đã bị hỏng thậm chí nhanh hơn"

Có ai có ý tưởng gì không?

Để biết thông tin, tôi chạy windows 7 64 bit trên i5-3470 3.2Ghz với 16gb ram.

Câu trả lời:


5

Những ý tưởng khác bạn có thể thử:

  1. gdal_translate với công tắc -srcwin
  2. gdalwarp với các công tắc -cutline và -crop_to_cutline và -wm. Cái cuối cùng chỉ định bộ nhớ cho bộ nhớ đệm và có thể giúp bạn khắc phục các sự cố bạn đã sử dụng clipper trong QGIS (vì đây thực chất là cùng một chức năng)
  3. Máy tính raster QGIS thiết lập phạm vi cho khu vực bạn muốn (đơn giản hơn clipper).
  4. SAGA-> Clip lưới với đa giác - ai biết được, nó có thể hiệu quả hơn về bộ nhớ.
  5. Mã hóa một giải pháp bằng Python và Numpy / SciPy để chỉ đọc một tập hợp con của raster vào bộ nhớ và lưu nó.

Tôi nghi ngờ rằng thực hiện cắt xén rất đơn giản (với máy tính raster hoặc chuyển đổi -srcwin trong gdal_translate) sẽ ít bị đói bộ nhớ hơn so với cắt xén với đa giác vì bạn không kiểm tra và chuyển đổi hình học. Tùy chọn 5 nên sử dụng ít bộ nhớ nhất vì bạn chỉ đọc những gì bạn cần. Hãy xem hướng dẫn này nếu bạn cần 'cách làm' (điều chỉnh bit khi đọc và viết theo khối).


Cảm ơn câu trả lời! Tôi sẽ thử SAGA và nếu nó không hoạt động tôi sẽ thử với Numpy.
Màu xanh

5

Bạn có thể cắt nó trực tiếp bằng công cụ của gdal gdal_translate nếu bạn biết tọa độ của Khu vực yêu thích của mình, nếu nó được tham chiếu địa lý:

gdal_translate -projwin [ulx uly lrx lry] infile outfile  

Nếu không sử dụng -srswincờ như thế này:

gdal_translate -srcwin [xoff yoff xsize ysize] infile outfile.

Một tùy chọn khác là xây dựng một raster 'ảo' (của một vài kilobyte) trỏ vào tập dữ liệu ban đầu của bạn, với gdalbuildvrt .

gdalbuildvrt -te [xmin ymin xmax ymax] infile outfile.vrt

Thật không may, bạn sẽ cần một tệp tham chiếu địa lý để sử dụng gdalbuildvrt.

Sau khi bạn quay clip, đừng quên tạo kim tự tháp để xem dễ dàng. Lệnh sau sẽ xây dựng các kim tự tháp bên ngoài được nén bằng thuật toán DEFLATE (lossless):

gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE outfile 2 4 8 16

Bước cuối cùng bạn cũng có thể tính toán số liệu thống kê để tránh một số vấn đề ngu ngốc với một chương trình thương mại cụ thể:

gdalinfo -stats outfile

Cảm ơn các nickname trả lời. Tôi đã xây dựng một raster ảo và chạy <code> gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE outfile 2 4 8 16 </ code> Tôi không chắc tại sao tôi lại nhận được thông báo lỗi sau LRI 1: Không thể tạo tệp TIFF do thiếu codec cho DEFLATE. Tổng quan xây dựng thất bại.
Màu xanh

Kiểm tra lỗi qgis-bug: 8782osge4w-bug: 382 nếu chúng mô tả trường hợp của bạn. Trong khi đó, hãy cố gắng tạo các tổng quan mà không có bất kỳ thuật toán nén nào, hoặc chọn một thuật toán khác .
biệt danh

Có vẻ như tôi đã làm việc theo 2 bước: gdaladdo -ro input.vrt 2 4 8 16sau đó gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE input.vrt 2 4 8 16. Mục tiêu của tôi là kết thúc với một ECW vì vậy tôi đã thử gdal_translate -of ECW input.vrt output.ecw và gặp lỗi sau:0ERROR 6: GDALDriver::Create() ... no create method implemented for this format.
Blue

@blue ECW là một định dạng độc quyền và nó cần được đối xử đặc biệt. Vui lòng kiểm tra trước nếu gdal có thể viết bằng ECW với gdalinfo --formats. Nếu bạn không thấy ECW trong danh sách, hãy thử các hướng dẫn sau: faunalia.pt/node/438
biệt danh

0

Sử dụng một "clip" thẳng gdalwarpsẽ hoạt động (Tôi biết đây là một câu hỏi cũ: 18 tháng IRL giống như một kỷ nguyên địa chất trong những năm qua internet).

Tôi có một máy bay 70Gb trên không (ECW, 94000x81000 pixel ở tốc độ 10cm / px) và GDAL có thể tùy ý cắt nó bằng một shapefile bằng cách sử dụng

gdalwarp -cutline [clipfile] -crop_to_cutline [infile] [outfile]

tại dòng lệnh Windows. (Tôi nhận ra rằng giải pháp này đòi hỏi phải xây dựng một shapefile cho khu vực mục tiêu quan tâm, nhưng đó không phải là thách thức lớn nhất đối với GIS).

Để trích xuất một đoạn có kích thước nửa vùng ngoại ô mất ~ 0,4 giây; để cắt tập tin thành quý mất 4 giây. Thông số kỹ thuật của máy tôi không khác biệt đáng kể (i7-4770 @ 3,4GHz, RAM 16 GB, Win7-64 Ultimate).


gdalwarp đã được đề cập. Thông tin về hiệu suất và kích thước hình ảnh ví dụ cụ thể là một bổ sung đáng hoan nghênh, nhưng thực sự đây phải là một nhận xét cho gis.stackexchange.com/a/74450/108 (và thực hiện chỉnh sửa được đề xuất với dòng lệnh với định dạng mã cũng sẽ được hoan nghênh ; nó dễ đọc hơn)
matt wilkie
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.