Své objekty můžete uložit do GEOGRAPHY
a vytvořte SPATIAL INDEX
nad tímto sloupcem.
Bohužel SQL Server
implementuje prostorové indexy uspořádáním povrchu a uložením identifikátorů dlaždic do prostého B-Tree
index, tedy prostý ORDER BY STDistance
nebude fungovat (dobře, bude fungovat, ale nebude používat index).
Místo toho budete muset vytvořit dotaz podobný tomuto:
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
Tímto způsobem SQL Server
nejprve prohledá silnice v okruhu 1
kilometr od vašeho bodu, poté do 2
kilometrů atd. pokaždé pomocí indexu.
Aktualizace:
Pokud máte v tabulce více bodů a chcete pro každý z nich najít nejbližší bod:
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