Точки пересечения и многоугольники в R

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

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

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


person Jens    schedule 05.09.2010    source источник


Ответы (3)


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

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

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

person Spacedman    schedule 06.09.2010
comment
Спасибо ! Как-то проглядел вторую строчку! Прекрасно работает. но через секунду я опубликую еще один вопрос: что делать, если нужно прикрепить простой data.frame к пространственномуpolygondataframe? - person Jens; 06.09.2010
comment
@spacedman этот ответ устарел! Функция overlay теперь over. Непонятно, к чему относится объект polys во второй строке. - person colin; 05.03.2016

С новым пакетом 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.

person pat-s    schedule 18.05.2017
comment
К сожалению, это не сработало для моего полигона типа SpatialPolygonsDataFrame и SpatialPointsDataFrame. Я получаю сообщение об ошибке: no applicable method for 'st_intersection' applied to an object of class "c('SpatialPointsDataFrame', 'SpatialPoints', 'Spatial', 'SpatialVector') - person yPennylane; 28.06.2018
comment
@yPennylane Вам нужно сделать это с sf объектами. Упомянутые вами классы взяты из пакета sp. Считайте свои данные с помощью пакета sf, то есть с помощью функции st_read(). - person pat-s; 29.06.2018

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

library(spatialEco)

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

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

person rafa.pereira    schedule 26.10.2015
comment
Обратите внимание, что spatialEco::point.in.poly - это просто оболочка sp::over. - person Valentin; 01.09.2017