Domanda

Ho il seguente problema: Ho una tabella con i valori lunghi / Lat e un altro tavolo con un progetto-id e lunga / lat / raggio (cerchio).

Ora ho bisogno di scoprire quale progetto corrisponde ai valori long / lat dalla prima tabella.

C'è un modo semplice per farlo?

È stato utile?

Soluzione

Ci sono diversi algoritmi per calcolare la distanza sulla sfera, ma usiamo seguente:

create function GetDistance(
    @latitudeFrom decimal(30,10), 
    @longitudeFrom decimal(30,10),
    @latitudeTo decimal(30,10), 
    @longitudeTo decimal(30,10)
)
RETURNS float
AS
BEGIN

DECLARE @distance float

    SET @distance = ROUND(6378.137 * ACOS(
            convert(decimal(30,10), 
            (SIN(RADIANS(@latitudeFrom)) * SIN(RADIANS(@latitudeTo))) +
            (COS(RADIANS(@latitudeFrom)) * COS(RADIANS(@latitudeTo)) *
             COS(RADIANS(@longitudeTo) - RADIANS(@longitudeFrom))))), 15)

 RETURN @distance
 END
 go

(dove 6378,137 - è il raggio della Terra)

Così ora quando si può calcolare la distanza tra i 2 punti sulla Terra si può costruire interrogazione

 select * 
     from Table1, Project 
     where dbo.GetDistance(
           Table1.lat, Table1.lon, 
           Project.lat, Project.lon) < @YouRadius

dove @YouRadius - raggio con parametri del vostro cerchio

Altri suggerimenti

Relativamente facile: calcolare la distanza grande cerchio tra il punto e il centro del cerchio. Se la distanza è minore del raggio, il punto è nel cerchio, se non meno. Se è sulla circonferenza del cerchio, si decide. Ci sono state diverse discussioni così via calcolo di grande-cerchio distanze, hanno un'occhiata a loro.

Per velocizzare le cose si potrebbe considerare la conservazione, con la definizione di ogni cerchio, il suo minimo riquadro di delimitazione in 'piazze' lat / long. Questo vi fornirà le informazioni necessarie per fare un rapido controllo di se un punto è forse all'interno di un cerchio, solo calcolando distanze quando il punto è all'interno del MBB.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top