Làm cách nào để thêm các trình quét có kích thước khác nhau trong GDAL để kết quả chỉ ở khu vực giao nhau


11

Tôi đang viết một phương thức Python có thêm hai raster và tạo một đầu ra raster duy nhất. Vì những lý do ngoài tầm kiểm soát của tôi, phạm vi của các trình quét đầu vào là khác nhau, nhưng chúng trùng nhau.

Có thể hoạt động độc quyền trên các pixel raster đầu vào được chồng lấp trong 2 vùng chồng lấp để tạo ra thông số của tôi sao cho phạm vi raster đầu ra chỉ là vùng giao nhau của hai đầu vào?

Câu trả lời:


12

Điều đầu tiên cần làm là xác định hình chữ nhật chồng chéo trong tọa độ không gian địa lý. Để làm điều này, bạn có được geotransform cho mỗi hình ảnh nguồn:

gt1 = ds1.GetGeoTransform()
# r1 has left, top, right, bottom of dataset's bounds in geospatial coordinates.
r1 = [gt1[0], gt1[3], gt1[0] + (gt1[1] * ds1.RasterXSize), gt1[3] + (gt1[5] * ds1.RasterYSize)]

# Do the same for dataset 2 ...

intersection = [max(r1[0], r2[0]), min(r1[1], r2[1]), min(r1[2], r2[2]), max(r1[3], r2[3])]

Sau đó chuyển đổi hình chữ nhật đó thành pixel cho mỗi hình ảnh bằng cách trừ tọa độ trên cùng và bên trái và chia cho kích thước pixel, làm tròn lên.

Từ đây, bạn có thể gọi ReadRaster()trên mỗi hình ảnh, cung cấp cho nó mức độ pixel bạn vừa tính:

band.ReadRaster(px1[0], px1[1], px1[2] - px1[0], px1[3] - px1[1], px1[2] - px1[0], px1[3] - px1[1],
                # <band's datatype here>
)

Tôi hơi mệt, vì vậy nếu điều này không có ý nghĩa nhiều, hãy cho tôi biết!


Điều này cũng làm việc cho các raster với các phép chiếu khác nhau (còn gọi là hệ tọa độ tham chiếu / hệ thống tham chiếu không gian)? Và ngay cả khi các dự đoán là như nhau: Điều này cũng hoạt động nếu gt1[1]gt2[1](hoặc gt1[5]gt2[5]) có dấu hiệu trái ngược nhau? (Trong đó sẽ lật một trong những rasters theo chiều dọc hoặc chiều ngang, tôi nghĩ.) Hoặc nếu abs(gt1[2])abs(gt1[4])lớn hơn abs(gt1[1])abs(gt1[5])nhưng abs(gt2[2])abs(gt2[4])có kích thước nhỏ hơn abs(gt2[1])abs(gt2[5])(mà có lẽ sẽ lật một trong những rasters đường chéo)?
das-g

6

Phần tử thứ ba của giao lộ phải là min (r1 [2], r2 [2]):

intersection = [max(r1[0], r2[0]), min(r1[1], r2[1]), min(r1[2], r2[2]), max(r1[3], r2[3])]

Ngoài ra, tôi sẽ đề xuất một số logic để kiểm tra xem các bộ dữ liệu có thực sự giao nhau không.

Đây là một cách tiếp cận:

if (intersection[2] < intersection[0]) or (intersection[1] < intersection[3]):
    intersection = None
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.