查找地图中的点所在的多边形

时间:2017-05-24 23:35:53

标签: r google-maps geocoding

我有一个城市的shapefile,它给了我它的地图,完全除以“正方形”。我还可以使用fortify包中的ggplot2函数在简单的data.frame中转换此shapefile。到现在为止还挺好。

他们我有一个包含12.000个地址的数据集,所有地址都来自这个城市,每个地址都有适当的纬度和经度,以及其他变量,例如收入/地址。但我没有的是每个地址属于哪个方格的信息。当我绘制一张地图时,一层有shapefile,另一层有点代表收入,它的浓度非常清楚。但我想知道每个地址落入何处(在哪个方格中)的确切信息。

现在,我将尝试用一些数据来说明一点。假设我们有类似的东西:

lat <- 5:12
long <- c(9, 10, 11, 11, 12, 12, 13, 12)
square <- c("SQ1", "SQ1", "SQ2", "SQ2", "SQ2", "SQ3", "SQ3", "SQ3")
cbind(lat, long, square) 

(非常虚假的数据)

结果是:

     lat  long square
[1,] "5"  "9"  "SQ1" 
[2,] "6"  "10" "SQ1" 
[3,] "7"  "11" "SQ2" 
[4,] "8"  "11" "SQ2" 
[5,] "9"  "12" "SQ2" 
[6,] "10" "12" "SQ3" 
[7,] "11" "13" "SQ3" 
[8,] "12" "12" "SQ3"

如果我有一个观察点,例如lat = 5.5long = 9.5,我知道这是一个落入方阵1(“SQ1”)的点,因为它位于纬度和经度的区间内制作这个广场的边界。这是我想在我的数据集中弄清楚的。

我一直在寻找答案已有一段时间了,到目前为止我无处可去。我真的相信一些包已经必须这样做,但我还没有找到它,或者我必须找到一个类似的解决方案,并且无法扩展到我的情况。希望我已经解释得很好。有人有建议吗?

2 个答案:

答案 0 :(得分:2)

很高兴听到您设法将大部分地址转换为地理坐标。现在,给出您的示例数据

lat <- 5:12
long <- c(9, 10, 11, 11, 12, 12, 13, 12)
square <- c("SQ1", "SQ1", "SQ2", "SQ2", "SQ2", "SQ3", "SQ3", "SQ3")
df <- cbind.data.frame(long, lat, square) 

和R的空间数据表示,例如:

lst <- split(df[,-3], df[,3])
polys <- lapply(seq_along(lst), function(x) Polygons(list(Polygon(lst[[x]])), names(lst)[x]))
spolys <- SpatialPolygons(polys)
spoint <- SpatialPoints(cbind(long = 11.5, lat = 8))

plot(spolys)
plot(spoint, add=T, col="red")

您可以使用sp::over / %over%来查看哪些点属于哪些多边形。在上面的例子中,空间点#1属于空间多边形SQ2:

spoint %over% spolys
# 1 
# 2 

或者有多个点,例如空间点#1落入空间多边形SQ2,空间点#2落入空间多边形SQ3:

spoints <- SpatialPoints(data.frame(long = c(11.5,12.5), lat = c(8,11)))
plot(spoints, add=T, col="blue")
spoints %over% spolys
# 1 2 
# 2 3

同时查看帮助?sp::over及其插图:左侧是&#34; SpatialPoints&#34;右侧属于&#34; SpatialPolygons&#34;,然后是over

  

返回一个长度等于点数的数字向量;该   number是y的多边形的索引(数字),其中有一个点   下降; NA表示该点不落在多边形中;如果一点   落在多个多边形中,记录最后一个多边形。

我还建议您查看https://gis.stackexchange.com这些类型的问题。

答案 1 :(得分:0)

这是另一种解决方案,只使用point.in.polygon中的sp。 唯一的麻烦是这个例子中的'多边形'只作为角点给出,因此必须转换为所有四个点的坐标(因此c()长和转(长))。 / p>

df <- read.table(text="long lat square
9   5    SQ1
10   6    SQ1
11   7    SQ2
11   8    SQ2
12   9    SQ2
12  10    SQ3
13  11    SQ3
12  12    SQ3", header=TRUE)

dfsp <- split(df, df$square)
library(sp)

sapply(dfsp, function(x)point.in.polygon(9.5, 5.5, 
   c(x$long,rev(x$long)), rep(x$lat, each=2)))

为点(9.5,5.5)所在的方格提供1

相关问题