Làm cách nào để tính khoảng cách đến một tính năng với gdal_proighbor?


28

Tôi đang sử dụng gdal_proighbor để tìm khoảng cách đến con sông lớn gần nhất trên khắp Hoa Kỳ (thấp hơn 48 tiểu bang). Tôi đã chiếu các dòng chảy mạng NHD + tới Conus Albers (epsg: 5070), các dòng sông được chọn với thứ tự dòng> 5, và rasterized, đốt các dòng sông là 255, không có dòng sông nào bằng 0. Điều này rất tốt, nhưng bây giờ tôi cần tìm khoảng cách đến sông gần nhất cho các trang web trong vòng 50km. Tệp đầu vào có độ phân giải 30m ở quy mô lục địa, vì vậy rất lớn, nhưng việc chuyển đổi phải là một lệnh gdal_proighbor đơn giản:

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

Điều này có vẻ như cực kỳ hiệu quả, nhưng đang tạo ra một mô hình hình học kỳ lạ ở đầu ra (xem hình ảnh). Dữ liệu có trong đầu ra đã được xử lý chính xác. Bất cứ ai có thể đề nghị tại sao rất nhiều đầu ra bị thiếu?

Gần sông

Chỉnh sửa: Để kiểm tra xem điều này có phải do bất kỳ tham số tùy chọn nào không, tôi đã chạy lại gdal_proighbor trong cấu hình này:

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

Mà mang lại kết quả cơ bản giống nhau:

Gần sông, không có thông số tùy chọn

Suy nghĩ duy nhất của tôi là nó có thể liên quan đến kích thước của raster (~ 100 gb không nén. Theo như tôi biết thì không có giới hạn về kích thước của BigTiff, nhưng có lẽ có giới hạn đối với những gì gdal có thể phân tích hiệu quả?


1
Điều gì xảy ra nếu bạn tắt lát gạch = CÓ? Ngoài ra, nó có hoạt động nếu bạn thay đổi từ GEO sang PIXEL không? (Đầu ra có thể không phù hợp, nhưng nó có thể thu hẹp vấn đề)
Steven Kay

Cảm ơn lời đề nghị - đã thêm một câu trả lời cho câu hỏi ban đầu.
R Rhodes

Độ phân giải của bạn infile.tif tại?
shahryar

2
Bạn có thể thử đọc dữ liệu bằng GDAL theo lô (dòng) và xem liệu vấn đề là do chính dữ liệu hoặc QGIS không thể hình dung được nó? Bước đầu tiên để tìm ra vấn đề này là chuyển phạm vi không gian sang AOI mẫu.
RutgerH

Câu trả lời:


3

Tôi nghi ngờ rằng bạn đang đạt giới hạn bộ nhớ ở đâu đó, có thể là khi RAM cạn kiệt và HĐH chuyển sang tệp hoán trang. Giám sát tài nguyên hệ thống của bạn trong quá trình. Tôi không rõ lý do tại sao kết quả của bạn xảy ra trong các dải cong, nhưng đảm bảo bạn đã chiếu (lưu) tất cả dữ liệu vào cùng một hệ tọa độ.

Hãy xem các kiểu dữ liệu số để giúp thuật toán này. Mạng luồng rasterized chỉ cần chứa các giá trị nhị phân, vì vậy chúng ta có thể tiết kiệm tài nguyên bằng cách sử dụng Byteloại dữ liệu raster. Ghi giá trị 1 cho luồng và 0 cho nề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

Tiếp theo, sự gần gũi mà chúng ta quan tâm là tích cực và nhỏ hơn hoặc bằng 50.000m. Một kiểu dữ liệu thích hợp là một số nguyên 16 bit không dấu UInt16. Hơn nữa, nếu chúng ta đặt 'không có dữ liệu' thành tối đa 65535, chúng ta có thể giữ lại giá trị 0 cho các ô luồng.

Nếu cần, bạn cũng có thể chuyển xuống số nguyên không dấu 8 bit UInt8và vẫn có độ chính xác gần 200m.

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

* Lưu ý rằng tôi đã sử dụng kích thước ô 50m. Gdal_proighbor tiêu thụ ~ 20GB RAM và mất ~ 5 phút trên máy của tôi. Nếu bạn bị giới hạn RAM, hãy chia raster đầu vào thành các kích cỡ có thể quản lý được, như những người khác lưu ý.

gdal_pro cận kết quả

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.