R中的相交点和多边形

Jen*_*ens 11 r spatial shapefile intersect

我在R中使用shapefile ,一个是point.shp,另一个是polygon.shp.现在,我想将点与多边形相交,这意味着多边形中的所有值都应该附加到point.shp的表中.

我在包sp中尝试了overlay()和spRbind,但没有做我期望他们做的事情.

谁能给我一个提示?

pat*_*t-s 14

使用新的sf包,现在可以快速简便地使用:

library(sf)
out <- st_intersection(points, poly)
Run Code Online (Sandbox Code Playgroud)

其他选项

如果您不希望多边形中的所有字段都添加到点要素中,则只需dplyr::select()在以下位置调用面要素:

library(magrittr)
library(dplyr)
library(sf)

poly %>% 
  select(column-name1, column-name2, etc.) -> poly

out <- st_intersection(points, poly)
Run Code Online (Sandbox Code Playgroud)

如果遇到问题,请确保多边形有效:

st_is_valid(poly)
Run Code Online (Sandbox Code Playgroud)

如果您FALSE在此处看到某些输出,请尝试使其有效:

poly <- st_make_valid(poly) 
Run Code Online (Sandbox Code Playgroud)

请注意,这些"有效"函数取决于使用sf编译的安装liblwgeom.

  • @yPennylane 您需要使用 `sf` 对象来执行此操作。您提到的类来自包`sp`。使用`sf` 包读入你的数据,即使用`st_read()` 函数。 (2认同)

Spa*_*man 13

如果你这样做overlay(pts, polys)pts是一个SpatialPointsDataFrame对象而多边形是一个SpatialPolygonsDataFrame对象,那么你得到的矢量长度与给出多边形数据帧行的点的长度相同.因此,您需要做的就是将多边形数据组合到点数据框上:

 o = overlay(pts, polys)
 pts@data = cbind(pts@data, polys[o,])
Run Code Online (Sandbox Code Playgroud)

然而!如果你的任何一个点落在你的所有多边形之外,那么叠加会返回一个NA,这将导致多边形[o,]失败,所以要么确保你的所有点都在多边形内,要么你必须考虑另一种分配方式多边形之外的点的值...

  • @spacedman这个答案已被弃用!`overlay`函数现在`over`.不清楚你的第二行中的`polys`对象是指什么. (7认同)