Пересекающиеся точки и многоугольники в R - PullRequest
10 голосов
/ 06 сентября 2010

Я работаю с шейп-файлами в R , один - это point.shp, другой - это polygon.shp.Теперь я хотел бы пересечь точки с многоугольником, что означает, что все значения из многоугольника должны быть присоединены к таблице point.shp.

Я пробовал overlay () и spRbind в пакете sp,но ничто не сделало то, что я ожидал от них.

Может ли кто-нибудь дать мне подсказку?

Ответы [ 3 ]

13 голосов
/ 06 сентября 2010

Если вы сделаете overlay(pts, polys), где pts - это объект SpatialPointsDataFrame, а polys - объект SpatialPolygonsDataFrame, тогда вы получите вектор такой же длины, что и точки, дающие строку фрейма данных полигонов.Поэтому все, что вам нужно сделать, чтобы объединить данные многоугольника во фрейм данных точек:

 o = overlay(pts, polys)
 pts@data = cbind(pts@data, polys[o,])

ОДНАКО!Если какая-либо из ваших точек выходит за пределы всех ваших многоугольников, то оверлей возвращает NA, что приведет к сбою polys [o,], поэтому либо убедитесь, что все ваши точки находятся внутри многоугольников, либо вам придется подумать о другом способе назначениязначения для точек вне многоугольника ...

12 голосов
/ 18 мая 2017

С новым пакетом sf это теперь быстро и просто:

library(sf)
out <- st_intersection(points, poly)

Дополнительные опции

Если вы не хотите, чтобы все поля из многоугольника добавлялись вточечный объект, просто позвоните dplyr::select() на объект полигона до:

library(magrittr)
library(dplyr)
library(sf)

poly %>% 
  select(column-name1, column-name2, etc.) -> poly

out <- st_intersection(points, poly)

Если у вас возникнут проблемы, убедитесь, что ваш полигон действителен:

st_is_valid(poly)

Если вы видитеFALSE выводит здесь, попробуйте сделать его действительным:

poly <- st_make_valid(poly) 

Обратите внимание, что эти «действительные» функции зависят от sf установки, скомпилированной с liblwgeom.

4 голосов
/ 26 октября 2015

Вы делаете это в одну строку с пакетом point.in.poly fom spatialEco.

library(spatialEco)

new_shape <- point.in.poly(pts, polys)

из документации: point.in.poly "пересекает классы точек и полигонов и добавляет атрибуты полигонов к точкам".

...