library(rgeos)
library(sp)
library(maptools)
path <- "E:/data/R/"
crs <- CRS("+init=epsg:4326")
#加载并且绘制出北京行政区划
beijing <- readShapePoly(paste(path,"beijing.shp",sep =""))
proj4string(beijing) <- crs
plot(beijing,axes=TRUE,col="#FFFFBE")
#生成随机点
pntdf = data.frame(
lng = runif(1000,min=115.5,max=117.5),
lat = runif(1000,min=39.5,max=41),
id = 1:1000,
flag = rep(0,1000)
)
pnt <- SpatialPointsDataFrame(pntdf,data = pntdf,proj4string=crs)
#把点绘制上去
points(pnt,pch=20,cex=0.8)
ctpnt = SpatialPoints(data.frame(lon=c(116.391),lat=c(39.906)),
proj4string= crs)
points(ctpnt,pch=18,cex=2,col="red")
ctbf <- gBuffer(ctpnt,id=1,width = 0.2,quadsegs=10)
ctbfxy <- slot(slot(ctbf@polygons[[1]],"Polygons")[[1]],"coords")
lines(x=ctbfxy[,1],y=ctbfxy[,2],col="blue",lwd=3)
最后来查询一下,这个缓冲区内有哪些点:
(这样写循环,是为了了解方法后面的原理,实际遍历是效率最低的方式,正确的方法应该用R语言推荐的矩阵运算,请关注后续的内容,这种方法在实际工作中,不建议使用,下面的雷同)
for (n in 1:length(pnt)){
temppnt = SpatialPoints(data.frame(x=pnt@coords[n,1],
y=pnt@coords[n,2]),
proj4string= crs)
if(gIntersects(temppnt,ctbf)){
pnt@data$flag[n]<- 1
}
}
selPnt <- subset(pnt,pnt@data$flag==1)
points(selPnt,pch=3,col="red")
bjline = Lines(list(Line(cbind(c(115.8,116,116.3,117.2),
c(41,39.7,40.3,39.8)))),ID = "1")
sline = SpatialLines(list(bjline),proj4string=crs)
lineBF = gBuffer(sline,width = 0.2)
pnt@data$flag[] <-0
for (n in 1:length(pnt)){
temppnt = SpatialPoints(data.frame(x=pnt@coords[n,1],
y=pnt@coords[n,2]),
proj4string= crs)
if(gIntersects(temppnt,lineBF)){
pnt@data$flag[n]<- 1
}
}
selPnt <- subset(pnt,pnt@data$flag==1)
plot(beijing,axes=TRUE,col="#FFFFBE")
points(pnt,pch=20,cex=0.8)
lines(sline,lwd=3,col="blue")
bl = slot(slot(lineBF@polygons[[1]],"Polygons")[[1]],"coords")
lines(x=bl[,1],y=bl[,2],col="red",lwd=2)
points(selPnt,pch=3,col="red")