Как найти точку, относящуюся к набору координат?

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

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

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

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

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

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


person mefju    schedule 08.02.2012    source источник
comment
Внутри квадрата легко. В остальном я не совсем понимаю, о чем вы спрашиваете. Вы хотите, чтобы выбросы были наиболее резкими?   -  person Ari B. Friedman    schedule 08.02.2012
comment
Ознакомьтесь с функцией distanceFromPoints в растровой библиотеке.   -  person blindjesse    schedule 09.02.2012


Ответы (2)


Вот пример, который использует несколько функций (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)

введите описание изображения здесь

person Josh O'Brien    schedule 08.02.2012

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

Итак, если вы вычисляете мозаику Вороного, а затем используете 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])
}

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

person Spacedman    schedule 08.02.2012
comment
Умная! Спасибо за это. Я уверен, что вы правы в отношении самой удаленной точки, находящейся в одной из вершин плиток Вороного, с одним незначительным дополнением: она также может находиться в одном из четырех углов коробки. Чтобы проверить и это, вы можете добавить это сразу после первоначального назначения vpts: vpts <- rbind(vpts, as.matrix(expand.grid(c(xmin, xmax), c(ymin, ymax)))). - person Josh O'Brien; 10.02.2012
comment
Готово, и матрица тоже не дублируется. Я не знал, что duplicated () работает со строками. Сладкий. - person Spacedman; 10.02.2012