首页 > 解决方案 > 使用 R 对 1 亿个点进行空间连接

问题描述

我有一个包含 1 亿个点的数据集。我需要在空间上将它们连接到它们相交的区域。我正在使用sfand st_join,但不出所料,当我尝试执行此操作时,我的机器内存不足。

为了解决这个问题,我将我的数据拆分为更易于管理的大小并循环遍历它们以获得我想要的结果。但是,我想看看是否有更聪明的方法来实现我的最终目标(将区域 ID 附加到我的原始数据中)。

require("data.table")
require("dplyr")
require("sf")

DT <- data.table(X=runif(100000000, min=300000, max=500000),
                 Y=runif(100000000, min=200000, max=400000),
                 UID = 1:100000000,
                 Group = rep(1:50, each=100000000/50))
                             
Polygon <- st_read("https://ons-inspire.esriuk.com/arcgis/services/Administrative_Boundaries/Regions_December_2019_Boundaries_EN_BFE/MapServer/WFSServer?request=GetCapabilities&service=WFS") %>%
        select(-gml_id) %>%
        st_cast(., "GEOMETRYCOLLECTION") %>%
        st_collection_extract(., "POLYGON") %>% 
        group_by(across(1:(ncol(.)-1))) %>%
        summarise() %>%
        st_cast("MULTIPOLYGON") %>%
        ungroup()

DT_Split <- split(DT, by=c("Group"))

DT_Joined <- data.table()
    for (i in 1:length(DT_Split)){
    DT_Join <- st_join(st_as_sf(DT_Split[[i]], coords = c("X","Y"),crs=27700), Polygon, join = st_intersects)
    DT_Split_Join <- DT_Join %>% st_drop_geometry %>% as.data.table
    DT_Joined <- rbindlist(list(DT_Joined, DT_Split_Join))
    }

标签: rdata.tablespatialsf

解决方案


推荐阅读