2017-04-05 4 views
1

"Nearest Neighbor"問題は、空間データを扱うときに非常に一般的です。Sql Serverの複数のソースの「最近隣」を計算するには?

MS Sql Serverでドキュメントを作成する方法については、nice, simple documentationもあります。

私は通常、1xソースLat/Longを使用している例を見ていて、最近隣のLat/Longの 'x'個の数値を返します。ファイン...

私の場合は

USE AdventureWorks2012 
GO 
DECLARE @g geography = 'POINT(-121.626 47.8315)'; 
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address 
WHERE SpatialLocation.STDistance(@g) IS NOT NULL 
ORDER BY SpatialLocation.STDistance(@g); 

、私は複数緯度/経度情報源を持っている...と各ソースのために、最近傍の「x」の数を返す必要があります。

だから誰か助けてもらえますか?

は、ここに私のスキーマ

Table: SomeGeogBoundaries 
LocationId INTEGER PRIMARY KEY (it's not an identity, but a PK & FK) 
CentrePoint GEOGRAPHY 

Index: 
Spatial Index on CentrePoint column. [Geography || MEDIUM, MEDIUM, HIGH, HIGH] 

サンプルデータです。

LocationId | CP Lat/Long 
1   | 10,10 
2   | 11,11 
3   | 20,20 

.. 

この表のforeachの場所は、私が最も近い..たとえば5つの他の場所を見つける必要があります。

UPDATE:

は、これまでのところ...それはCURSORを使用してのように見えますが、唯一の方法です..しかし、私はベースのソリューションを設定し、よりに開いている...あなたが見つける必要がある

答えて

1

同じセット内の最も近い隣人?

SELECT * 
FROM SomeGeogBoundaries as b 
OUTER APPLY (
    SELECT TOP(5) CentrePoint 
    FROM SomeGeogBoundaries as t 
    WHERE t.CentrePoint.STInsersects(b.CentrePoint.STBuffer(100)) 
    ORDER by b.CentrePoint.STDistance(t.CentrePoint) 
) AS nn 

2つの音符。

  1. outer applywhere句は、互いに100メートル以内である(この場合)の点(あなたが母国単位数量メートルSRIDを使用していると仮定して)への検索を制限することです。それはあなたのために適切かもしれません。そうでない場合は、where句を省略してください。

  2. 私はこれがだと思います。カーソルです。 dbエンジンには多くの選択肢がありますが、テーブルを反復して各行に対してapplyを評価するということを確認するためには、declare cursorという文があるからといって自分自身をだましてはいけません。

+0

Sweet!最初にカーソルを移動しました.1時間半かかりました。その後、あなたのコードでカーソルを置き換え、58分かかりました。だから基本的に同じ。あなたが示唆したように、おそらくそれは内部的にカーソルだったからでしょう。また、空間インデックスを使用していることを確認するために、where節を 't.CP.STDistance(b.CP)IS NOT NULL'に置き換えたので、空間インデックスを使用していたと仮定しています。 –

関連する問題