U kunt uw objecten opslaan in een GEOGRAPHY
kolom en maak een SPATIAL INDEX
over deze kolom.
Helaas, SQL Server
implementeert ruimtelijke indexen door het oppervlak te betegelen en de tegel-ID's op te slaan in een gewone B-Tree
index, dus gewoon ORDER BY STDistance
zal niet werken (nou ja, het zal werken maar zal de index niet gebruiken).
In plaats daarvan moet u een soortgelijke zoekopdracht maken:
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
Op deze manier, SQL Server
zoekt eerst naar wegen binnen 1
kilometer van uw punt, dan binnen 2
kilometers, enz., telkens met behulp van de index.
Bijwerken:
Als u meerdere punten in een tabel heeft en voor elk van hen het dichtstbijzijnde punt wilt vinden:
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