sql >> Database >  >> RDS >> Sqlserver

SQL Server Geografie datatype dichtstbijzijnde punt op lijn

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


  1. Gegevens uit MySQL halen met behulp van realtime PHP?

  2. Zoek in meerdere tabellen en geef ook de tabelnaam weer in de resulterende rijen

  3. Is er een manier om de Flyway-taak uit te voeren, met uitzondering van sommige tabellen?

  4. SQL-netwerkinterfaces, fout:50 - Er is een runtime-fout voor de lokale database opgetreden. Kan geen automatische instantie maken