Làm mịn / nội suy raster trong Python bằng GDAL?


20

Tôi đang phát triển bằng Python và sử dụng GDAL từ OSGEO để thao tác và tương tác với các trình raster và shapefiles.

Tôi muốn lấy một shapefile có các tính năng điểm và nội suy nó thành một raster bề mặt. Ngay bây giờ tôi đang sử dụng phương thức 'RasterizeLayer', ghi một giá trị từ tính năng điểm vào raster (được đặt với tất cả các giá trị nốt) nhưng để lại tất cả các pixel chưa chạm tới dưới dạng giá trị 'gật đầu'. Do đó, tôi còn lại với một raster loại bàn cờ.

Những gì tôi có sau khi sử dụng RasterizeLayer:

[Raster từ việc sử dụng gdal.rasterizelayer]

Những gì tôi muốn cho một sản phẩm cuối cùng:

nhập mô tả hình ảnh ở đây

Tôi tin rằng hàm mà tôi đang tìm kiếm được gọi là 'Spline_sa ()' từ quá trình nhập khẩu cung.

GDAL có chức năng tương tự không, hoặc có một phương pháp khác để có đầu ra mong muốn của tôi không?

Câu trả lời:


18

Tôi sẽ xem NumPy và Scipy - có một ví dụ hay về việc nội suy dữ liệu điểm trong SciPy Cookbook bằng hàm scipy.interpolate.griddata . Rõ ràng điều này đòi hỏi bạn phải có dữ liệu trong một mảng gọn gàng;

  • Sử dụng các ràng buộc python GDAL, bạn có thể đọc dữ liệu của mình vào Python bằng cách sử dụng gdal.Dataset.ReadAsArray()raster.
  • Với OGR, bạn sẽ lặp qua lớp tính năng và trích xuất dữ liệu điểm từ shapefile (hoặc tốt hơn nữa, viết shapefile vào CSV bằng GEOMETRY=AS_XYZ[xem định dạng tệp OGR CSV] và đọc csv vào Python).

Khi bạn đã có một đầu ra có lưới, bạn có thể sử dụng GDAL để ghi mảng numpy kết quả vào raster.

Cuối cùng, nếu bạn không gặp may mắn với thư viện nội suy Scipy, bạn luôn có thể thử scipy.ndimage .


Cảm ơn đã giúp đỡ! Tôi đang đưa ra cách tiếp cận Scipy.interpolate.griddata. Tôi sẽ gửi lại kết quả của tôi.
Doug

1
Tôi xin lỗi vì mất quá nhiều thời gian để quay lại bài đăng này. Câu trả lời ở trên về cơ bản là những gì tôi đã làm để giải quyết vấn đề của mình. Tôi đã sử dụng thư viện nội suy Scipy để điền vào các khoảng trống đó và sau đó viết lại cho rasterband. Cảm ơn các bạn vì đã giúp đỡ!
Doug

@Doug Không phải lo lắng - hạnh phúc để chữa lành!
om_henners

1
Giải pháp này nhanh như thế nào? Nó có thể được sử dụng cho lưới 10k x 10k trong đó chỉ mỗi 100x100 được biết giá trị không? Tôi đã thử gdal_fillnodata rất nhanh so với bất kỳ phép nội suy nào nhưng nó không hoạt động tốt đối với các điểm quá thưa thớt. Tại thời điểm này tôi đang sử dụng triangulation từ Saga nhưng nó rất chậm đối với các mảng trung bình và thất bại với các mảng lớn.
Miro

12

Có một cái nhìn về API lưới GDAL . Tôi không biết nếu điều đó được phơi bày trong các ràng buộc Python, nhưng nếu không, bạn gọi hãy gọi tiện ích gdal_grid thông qua mô-đun quy trình con .

API lưới GDAL chỉ sử dụng Trọng số khoảng cách nghịch đảo, Di chuyển trung bình và Hàng xóm gần nhất, nó không triển khai các spline. Một lựa chọn khác là sử dụng Scipy .


1

Một chút cũ cho chủ đề này nhưng tôi đã viết một mô-đun đơn giản sử dụng thuật toán KNN từ sklearn được gọi là skspatial.

https://github.com/rosskush/skspatial

Bạn có thể nhập một shapefile bằng geopandas và chọn một cột và nó sẽ nội suy một bề mặt có thể được xuất sang raster. Nó rất cơ bản và có lẽ không phải là cách tốt nhất để làm điều đó, nhưng ít nhất nó giữ mọi thứ trăn thuần túy.

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.