2017-05-24 41 views
1

我有一个城市的shapefile文件,它给了我它的地图,完全除以“方块”。我也可以用ggplot2包中的fortify函数将此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”)中,因为它位于经度和纬度的区间内,使得这个方形的边界成为边界。这是我想要在我的数据集中找出的答案。

我一直在寻找一段时间的答案,我到目前为止没有任何地方。我真的相信一些软件包必须做到这一点,但我还没有找到它,或者我一定找到了类似的解决方案,并且无法扩展到我的案例。希望我解释得很好。任何人都有建议?

回答

1

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

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中:或者具有多个点(例如,多个点),例如,空间点#1落入空间多边形SQ2中。空间点#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及其晕影:当左手侧的类型是“SpatialPoints “并且右侧是类型”SpatialPolygons“,则over

返回长度等于点数的数值向量; 号码是点号为 的y的多边形的索引(号码); NA表示该点不落入多边形;如果点 落在多个多边形中,则记录最后一个多边形。

我也建议您考虑一下https://gis.stackexchange.com这些类型的问题。

+0

非常感谢,@lukeA。但是你知道我怎么不能直观地看到它,但是有一个列告诉我哪个多边形/广场的地址是?我问这个是因为最终的想法是通过正方形来汇总收入(例如)。 –

+0

@Brunaw%spolys'上的'spoints%'的输出就是你的列。您可以将其分配给您的原始数据框,例如'df < - spoints%over%spolys',其中'spoints'是您的地址的坐标,'spolys'是您的形状文件或自定义多边形的多边形。这需要一个'library(sp)'调用,如果它尚未加载。 – lukeA

+0

好的,对不起!我没有看到它。再一次非常感谢你。 –

0

这是另一种解决方案,只需使用point.in.polygonsp。 唯一的问题是,本例中的“多边形”仅作为角点给出,因此必须转换为所有四个点的坐标(因此长和长(rev)(长)的c())。

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

相关问题