微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

慢R函数rgeos :: gWithin用于多边形分析中的点

如何解决慢R函数rgeos :: gWithin用于多边形分析中的点

我有一个名为“ polygon”的shapefile和一个名为“ Points”的SpatialPointsDataFrame。 “点”包含60k +行,“多边形”是一个很大的shapefile,在大约30k km ^ 2的区域中稀疏了许多几何图形。 现在,我要在这种情况下在“点”中创建一个新列:如果点在多边形内,则如果不写“ B”,则写“ A”。

我正在尝试附加的脚本,但是我意识到rgeos::gWithin的运行速度过慢。 我还尝试了功能sp::over(但这不会返回True / False输出,并且我不知道如何实现目标)。

对于单行sp::over(Points[1],polygon)耗时7秒,而gWithin(Points[1],polygon)则耗时35秒:因此在整个数据帧上应用for循环将永远花费。

任何帮助将不胜感激。

# SpatialPointsDataframe from dataframe
Points <- dataframe
coordinates(Points) <- ~x+y
proj4string(Points) <- CRS("+init=epsg:32632")
Points <- spTransform(Points,CRS("+init=epsg:32632"))


# Loading the shapefile
polygon <- readOGR(dsn = "...",layer = "polygon")
polygon <-spTransform(polygon,CRS("+init=epsg:32632")) 


# Evaluating time taken applying function to a single row (~ 35 sec)
start.time <- Sys.time()

sp::over(Points[1],polygon)

end.time <- Sys.time()
Time.taken <- round(end.time -start.time,2)
Time.taken


# If I run a for-loop on 60k rows it wil take forever
for (i in seq_along(Points)){ 
  Points$new_column[i] <- ifelse(gWithin(Points[i],polygon),"A","B")
}

dataframe2 <- as.data.frame(Points)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。