Как рассчитать географическое расстояние от полигона? - PullRequest
1 голос
/ 20 декабря 2011

У меня есть шейп-файл с более чем 50-ю различными полигональными формами (представляющими более 50-ти различных областей) и 10000-ю точками данных, которые должны присутствовать в одной из областей. Дело в том, что более 10000 точек уже закодированы с областью, в которой они должны находиться, и я хочу выяснить, как далеко они находятся от этой кодированной области на геопространственном расстоянии.

Мой текущий подход (код ниже), который включает преобразование шейп-файлов в owin объекты из библиотеки sp и использование distfun, дает мне расстояния в широтном, длинном евклидовом пространстве. Но я хотел бы получить геопространственные расстояния (в конце концов, чтобы преобразовать в км). Куда мне идти дальше?

#basically cribbed from http://cran.r-project.org/web/packages/spatstat/vignettes/shapefiles.pdf (page 9)
shp <- readShapeSpatial("myShapeFile.shp", proj4string=CRS("+proj=longlat +datum=WGS84"))
regions <- lapply(slot(shp, "polygons"), function(x) SpatialPolygons(list(x)))
windows <- lapply(regions, as.owin)

# need to convert this to geo distance
distance_from_region <- function(regionData, regionName) {
    w <- windows[[regionName]]
    regionData$dists <- distfun(w)(regionData$lat, regionData$long)
    regionData
}   

1 Ответ

3 голосов
/ 20 декабря 2011

Я бы проецировал данные в евклидову (или почти евклидову) систему координат - если вы не охватите большую часть земного шара, тогда это возможно. Используйте spTransform из maptools или sp или rgdal (я забыл, какой) и конвертируйте в зону UTM рядом с вашими данными.

Вы также можете добиться большего успеха с пакетом rgeos и функцией gDistance:

 gDistance by default returns the cartesian minimum distance
 between the two geometries in the units of the current projection.

Если ваши данные находятся на большом земном шаре, то ... хитро ... 42 ...

Barry

...