将空间点数据连接到R中的多边形


21

我正在尝试在点数据和面数据之间执行空间连接。

我的csv文件A中有指示事件空间坐标的数据,还有另一个文件shapefile B,该文件以多边形形式包含区域的边界。

head(A)
  month   longitude latitude lsoa_code                   crime_type
1 2014-09 -1.550626 53.59740 E01007359        Anti-social behaviour
2 2014-09 -1.550626 53.59740 E01007359                 Public order
3 2014-09 -1.865236 53.93678 E01010646        Anti-social behaviour

head(B@data)
  code      name                                  altname
0 E05004934 Longfield, New Barn and Southfleet    <NA>
1 E05000448                   Lewisham Central    <NA>
2 E05003149                            Hawcoat    <NA>

我想将犯罪数据A添加到我的shapefile B中,以映射在我的区域A中发生的犯罪事件。不幸的是,由于codeA中的代码所引用的单位不同于B中的代码,因此我无法执行属性连接。

我已经阅读了许多教程和帖子,但找不到答案。我试过了:

joined = over(A, B)

overlay,但没有实现我想要的功能。

有没有办法直接进行这种连接,还是需要从A到另一种格式的中间转换?

从概念上讲,我想选择属于codeB区域的A点(类似于“基于ArcGIS中的空间位置进行连接”)。

有人遇到这个问题并解决了吗?


你看过point.in.polygon()包裹了sp吗?

@ arvi1000我有,将再试一次。我的想法point.in.polygon是,这是否将保留变量monthcrime_type。你知道吗
ben_aaron'3

我尝试了更多,point.in.poly最终选择了属于相关多边形的那些点。谢谢。
ben_aaron 2015年

然后,也许您应该用解决方案回答自己的问题。请记住,这个网站的目的是提供良好的答案。
SlowLearner 2015年

Answers:


8

spatialEco包中的point.in.poly函数返回与sp多边形对象相交的点的SpatialPointsDataFrame对象,并可以选择添加多边形属性。

首先让我们添加require包并创建一些示例数据。

require(spatialEco)
require(sp)
data(meuse)
coordinates(meuse) = ~x+y
sr1=Polygons(list(Polygon(cbind(c(180114, 180553, 181127, 181477, 181294, 181007, 180409,
  180162, 180114), c(332349, 332057, 332342, 333250, 333558, 333676,
  332618, 332413, 332349)))),'1')
sr2=Polygons(list(Polygon(cbind(c(180042, 180545, 180553, 180314, 179955, 179142, 179437,
  179524, 179979, 180042), c(332373, 332026, 331426, 330889, 330683,
  331133, 331623, 332152, 332357, 332373)))),'2')
sr3=Polygons(list(Polygon(cbind(c(179110, 179907, 180433, 180712, 180752, 180329, 179875,
  179668, 179572, 179269, 178879, 178600, 178544, 179046, 179110),
  c(331086, 330620, 330494, 330265, 330075, 330233, 330336, 330004,
  329783, 329665, 329720, 329933, 330478, 331062, 331086)))),'3')
sr4=Polygons(list(Polygon(cbind(c(180304, 180403,179632,179420,180304),
  c(332791, 333204, 333635, 333058, 332791)))),'4')
sr=SpatialPolygons(list(sr1,sr2,sr3,sr4))
srdf=SpatialPolygonsDataFrame(sr, data.frame(row.names=c('1','2','3','4'), PIDS=1:4, y=runif(4)))

现在,让我们快速浏览一下数据并进行绘制。

head(srdf@data)  # polygons
head(meuse@data) # points
plot(srdf)
points(meuse, pch=20)

最后,我们可以将点与多边形相交。结果将是一个SpatialPointsDataFrame对象,在这种情况下,该对象具有srdf多边形数据中包含的两个额外属性(PIDS,y)。

  pts.poly <- point.in.poly(meuse, srdf)
    head(pts.poly@data)

如果多边形数据中没有唯一的标识列,则可以轻松添加一个。

srdf@data$poly.ids <- 1:nrow(srdf) 

一旦将点和多边形相交,就可以使用作为多边形数据中属性的唯一多边形ID来聚合点。

# Number of points in each polygon
tapply(pts.poly@data$lead, pts.poly@data$PIDS, FUN=length)

# Mean lead in each polygon
tapply(pts.poly@data$lead, pts.poly@data$PIDS, FUN=mean)

@ arvi1000,是的,但是sp :: point.in.polygon产生逻辑。spatialEco:point.in.poly是over的包装,但返回一个sp SpatialPointsDataFrame和快捷方式,用于关联多边形属性的某些步骤,就像raster:intersect对rgeos :: gIntersect所做的一样。
Jeffrey Evans

sp::point.in.polygon实际上返回一个数值(0 =点在外部,1 =内部,2 =在边缘,3 =在顶点)。在某些情况下可能是正确的事情。认为在这里注意很有帮助,因为这是相关条款的Google最佳搜索结果
arvi1000 '16

27

over()从软件包中sp可以有些混乱,但效果很好。我假设您已经使用设置了“ A”空间coordinates(A) <- ~longitude+latitude

# Overlay points and extract just the code column: 
a.data <- over(A, B[,"code"])

代替点空间对象,这只是为您提供一个数据框,且编号相同。作为A行,并从B中的每个相交多边形中获得一个变量“代码”。

# Add that data back to A:
A$bcode <- a.data$code

我发现over()多边形顶点的点存在问题,尽管我认为这是到目前为止找到的最简单的解决方案。
JMT2080AD '16

你有什么问题?
Simbamangu '16

排除。我需要进一步探索。今天晚些时候我会为您提供一些数据,如果您感兴趣,我们可以一起查看。我可能是错的,但是我很确定算法中有一些退化需要处理,至少对于我的数据而言。
JMT2080AD '16

没关系。我的数据一定有问题。这个实验装置工作正常。r-fiddle.org/#/fiddle?id=m5sTjE4N&version=1
JMT2080AD '16

1
这是比接受的答案简单得多的方法,并且不需要安装除rgdal之外的其他软件包。
布莱斯·弗兰克

0

这是类似dplyr的解决方案:

library(spdplyr)

ukcounties <- geojsonio::geojson_read("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson",
                                      what = "sp")
pop <- read_excel("data/SAPE20DT7-mid-2017-parlicon-syoa-estimates-unformatted.xls",sheet = "data")
pop <- janitor::clean_names(pop)

ukcounties_pop <- ukcounties %>% inner_join(pop, by = c("pcon18nm" = "pcon11nm"))

人口数据来自:https : //www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/parliamentaryconstituencymidyearpopulationestimates

我不得不将下载的形状文件转换为geoJson:https ://geoportal.statistics.gov.uk/datasets/westminster-parliamentary-constituencies-december-2018-uk-bgc/data ? page =1

您可以通过以下方式进行操作:

uk_constituencies <- readOGR("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC.shp")
uk_constituencies # this is in tmerc format. we need to convert it to WGS84 required by geoJson format.

# First Convert to Longitude / Latitude with WGS84 Coordinate System
wgs84 = '+proj=longlat +datum=WGS84'
uk_constituencies_trans <- spTransform(uk_constituencies, CRS(wgs84))

# Convert from Spatial Dataframe to GeoJSON
uk_constituencies_json <- geojson_json(uk_constituencies_trans)

# Save as GeoJSON file on the file system.
geojson_write(uk_constituencies_json, file = "data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson")

#read back in:
ukcounties <- geojsonio::geojson_read("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson",
                                      what = "sp")
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.