2015-02-07 2 views
0

Я хотел бы найти минимальное расстояние между точками и границей полигона (все точки лежат внутри многоугольника). Если это возможно, как я могу извлечь значения ?, поэтому я могу найти корреляцию между числами индивидуумов и расстоянием от границы.Поиск минимального расстояния между всеми точками и границей полигона

Полигон находится в формате .SHP и указывает на координаты X/Y.

Любые недостающие данные, пожалуйста, дайте мне знать! Ваша помощь очень ценится!

ответ

2

Пакет spatstat имеет функцию nncross, которая находит ближайший сосед между двумя наборами точек или одним набором точек и набором сегментов.

Это сравнительно легко загрузить набор х/у значений для создания spatstat объекта точки шаблона: если X и Y являются два вектора, содержащих ваши координаты, вы можете создать объект точки шаблона с

library(spatstat) 
p = ppp(x,y) 

Вам необходимо преобразовать ваши данные shp в объект шаблона сегмента сплюста. Для этого вы можете загрузить файл SHP с командами из maptools и чем конвертировать в spatstat объект:

library(maptools) 
shp = readShapeSpatial("yourdata.shp") #read shp file 
shp = as.psp(shp) # convert to psp object 

Для расчета ближайшего соседа расстояния, вы должны использовать nncross

nncross(p,shp) 
+0

У меня не возникло проблем с созданием объекта .ppp, но когда я попытался преобразовать .shp-файл в .psp, появляется сообщение об ошибке: Ошибка в as.psp.default (shp): Невозможно интерпретировать x как шаблон линейного сегмента Любое предложение? –

+0

есть документ [здесь] (http://cran.r-project.org/web/packages/spatstat/vignettes/shapefiles.pdf), который может вам помочь. Вероятно, существует проблема с тем, как maptools распознает ваш shp. Каков класс() ваших данных после 'readShapeSpatial()'? – xraynaud

+0

класс [1] «SpatialPolygonsDataFrame» –

5

единицы квадратной многоугольник:

library(sp) 
x = cbind(c(0,1,1,0,0),c(0,0,1,1,0)) 
pol = SpatialPolygons(list(Polygons(list(Polygon(x)), "ID"))) 

случайные точки в единичном квадрате:

set.seed(131) 
pts = SpatialPoints(cbind(runif(10), runif(10))) 
plot(pol) 
points(pts, col = 'red') 

вычислительные расстояния:

library(rgeos) 
gDistance(pts, pol, byid = TRUE) # will be 0, all inside 
gDistance(pts, as(pol, "SpatialLines"), byid = TRUE) # dist to line 

добавить в участок:

text(coordinates(pts), 
    as.character(
    round(as.vector(gDistance(pts, as(pol, "SpatialLines"), byid = TRUE)), 3)), 
pos = 4) 

читать данные многоугольников из шейпа в R с помощью readOGR в пакете rgdal

3

Следуйте инструкции @xraynaud (слегка модифицированные):

library(maptools) 
shp = readShapeSpatial("yourdata.shp") #read shp file 
W = as.owin(shp) # convert to owin object 

library(spatstat) 
p = ppp(x, y, window = W) 

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

d = bdist.points(p) 

Теперь d вектор расстояний.