6 votos

Distancia espacial entre polígono y puntos usando R?

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é

4voto

shsteimer Puntos 8749

Podrías hacer polígonos a superposiciones de polígonos usando sp con rgeos. Necesitará cargar rgeos después de cargar sp.

 >library(rgeos)
>over(polygon1, polygon2)
 

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X