Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: mefjuОтветов: 2

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

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

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

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

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

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

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

rcoordinatesgisgeospatial

Ответы

Ответ 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])
}

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы