子集空间点以提取多边形内部的空间点(国家/地区边界)
Subset Spatial Points to Extract those inside of a Polygon (Countries Borders)
我有一个 data.frame 经纬度坐标:
df<-data.frame(
lat=c(40, 30, 40.864),
lon=c(0, 20, 1.274)
)
和一个国家(西班牙)的边界,
library(raster)
border <- getData("GADM",country="Spain",level=0)
我想 select df
只有点 里面 border
。
我该怎么做?
注意: 在我的可重现示例中,df
,第一个入口点在里面,第二个显然在外面第三个在外面但靠近海岸。
虽然我相信我提到的 post 回答了这个问题,但我认为需要做一些澄清;因此,post正在回答。
要找到两个地理特征的交集,我们需要有相同的投影。 sp 图书馆帮助我们做到了这一点。确保将经度和纬度放在正确的位置:
sp::SpatialPoints(c(my_point$long,my_point$lat),proj4string=CRS(proj4string(my_raster)))
使用 rgeos 库我们可以检查两个空间 dataset/feature:
之间是否有交集
rgeos::gContains(my_raster,my_projected_point)
因此,这是 OP 示例的工作原理:
library(sp) #for projection
library(raster) #for getting the border data
library(rgeos) #for finding intersection
library(tidyverse) #for illustration only
#data
border <- getData("GADM",country="Spain",level=0)
df <- data.frame(
lat=c(40, 30, 40.864),
lon=c(0, 20, 1.274)
)
#this is the part that actually check if a point is inside the border
#adapted from
sapply(1:3,function(i)
list(id=i,
intersect= gContains(border,SpatialPoints(df[i,2:1],proj4string=CRS(proj4string(border))))))
# [,1] [,2] [,3]
# id 1 2 3
# intersect TRUE FALSE FALSE
#a map for better understanding
ggplot()+
geom_polygon(data=border, aes(x=long, y=lat, group=group),
fill=NA, color="grey50", size=0.25) +
geom_point(data=df,aes(x=lon,y=lat), color="red", size=1)
我有一个 data.frame 经纬度坐标:
df<-data.frame(
lat=c(40, 30, 40.864),
lon=c(0, 20, 1.274)
)
和一个国家(西班牙)的边界,
library(raster)
border <- getData("GADM",country="Spain",level=0)
我想 select df
只有点 里面 border
。
我该怎么做?
注意: 在我的可重现示例中,df
,第一个入口点在里面,第二个显然在外面第三个在外面但靠近海岸。
虽然我相信我提到的 post 回答了这个问题,但我认为需要做一些澄清;因此,post正在回答。
要找到两个地理特征的交集,我们需要有相同的投影。 sp 图书馆帮助我们做到了这一点。确保将经度和纬度放在正确的位置:
sp::SpatialPoints(c(my_point$long,my_point$lat),proj4string=CRS(proj4string(my_raster)))
使用 rgeos 库我们可以检查两个空间 dataset/feature:
之间是否有交集rgeos::gContains(my_raster,my_projected_point)
因此,这是 OP 示例的工作原理:
library(sp) #for projection
library(raster) #for getting the border data
library(rgeos) #for finding intersection
library(tidyverse) #for illustration only
#data
border <- getData("GADM",country="Spain",level=0)
df <- data.frame(
lat=c(40, 30, 40.864),
lon=c(0, 20, 1.274)
)
#this is the part that actually check if a point is inside the border
#adapted from
sapply(1:3,function(i)
list(id=i,
intersect= gContains(border,SpatialPoints(df[i,2:1],proj4string=CRS(proj4string(border))))))
# [,1] [,2] [,3]
# id 1 2 3
# intersect TRUE FALSE FALSE
#a map for better understanding
ggplot()+
geom_polygon(data=border, aes(x=long, y=lat, group=group),
fill=NA, color="grey50", size=0.25) +
geom_point(data=df,aes(x=lon,y=lat), color="red", size=1)