Я выясняю, как сделать Intersection (Spatial Join) между точками и полигонами из шейп-файлов. Моя идея состоит в том, чтобы получить ближайшие точки и те точки, которые полностью совпадают внутри полигонов. В ARGIS есть функция для опции совпадения под названием CLOSEST и они определяются следующим образом: "Сопоставляется та точка в объединенных функциях, которая ближе всего к целевой точке. Возможно, что два или более соединяемых объектов находятся на одинаковом расстоянии от целевого объекта. Когда такая ситуация возникает, один из соединяемых объектов выбирается случайным образом в качестве совпадающего объекта."
У меня есть функция для пересечения точек в полигоны, она была любезно предоставлена Линдоном Эстесом из списка r-sig-geo, и код работает очень хорошо, когда все полигоны заполняют всю область. Второй случай известен как Spatial join distance и в ArcGIS известен как INTERSECT, если match_option - CLOSEST, как это делает ArcGIS. Таким образом, вы можете изменить минимальное расстояние между точкой и полигоном, когда область не заполнена всеми полигонами.
Вот данные и функция первого INTERSECT:
library(rgeos)
library(sp)
library(maptools)
library(rgdal)
library(sp)
xy.map <- readShapeSpatial("http://www.udec.cl/~jbustosm/points.shp")
manzana.map <- readShapeSpatial("http://www.udec.cl/~jbustosm/manzanas_from.shp" )
IntersectPtWithPoly <- function(x, y) {
# Extracts values from a SpatialPolygonDataFrame with SpatialPointsDataFrame, and appends table (similar to
# ArcGIS intersect)
# Args:
# x: SpatialPoints*Frame
# y: SpatialPolygonsDataFrame
# Returns:
# SpatialPointsDataFrame with appended table of polygon attributes
# Set up overlay with new column of join IDs in x
z <- overlay(y, x)
# Bind captured data to points dataframe
x2 <- cbind(x, z)
# Make it back into a SpatialPointsDataFrame
# Account for different coordinate variable names
if(("coords.x1" %in% colnames(x2)) & ("coords.x2" %in% colnames(x2))) {
coordinates(x2) <- ~coords.x1 + coords.x2
} else if(("x" %in% colnames(x2)) & ("x" %in% colnames(x2))) {
coordinates(x2) <- ~x + y
}
# Reassign its projection if it has one
if(is.na(CRSargs(x@proj4string)) == "FALSE") {
x2@proj4string <- x@proj4string
}
return(x2)
}
test<-IntersectPtWithPoly (xy.map,manzana.map)
Поделившись некоторыми идеями с Линдоном, он сказал мне следующее:
Я думаю, что проще всего было бы поставить буфер вокруг каждой из точек (можно указать 50 м, если это в проецируемых координатах), преобразовав их в полигоны, и тогда ваша задача станет пересечением двух разных полигонных объектов.
Я не делал подобных операций в R, но подозреваю, что вы сможете найти ответ с помощью следующих функций:
library(sp)
?over
library(rgeos)
?gBuffer
?gIntersects
Я предлагаю разместить подмножество ваших данных, иллюстрирующих проблему, а затем, возможно, кто-то другой, кто имеет лучшее представление о пересечениях/наложениях полигонов на полигоны, сможет предложить метод.
нужно сделать радиус точек, которые находятся в шейпфайле, чтобы они попадали в ближайший полигон.
Я знаю, что эта функция может помочь достичь этого.
library(sp)
?over
library(rgeos)
?gBuffer
?gIntersects
Я работаю над этим, поэтому любой комментарий или помощь будут очень признательны!