使用R或Python将大栅格转换为折线的最快方法?


14

我有一个很大的栅格文件(129600 x 64800像素),其中包含全球水域(1位值0和1),并尝试提取海洋和内陆水岸线。

我曾尝试使用ArcGIS和QGIS将栅格从栅格转换为折线,但是这需要花费一定的时间。

有谁知道更好/更快的方式(Python或R)或更好的工具来完成此任务?

更新资料

  • R:rasterToContour可能是快速而精确的,但是如果您有一个非常大的数据集(如我的(8,398,080,000像素)),则需要非常大量的RAM(超过16GB),或者强制R在硬盘驱动器上进行更多处理,也将需要一段时间。
  • Python / GDAL:gdal_poligonize创建多边形而不是折线

更新2

  • R rasterToContour:rasterToContour不提供所需的结果。与ArcGIS(栅格到多边形,然后要素到线)相比,它没有提取确切的像素轮廓,如以下示例所示。

rasterToContour结果 rasterToContour结果

ArcGIS结果 ArcGIS结果

更新3

Python / GDAL:我已经在命令行上在测试数据集上针对ArcGIS运行gdal_polygonize,结果非常清晰:

  • gdal:49秒
  • ArcGIS:1.84秒

这样做,请参阅更新3
通用Wevers

您能否提供该测试数据集,以便我们可以看到建议的替代方法是否更快和/或产生所需的结果?
Kersten 2015年

对于如此庞大的栅格,使用带有gdal库的C / C ++会更好。
罗德里戈

Answers:


8

我正在使用R,过去曾使用rasterToPolygons过该raster软件包,但现在我更喜欢gdal_polygonizeRJohn Baumgartner。它基于 gdal_polygonize.py并且速度更快。约翰·鲍姆加特纳(John Baumgartner)发布了代码,并在其博客中提供了用法示例。

如果您熟悉python,则可以gdal_polygonize.py直接使用。


1
我会尝试的。上一次我使用gdal_polygonize.py ArcGIS还是更快。
通用Wevers

我没想到ArcGis可以达到这个目标。@Generic Militzer
Iris

等等,这将创建多边形,但是我需要折线。
通用Wevers

如果将数据放入文件地理数据库中,则速度非常快。但是仍然不够快。这就是为什么我在寻找替代品。
通用Wevers

2
获取多边形并不一定是问题,您可以随时将其转换为折线(尽管很多当然也需要一些时间)。
马丁

7

对于后人,我一直有与成功stars::的包装R,用于快速做这种类型的操作。

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)

在此处输入图片说明

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

在此处输入图片说明


5

rasterToContour光栅包中尝试。

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)

在此处输入图片说明

然后,您可以使用以下代码轻松地将文件写入本地文件夹,例如“ ESRI Shapefile”(。shp)。ogrDriversrgdal看一下,找出系统兼容的驱动程序。

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

我会尽力使它不会杀死我的RAM。即使我有16GB(希望已足够),但对于大的光栅文件,R有时效率不高。但是,让我们看看。
通用Wevers

转换以某种方式有效,但是我无法详细检查。由于我通常更喜欢栅格数据处理,因此您能告诉我如何将SpatialLineDataFrame传输到shapefile或类似文件中。我已经搜索了Google,但仍在挣扎,因为我不知道图层名称(OGRwrite)。
通用Wevers

哈哈,我绝对明白你的意思。请参阅以上更新。
fdetsch

2
另一个提示:尝试将“ maxpixels”设置rasterToContour为更高的值,例如1e + 9。然后,您将获得更多详细信息。默认设置将创建非常通用的轮廓线。
fdetsch

1
如果您不希望resample数据具有更粗糙的空间分辨率,那么我能想象的唯一解决方案是将数据拆分为多个图块(例如16个子栅格),然后rasterToContour以迭代方式分别对每个图块执行操作,最后,merge将生成的shapefile合并为一个巨大的shapefile。如果您有兴趣,我们工作组的软件包Rsenal提供了一项名为的功能splitRaster,可以从一个巨大的栅格创建多个子栅格。
fdetsch

2

虽然我是GDAL的忠实拥护者,但是多边形化工具对于我的应用程序来说也太慢了。

Dans GDAL脚本是一种快速的替代方法gdal_trace_outline,该脚本还具有更多有关公差,甜甜圈等的选项。

gdal_polygonize这也产生哪些你需要用转换后的多边形ogr2ogr -nlt MULTILINESTRING

缺点是,除非您使用的是Linux或Mac OsX系统,否则您需要自己进行编译。


不幸的是,它失败并显示错误消息:“分段错误(核心已转储)”。我猜我的文件太大或更精确,它将产生太多的小多边形。
通用韦弗2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.