Подмножество пространственных точек для выделения точек внутри многоугольника (границы стран)

У меня есть 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)

Я хотел бы выбрать для df только точки внутри border,

Как я могу это сделать?

Примечание: в моем воспроизводимом примере dfпервая точка входа находится внутри, вторая явно снаружи, а третья снаружи, но близко к побережью.

1 ответ

Решение

Хотя я считаю, что пост, на который я ссылался, отвечает на этот вопрос, я думаю, что некоторые пояснения необходимы; следовательно, отправив ответ.

Чтобы найти пересечение двух географических объектов, нам нужно иметь одинаковую проекцию. Библиотека SP помогает нам в этом. Убедитесь, что вы указали долготу и широту в нужном месте:

sp::SpatialPoints(c(my_point$long,my_point$lat),proj4string=CRS(proj4string(my_raster)))

Используя библиотеку rgeos, мы можем проверить, есть ли пересечение между двумя пространственными наборами данных / объектами:

rgeos::gContains(my_raster,my_projected_point)

Итак, вот как это работает на примере ОП:

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 https://stackru.com/questions/21971447
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)

введите описание изображения здесь

Другие вопросы по тегам