Как найти точку, связанную с набором координат? - PullRequest
3 голосов
/ 08 февраля 2012

У меня есть набор из примерно 5000 географических (WGS84) координат.Все они находятся внутри 40-километрового квадрата.

Есть ли алгоритм / функция R для нахождения точки внутри квадрата, а не в данном наборе, дальше всего от любой точки из набора?

Я имею в виду, какчтобы найти точку в квадрате, где расстояние до ближайшей точки из набора составляет самый длинный ?

Теперь я делаю это, генерируя сетку координат, расположенных на равном расстоянии, и определяя расстояние от каждой точки сетки доБлижайшее заданное значение.Есть ли какой-либо менее числовой / не метод грубой силы?

РЕДАКТИРОВАТЬ: я сделал ошибку в предыдущей версии вопроса.Может быть, это поможет:

Набор точек - это координаты 5000 магазинов в городе.Я хочу найти место в городе, где расстояние до ближайшего магазина самое большое.

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012

Я думаю , что если искомая точка находится не на краю рамки, то она должна быть в вершине тесселяции вороной точек.Если он находится на краю ящика, он должен находиться на пересечении ящика и на краю тесселяции вороной.

Так что если вы вычисляете тесселяцию вороной, а затем используете rgeos, чтобы пересечь его скоробка, которая дает вам набор возможных точек.Затем вы можете использовать пакет FNN для вычисления соседних расстояний от этих возможных точек до точек данных, сортировки и поиска возможной точки с наибольшим ближайшим соседом.

Это дает вам точную точку без каких-либоGridding бизнес.Если бы это не было так близко ко сну, я бы разобрался с кодом, чтобы это сделать.Вы, вероятно, хотите пакет deldir или тесселяции вороной.Это может даже пересечь коробку ...

Ладно, не совсем перед сном.Вот решение:

findM <- function(pts,xmin,xmax,ymin,ymax){
  require(deldir)
  require(FNN)
  d = deldir(pts[,1],pts[,2],rw=c(xmin,xmax,ymin,ymax))

  vpts = rbind(as.matrix(d$dirsgs[,1:2]),as.matrix(d$dirsgs[,3:4]))
  vpts = rbind(vpts,cbind(c(xmin,xmax,xmin,xmax),c(ymin,ymin,ymax,ymax)))
  vpts = vpts[!duplicated(vpts),]

  nn = get.knnx(pts,vpts,k=1)
  ptmin = which(nn$nn.dist==max(nn$nn.dist))

  list(point = vpts[ptmin,,drop=FALSE], dist = nn$nn.dist[ptmin])
}

Отредактированная версия теперь возвращает одну точку и добавляет угловые точки как возможные.

2 голосов
/ 09 февраля 2012

Вот пример, который использует несколько функций (distanceFromPoints(), maxValue(), Which() и xyFromCell()) из пакета raster для выполнения ключевых вычислений:

# Load required libraries
library(sp)
library(rgdal)
library(raster)

# Create a SpatialPoints object with 10 points randomly sampled from
# the area lying between longitudes 0 and 1 and latitudes 0 and 1
bbox <- matrix(c(0,0,1,1), ncol=2, dimnames = list(NULL, c("min", "max")))
PRJ4 <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84")
S <- Spatial(bbox = bbox, proj4string = PRJ4)
SP <- spsample(S, 10, type="random")

# Create a raster object covering the same area
R <- raster(extent(bbox), nrow=100, ncol=100, crs=PRJ4)

# Find the coordinates of the cell that is farthest from all of the points
D <- distanceFromPoints(object = R, xy = SP) 
IDmaxD <- Which(D == maxValue(D), cells=TRUE)
(XY <- xyFromCell(D, IDmaxD))
#          x     y
# [1,] 0.005 0.795

# Plot the results
plot(D, main = "Distance map, with most distant cell in red")
points(SP)
points(XY, col="red", pch=16, cex=2)

enter image description here

...