Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server Geography tipe data titik terdekat secara online

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kunci unik vs. indeks unik di SQL Server 2008

  2. SQL Server - literal boolean?

  3. Mengubah kolom:null menjadi bukan null

  4. Tetapkan nama file secara dinamis ke string koneksi excel

  5. SQLServer - Bagaimana menemukan tabel dependen di meja saya?