2 次元データ (マップ上のポイント) でいっぱいのデータベースがあります。各レコードには、ジオメトリ タイプのフィールドがあります。私ができる必要があるのは、k 個の最も近いポイントを返すストアド プロシージャにポイントを渡すことです (k は sproc にも渡されますが、それは簡単です)。http://blogs.msdn.com/isaac/archive/2008/10/23/nearest-neighbors.aspxで単一の最近傍を取得するクエリを見つけましたが、それを拡張する方法がわかりませんk最近隣人を見つけます。
これは現在のクエリT
です。 はテーブル、g
はジオメトリ フィールド、@x
は検索対象のポイント、Numbers
は整数 1 ~nのテーブルです。
DECLARE @start FLOAT = 1000;
WITH NearestPoints AS
(
SELECT TOP(1) WITH TIES *, T.g.STDistance(@x) AS dist
FROM Numbers JOIN T WITH(INDEX(spatial_index))
ON T.g.STDistance(@x) < @start*POWER(2,Numbers.n)
ORDER BY n
)
SELECT TOP(1) * FROM NearestPoints
ORDER BY n, dist
内側のクエリは最も近い空でない領域を選択し、外側のクエリはその領域から上位の結果を選択します。外側のクエリは (eg) に簡単に変更できますがSELECT TOP(20)
、最も近いリージョンに結果が 1 つしか含まれていない場合は、それで行き詰まります。
おそらく、 k 個のレコードを含む最初の領域を再帰的に検索する必要があると思いますが、テーブル変数を使用しないでください (テーブル構造を作成する必要があり、変更されやすいため、メンテナンスの問題が発生します。多くのフィールドがあります)。方法がわかりません。