Подтвердить что ты не робот

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

Я должен фактически получить индекс точек, находящихся в "полигоне".

Где я иду не так?

4b9b3361

Ответ 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)