У меня есть набор из примерно 5000 географических (WGS84) координат. Все они находятся на площади 40 км.
Есть ли какой-либо алгоритм / функция R для поиска точки внутри квадрата, а не в данном наборе, наиболее удаленной от любой точки из набора?
Я имею в виду, как найти точку в квадрате, где расстояние до ближайшей точки от множества будет наибольшим?
Теперь я делаю это, генерируя сетку координат с равным интервалом и определяя расстояние от каждой точки сетки до ближайшей заданной точки. Есть ли какой-нибудь менее числовой / не метод грубой силы?
РЕДАКТИРОВАТЬ: Я допустил ошибку в предыдущей версии вопроса. Может это поможет:
Набор точек - это координаты 5000 магазинов города. Я хочу найти место в городе, где расстояние до ближайшего магазина наибольшее.
Ответ 1 · рейтинг 2 · Josh O'Brien
Вот пример, который использует несколько функций (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)
Ответ 2 · рейтинг 3 · Spacedman
Я думаю, что если точка, которую вы ищете, не находится на краю прямоугольника, то она должна быть в вершине мозаики Вороного точек. Если он находится на краю бокса, то он должен быть на пересечении бокса и края мозаики Вороного.
Итак, если вы вычисляете мозаику Вороного, а затем используете rgeos, чтобы пересечь ее с прямоугольником, это дает вам набор возможных точек. Затем вы можете использовать пакет FNN для вычисления соседних расстояний от этих возможных точек до точек данных, сортировки и поиска возможной точки с самым большим ближайшим соседом.
Это дает вам точную точку без всякой привязки к сетке. Если бы это было не так близко ко сну, я бы нашел какой-нибудь код, чтобы это сделать. Возможно, вам понадобится пакет deldir или мозаика voronoi. Возможно, он даже уже пересекает прямоугольник ...
Ладно, еще не время ложиться спать. Вот решение:
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])
}
Отредактированная версия теперь возвращает одну точку и добавляет угловые точки по мере возможности.