Sp:: over() для точки в многоугольном анализе
У меня есть шейп файл с именем "ind_adm" и SpatialPointsDataFrame, называемый "pnts". "Pnts" содержит точки, созданные случайным образом, а некоторые точки перекрываются с многоугольником. См. Рисунок ниже.
![enter image description here]()
Теперь я хочу сделать точку в анализе полигонов, т.е. я хочу узнать, какие точки лежат внутри серого многоугольника, представляющего границу Индии. Для этого я использую функцию over() в библиотеке sp.
pt.in.poly <- sp::over(ind_adm, pnts, fn = mean) #do the join
Однако вывод, который я получаю,
>pt.in.poly
values
0 6.019467
Я должен фактически получить индекс точек, находящихся в "полигоне".
Где я иду не так?
Ответы
Ответ 1
Вы не должны предоставлять функцию. Вы агрегируете значения атрибутов ваших точек над геометрией многоугольника (т.е. Возвращаемое число - это mean
атрибута точек, попадающих в многоугольник). Кроме того, у вас есть x
и y
неправильный путь для того, что вы хотите сделать. Должно быть...
over( pnts , ind_adm , fn = NULL)
Ответ 2
Вы можете использовать пакет point.in.poly
fom spatialEco
. Он "пересекает точечные и многоугольные классы объектов и добавляет атрибуты многоугольника к точкам".
library(spatialEco)
new_shape <- point.in.poly(pnts, ind_adm)
Ответ 3
Нашел этот краткий и интуитивно понятный синтаксис:
pnts[ind_adm,]
from this Вступительный документ
Ответ 4
Вы также можете использовать функцию st_intersection
из пакета sf
:
Загрузить библиотеку
library(sf)
Создайте простую геометрию объекта (многоугольник) из вашего многоугольника
ind_adm <- st_as_sf(ind_adm)
Создайте простую геометрию объекта (точки) из ваших интересных объектов
(24047 - код EPSG для Индии)
pnts <- st_as_sf(pnts) %>% st_set_crs(., 24047)
Сохранять только точки внутри многоугольника
kept_points <- st_intersection(ind_adm, pnts)