如何找到与坐标集相关的点?

时间:2012-02-08 18:20:50

标签: r coordinates gis geospatial

我有一套约5000个地理(WGS84)坐标。所有这些都在40平方公里范围内。

是否有任何算法/ R函数可以找到点,在正方形内而不是在给定集合中,距离集合中的任何点最远?

我的意思是如何在广场中找到距离集合最近点的距离最长的点?

现在我通过生成等间距坐标网格并找到每个网格点到最近设定点的距离来实现。是否有更少的数字/非暴力方法?

编辑: 我在之前版本的问题中犯了错误。也许这会有所帮助:

积分是该市5000家商店的坐标。我想找到距离最近的商店距离最远的城市。

2 个答案:

答案 0 :(得分:3)

认为如果你寻找的点不在盒子的边缘,那么它必须位于点的voronoi tesselation的顶点。如果它在盒子的边缘,那么它必须在盒子和voronoi tesselation边缘的交叉点上。

因此,如果您计算voronoi tesselation然后使用rgeos将其与框相交,则会为您提供一组可能的点。然后,您可以使用FNN包来计算从那些可能点到数据点的相邻距离,排序,并找到最大最近邻居的可能点。

这为您提供了一个没有任何网格化业务的确切点。如果它不是那么接近就寝时间,我会整理一些代码来做到这一点。你可能想要deldir包或voronoi tesselations。它甚至可能已经在盒子交叉点......

好的,不太睡觉。这是解决方案:

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])
}

编辑版现在返回一个点,并尽可能添加角点。

答案 1 :(得分: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)

enter image description here