有时候我们需要通过经纬度判断点是否在行政区内,这个问题的解答分为3步。
1.获取点的坐标,这些一般来自于系统的自动抓取,主要记录事件发生的地理位置。这可能涉及不同坐标系的转换。
2.获取行政区多边形信息,可利用百度地图API,用以下脚本
获取地区轮廓线
输入省、直辖市或县名称:
3
3.批量判断点是否在多边形内。这里主要用到了R的spatialEco包里面的point.in.poly函数
require(sp)
data(meuse)
coordinates(meuse) = ~x+y
meuse@data$test.na <- NA
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)))),'10') #这些为多边形的坐标点, 第一列为经度信息,第二列为纬度信息
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)))),'20')
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)))),'30')
sr4=Polygons(list(Polygon(cbind(c(180304, 180403,179632,179420,180304),
c(332791, 333204, 333635, 333058, 332791)))),'40')
sr=SpatialPolygons(list(sr1,sr2,sr3,sr4)) #这里将多边形信息放到同一个list里面
polys=SpatialPolygonsDataFrame(sr, data.frame(row.names=c('10','20','30','40'),
PIDS=1:4, y=runif(4))) #此处通过row.names和上面的多边形匹配,加入PIDS作为多边形的标签,可以是行政区名字
polys@data$pid <- polys@data$PIDS + 100
plot(polys)
plot(meuse, pch=19, add=TRUE)
pts.poly <- point.in.poly(meuse, polys)
head(pts.poly@data)
#我们获得的数据可能只有经纬度信息,但是匹配的时候,需要转换成坐标信息,此时,需要利用下面的函数
spdata1 <- SpatialPointsDataFrame(userdata[,c('user_lng','user_lat')], userdata, match.ID = F)
原始数据是这样的,
匹配完之后,我们可以看到, 原始数据中匹配到了PIDS信息。
这就完成了