在R中迭代加载大型空间数据集并执行交集

k2fxgqgv  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(99)

我有一个20GB的GeoPackage,我需要与一个小得多的GeoPackage(100MB)相交。如果文件大小较小,那么这将起作用:

library(sf)

BigDataset <- st_read("https://automaticknowledge.org/gb/greenspace/Manchester_greenspace.gpkg") 
Dataset <- st_read("https://automaticknowledge.org/gb/wards/Manchester_wards.gpkg")

Intersection <- Dataset %>%
    st_intersection(., BigDataset) %>%
    st_collection_extract(., "POLYGON")

然而,由于20GB文件的大小,我的R会话崩溃了。有没有一种方法可以一次只迭代加载20GB GeoPackage的一部分(比如将其分块为1000个行组),并在加载和处理所有数据后最终生成单个“Intersection”输出之前对每个块执行交集?

eit6fx6z

eit6fx6z1#

你很幸运,你正在处理geopackages。对于一个geopackage是一个数据库(sqlite是技术性的),可以使用SQL查询。
考虑这段代码;它的作用是:

  • 首先,它创建一个geopackage(您的原始代码不是完全可复制的)
  • 列出了数据库的层,以便您了解如何构造from子句
  • 执行SQL查询,选择5到17行之间的行;当然,这些数字是任意的,您需要提供自己的数字

要构造用于迭代的sql代码,请考虑使用{glue}包。
此外,这可能有点超出范围,应该可以使用空间SQL函数完全在数据库中执行操作,省略内存受限的R。

library(sf)

# load the much loved North Carollina shapefile
shape <- st_read(system.file("shape/nc.shp", package="sf"))

# create a geopackage, any geopackage...
st_write(shape, "nc.gpkg")

# to know your layers & construct your from clause
st_layers("nc.gpkg")

iter_read <- st_read("nc.gpkg", query = "select * from nc where rowid between 5 and 17;")

相关问题