Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server Geography typ danych najbliższy punkt w linii

Możesz przechowywać swoje obiekty w GEOGRAPHY kolumnę i utwórz SPATIAL INDEX nad tą kolumną.

Niestety, SQL Server implementuje indeksy przestrzenne poprzez kafelkowanie powierzchni i przechowywanie identyfikatorów kafelków w zwykłym B-Tree indeks, więc zwykły ORDER BY STDistance nie będzie działać (cóż, będzie działać, ale nie będzie korzystać z indeksu).

Zamiast tego musisz wykonać zapytanie podobne do tego:

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

W ten sposób SQL Server najpierw przeszuka drogi w obrębie 1 kilometr od punktu, a następnie w ciągu 2 kilometrów itp., za każdym razem przy użyciu indeksu.

Aktualizacja:

Jeśli masz wiele punktów w tabeli i chcesz znaleźć najbliższy punkt dla każdego z nich:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Usługi raportowania MS ograniczające liczbę wierszy

  2. Jak ułożyć rzędy tabeli w kolejności rosnącej i jednocześnie zapisywać tabelę?

  3. sterowanie ArithAbort w EF4

  4. Wyrażenia regularne na serwerach SQL Server?

  5. Grupuj wiersze T-SQL w kolumny