Anda dapat menyimpan objek Anda dalam GEOGRAPHY
kolom dan buat SPATIAL INDEX
di atas kolom ini.
Sayangnya, SQL Server
mengimplementasikan indeks spasial dengan melapisi permukaan dan menyimpan pengidentifikasi ubin dalam B-Tree
biasa index, jadi ORDER BY STDistance
tidak akan berfungsi (baik, itu akan berfungsi tetapi tidak akan menggunakan indeks).
Sebagai gantinya, Anda harus membuat kueri yang mirip dengan ini:
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
Dengan cara ini, SQL Server
pertama-tama akan mencari jalan dalam 1
kilometer dari titik Anda, lalu dalam 2
kilometer, dll., setiap kali menggunakan indeks.
Pembaruan:
Jika Anda memiliki beberapa titik dalam sebuah tabel dan ingin mencari titik terdekat untuk masing-masing titik tersebut:
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