Estoy pensando cómo hacer una Intersección (Spatial Join) entre el punto y los polígonos de los shapefiles. Mi idea es conseguir los puntos más cercanos y los puntos que coinciden completamente en el interior de los polígonos. En ArcGIS hay una función para la opción de coincidencia de nombre más CERCANO y se han definido por: "La función de la combinación de las características que está más cerca de una entidad de destino coincide. Es posible que dos o más entidades de unión están a la misma distancia de la entidad de destino. Cuando se produce esta situación, una de las entidades de unión es seleccionado al azar como la función de adaptación."
Tengo una función que se cruzan puntos en polígonos, fue amablemente aportado por Lyndon Estes en el r-sig-geo lista y el código funciona muy bien cuando todos los polígonos se han llenado todas las áreas. El segundo caso se conoce como una unión Espacial distancia y en ArcGIS es saber como se CRUZAN cuando match_option es la más CERCANA, como ArcGIS. Así, usted puede modificar la distancia mínima entre el punto y el polígono cuando el área no está lleno de todos los polígonos, pero no tengo acceso a ArcGIS.
He aquí los datos (directo a mi ftp público) y la función de la primera se CRUZAN:
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)
Compartir algunas ideas con Lyndon Estes, me dijo esto:
Creo que lo más fácil sería poner un buffer alrededor de cada uno de los puntos (puede especificar 50 m si es en coordenadas proyectadas), la conversión de ellos a los polígonos y, a continuación, su tarea se convierte en una intersección de dos diferentes polígonos de los objetos.
No he hecho este tipo de operación en R, pero sospecho que usted pueda encontrar la respuesta con las siguientes funciones:
library(sp) ?over
library(rgeos) ?gBuffer ?gIntersects
Tal vez alguien que tenga una mejor idea sobre el polígono a polígono cruza/superposiciones podría sugerir el método.
Sé que esta función podría ayudar a lograr esto.
library(sp)
?over
library(rgeos)
?gBuffer
?gIntersects
Por otro lado, creo que tal vez hacer que los puntos de mayor podrian ayudar??... pero no estoy seguro!
Cualquier comentario o ayuda sería muy apreciada! gracias de antemano, José