Punto su Circle (longitudine / latitudine) in .NET / SQL
-
20-09-2019 - |
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?
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.