Как подобрать информацию о ближайшем ассоциированном многоугольнике к точкам, используя R? - PullRequest
6 голосов
/ 11 января 2012

Я выясняю, как сделать пересечение (пространственное соединение) между точкой и полигонами из шейп-файлов. Моя идея состоит в том, чтобы получить самые близкие точки и те точки, которые полностью совпадают внутри полигонов. В ARGIS есть функция для соответствия, называемая CLOSEST, и они определяются следующим образом: «Сопоставляется объект в объектах объединения, ближайший к целевому объекту. Возможно, что два или более объектов объединения находятся на одинаковом расстоянии от цели При возникновении такой ситуации одна из функций объединения выбирается случайным образом в качестве соответствующей функции. "

У меня есть функция для пересечения точек в многоугольники, она была любезно предоставлена ​​Линдоном Эстесом из списка r-sig-geo, и код работает очень хорошо, когда все многоугольники заполняют всю область. Второй случай известен как расстояние пространственного соединения, а в 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

Я работаю над этим, поэтому любые комментарии или помощь будут очень благодарны!

1 Ответ

1 голос
/ 19 января 2012

У меня есть возможность делать наложения полигонов на полигоны, используя sp и rgeos. Вам нужно будет загрузить rgeos после загрузки sp.

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