Cách nhanh nhất để chuyển đổi raster lớn sang polyline bằng R hoặc Python?


14

Tôi có một tệp raster lớn (129600 x 64800 pixel) với các vùng nước toàn cầu (1 bit giá trị 0 và 1) và cố gắng trích xuất các bờ biển đại dương và nội địa.

Tôi đã thử với ArcGIS và QGIS để chuyển đổi từ raster sang polyline, nhưng phải mất nhiều thời gian.

Có ai biết một cách tốt hơn / nhanh hơn (Python hoặc R) hoặc một công cụ tốt hơn cho nhiệm vụ này không?

Cập nhật

  • R: rasterToContour có thể nhanh và chính xác nhưng nếu bạn có bộ dữ liệu rất lớn như của tôi (8.398.080.000 pixel), bạn cần một lượng RAM rất lớn (hơn 16 GB) hoặc bạn buộc R phải xử lý nhiều hơn trên ổ cứng và nó cũng sẽ mất nhiều thời gian.
  • Python / GDAL: gdal_poligonize tạo đa giác thay vì polylines

Cập nhật 2

  • R rasterToContour: rasterToContour không cung cấp kết quả mong muốn. So với ArcGIS (raster to polygon theo sau là tính năng cho dòng), nó không trích xuất phác thảo pixel chính xác, như trong các ví dụ dưới đây.

kết quả rasterToContour kết quả rasterToContour

Kết quả ArcGIS Kết quả ArcGIS

CẬP NHẬT 3

Python / GDAL: Tôi đã chạy gdal_polygonize từ dòng lệnh với ArcGIS trên một tập dữ liệu thử nghiệm và kết quả rất rõ ràng:

  • gdal: 49 giây
  • ArcGIS: 1,84 giây

Đã làm điều đó, xem Cập nhật 3.
Chung Wevers

Bạn có thể cung cấp tập dữ liệu thử nghiệm đó, để chúng tôi có thể xem liệu các phương án được đề xuất có nhanh hơn không và / hoặc tạo ra kết quả cần thiết?
Kersten

Đối với một raster lớn như vậy, bạn sẽ tốt hơn khi sử dụng C / C ++ với thư viện gdal.
Rodrigo

Câu trả lời:


7

Tôi đã làm việc với R và được sử dụng rasterToPolygonstừ rastergói trước đây, nhưng bây giờ tôi thích gdal_polygonizeRJohn Baumgartner hơn. Nó dựa trên gdal_polygonize.pyvà nhanh hơn nhiều. John Baumgartner đã xuất bản mã và đưa ra một ví dụ cho việc sử dụng trong blog của mình .

Nếu bạn quen thuộc với python, bạn có thể sử dụng gdal_polygonize.pytrực tiếp.


1
Tôi sẽ thử. Lần trước tôi đã sử dụng gdal_polygonize.py ArcGIS vẫn nhanh hơn.
Chung Wevers

Tôi không mong đợi rằng ArcGis có thể nhanh hơn gdal đó. @Generic Militzer
Iris

Đợi đã, điều này sẽ tạo ra đa giác nhưng tôi cần polylines.
Wevers Chung

Nếu bạn đặt dữ liệu của mình vào Cơ sở dữ liệu địa lý tệp thì nó khá nhanh. Nhưng vẫn chưa đủ nhanh. Đó là lý do tại sao tôi đang tìm kiếm các lựa chọn thay thế.
Wevers Chung

2
Đó không nhất thiết là vấn đề mà bạn nhận được đa giác, bạn luôn có thể chuyển đổi chúng thành polylines (mặc dù, với nhiều điều đó tất nhiên cũng có thể mất một thời gian).
Martin

6

Đối với hậu thế, tôi đã thành công với stars::gói Rđể thực hiện loại hoạt động này một cách nhanh chóng.

library(raster)
library(stars)
library(sf)
library(magrittr)

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- st_as_stars(r) %>% 
  st_as_sf() %>% # this is the raster to polygons part
  st_cast("MULTILINESTRING") # cast the polygons to polylines

plot(x)

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

plot(r)
plot(x, add = TRUE)

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


5

Hãy thử rasterToContourtừ gói raster .

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- rasterToContour(r)
class(x)
> [1] "SpatialLinesDataFrame"
> attr(,"package")
> [1] "sp"

plot(r)
plot(x, add=TRUE)

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

Sau đó, bạn có thể dễ dàng ghi các tệp vào một thư mục cục bộ, ví dụ như 'ESRI Shapefile' (.shp), sử dụng mã dưới đây. Hãy xem ogrDriverstừ rgdal để tìm ra trình điều khiển nào mà hệ thống của bạn tương thích.

library(rgdal)
writeOGR(x, dsn = getwd(), layer = "coastlines", driver = "ESRI Shapefile")

Tôi sẽ thử và giữ ngón tay vượt qua nó sẽ không giết RAM của tôi. Mặc dù tôi có 16GB, nhưng hy vọng là đủ, đôi khi R không hiệu quả lắm với các tệp raster lớn. Nhưng hãy xem nào.
Chung Wevers

Chuyển đổi hoạt động bằng cách nào đó, nhưng tôi không thể kiểm tra chi tiết. Vì tôi thường thích xử lý dữ liệu raster hơn, bạn có thể cho tôi biết làm thế nào tôi có thể chuyển SpatialLineDataFrame thành một shapefile hoặc một cái gì đó có thể so sánh được. Tôi đã googled và vẫn đang vật lộn, vì tôi không biết tên lớp (OGRwrite).
Chung Wevers

Haha, tôi chắc chắn thấy quan điểm của bạn. Xem cập nhật ở trên.
fdetsch

2
Một gợi ý khác: hãy thử đặt 'maxpixels' rasterToContourthành một số giá trị cao hơn, ví dụ 1e + 9. Bạn sẽ kết thúc với nhiều chi tiết hơn sau đó. Cài đặt mặc định tạo các đường đồng mức khá khái quát.
fdetsch

1
Nếu bạn không sẵn sàng chuyển resampledữ liệu của mình sang độ phân giải không gian thô hơn, thì giải pháp duy nhất tôi có thể tưởng tượng là chia dữ liệu của bạn thành nhiều ô (ví dụ: 16 trình quét phụ), sau đó thực hiện rasterToContourtrên từng ô riêng lẻ theo cách lặp và , cuối cùng, mergecác shapefile kết quả thành một shapefile lớn. Trong trường hợp bạn quan tâm, gói Rsenal của nhóm làm việc của chúng tôi cung cấp một chức năng được gọi splitRasterđể tạo nhiều raster phụ từ một raster lớn.
fdetsch

2

Mặc dù tôi là một fan hâm mộ lớn của GDAL, công cụ đa giác cũng quá chậm đối với các ứng dụng của tôi.

Một thay thế nhanh chóng là gdal_trace_outlinetừ các kịch bản Dans GDAL cũng có nhiều tùy chọn hơn về khả năng chịu đựng, bánh rán, v.v.

Giống như gdal_polygonizeđiều này cũng tạo ra các đa giác mà bạn cần chuyển đổi sau đó ogr2ogr -nlt MULTILINESTRING.

Nhược điểm là bạn cần phải tự biên dịch nó, trừ khi bạn đang sử dụng Linux hoặc Mac OsX System.


Thật không may, nó đã thất bại với thông báo lỗi: "Lỗi phân đoạn (lõi bị đổ)". Tôi đoán tệp của tôi quá lớn hoặc chính xác hơn nó sẽ tạo ra quá nhiều đa giác nhỏ.
Wevers Chung
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.