2012-02-08 4 views
3

私は、約5000の地理的座標(WGS84)の座標を持っています。それらのすべては40km四方にあります。座標のセットに関連するポイントを見つけるには?

ポイントから、正方形の中にあり、与えられたセットではなく、セットからの任意のポイントから最も離れたアルゴリズム/ R関数がありますか?

私は、セットから最も近い点までの距離がで最も長い点を見つける方法を意味します

ここでは、等間隔の座標のグリッドを生成し、各グリッドポイントから最も近い設定ポイントまでの距離を見つけることで行います。数値が少ないかブルートフォース方式ではありませんか?

編集: 私は以前のバージョンの質問で間違いました。多分これは助けになるでしょう:

市の5000店の座標です。一番近い店との距離が一番長い街を見つけたいここで

+2

正方形内部は簡単です。残りの部分はあなたが何を求めているか全く分かりません。あなたは異常値の中で最も異常なyを望んでいますか? –

+0

ラスタライブラリのdistanceFromPoints関数を確認してください。 – blindjesse

答えて

2

は、キーの計算を実行するためにrasterパッケージからいくつかの機能(distanceFromPoints()maxValue()Which()、およびxyFromCell())を使用する例です:

# 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

3

私はあればと思いポイントのボロノイの頂点になければなりません。それがボックスの端にある場合、それはボックスとボロノイの切り取りの端の交点上になければなりません。

ボロノイのテッセレーションを計算してから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]) 
} 

編集されたバージョンは、今一点を返し、possiblesとコーナーポイントを追加します。

+0

賢い!ありがとう。 Voronoiのタイルの頂点の1つに最も遠い点があることは間違いありませんが、1つの小さな追加点があります。それはボックスの四隅の1つにある可能性もあります。これらを確認するには、最初にvptsに代入した直後にこれを追加することもできます:vpts < - rbind(vpts、as.matrix(expand.grid(cminmin)、xmax)、c(ymin、ymax)) )) ')。 –

+0

完了し、マトリックスも複製しません。私は重複行が行に作用しているのを知らなかった。甘い。 – Spacedman

関連する問題