Нахождение минимального расстояния между всеми точками и границей многоугольника

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

Многоугольник имеет формат .SHP и указывает координаты X / Y.

Если информация отсутствует, дайте мне знать! Ваша помощь очень ценится!


person Renzo Ferreira    schedule 07.02.2015    source источник


Ответы (3)


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

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

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

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

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

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

nncross(p,shp)
person xraynaud    schedule 07.02.2015
comment
У меня не было проблем с созданием объекта .ppp, но когда я попытался преобразовать файл .shp в .psp, появляется сообщение об ошибке: Ошибка в as.psp.default (shp): невозможно интерпретировать x как образец сегмента линии Любой предположение? - person Renzo Ferreira; 07.02.2015
comment
здесь может вам помочь. Вероятно, проблема в том, как maptools распознает ваш shp. Каков класс () ваших данных после readShapeSpatial()? - person xraynaud; 07.02.2015
comment
это класс [1] SpatialPolygonsDataFrame - person Renzo Ferreira; 07.02.2015
comment
В какой-то степени это неправильный ответ. Минимальное расстояние между точкой и полилинией не обязательно равно одному из узлов полилинии. Но nncross делает именно это: находит (только) ближайший узел ломаной линии. Что, если я хочу узнать минимальное расстояние до любой точки ломаной линии? - person agoldev; 23.03.2016
comment
Не могли бы вы развить? В моей системе такого поведения нет. Если я создаю сегмент линии psp, используя line = psp(0.25,0.5,0.75,0.5,window=owin(c(0,1),c(0,1))) и набор точек pts = ppp((1:9)/10, rep(0.25,length.out=9)), nncross(pts,line) возвращает 0,25 для всех точек, имеющих 0,25 ›= x-значение› = 0,75. Порядок аргументов важен: nncross(line,pts) возвращает минимальное расстояние между узлами сегмента и одной из точек. - person xraynaud; 29.03.2016

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

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

person Edzer Pebesma    schedule 07.02.2015

Следуйте инструкциям @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 - это вектор расстояний.

person Ege Rubak    schedule 07.02.2015