オブジェクトを GEOGRAPHY
に保存できます 列を作成し、SPATIAL INDEX
を作成します
残念ながら、SQL Server
サーフェスをタイル化し、タイル識別子をプレーンな B-Tree
に格納することで、空間インデックスを実装します インデックスなので、プレーンな ORDER BY STDistance
動作しません (動作しますが、インデックスは使用しません)。
代わりに、次のようなクエリを作成する必要があります:
DECLARE @mypoint GEOGRAPHY SET @mypoint = geography::STGeomFromText('POINT(@mylat, @mylon)', 4326); WITH num (distance) AS ( SELECT 1000 UNION ALL SELECT distance + 1000 FROM num WHERE distance <= 50000 ) SELECT TOP 1 m.* FROM num CROSS APPLY ( SELECT TOP 1 * FROM mytable WHERE myroad.STDistance(@mypoint) <= distance ORDER BY STDistance(@mypoint) ) m
プレ>このように、
SQL Server
最初に1
内の道路を検索します あなたのポイントからキロメートル、その後2
以内 インデックスを使用するたびにキロメートルなど。更新:
テーブルに複数のポイントがあり、それぞれに最も近いポイントを見つけたい場合:
WITH num (distance) AS ( SELECT 1000 UNION ALL SELECT distance + 1000 FROM num WHERE distance <= 50000 ) SELECT mp.mypoint, m.* FROM @mypoints mp CROSS APPLY ( SELECT TOP 1 m.* FROM num CROSS APPLY ( SELECT TOP 1 * FROM mytable WHERE myroad.STDistance(@mypoint) <= distance ORDER BY STDistance(@mypoint) ) m ) m
プレ>