Punto en círculo (longitud/latitud) en .NET/SQL
-
20-09-2019 - |
Pregunta
Tengo el siguiente problema:Tengo una tabla con valores de longitud/latitud y otra tabla con un ID de proyecto y longitud/latitud/radio (círculo).
Ahora necesito averiguar qué proyecto coincide con los valores de longitud/latitud de la primera tabla.
¿Existe una manera fácil de hacer eso?
Solución
Existen varios algoritmos para calcular la distancia en la esfera, pero utilizamos los siguientes:
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
(donde 6378.137 - es el radio de la Tierra)
Entonces, ahora que puedes calcular la distancia entre 2 puntos en la Tierra, puedes crear una consulta.
select *
from Table1, Project
where dbo.GetDistance(
Table1.lat, Table1.lon,
Project.lat, Project.lon) < @YouRadius
donde @YouRadius - radio parametrizado de su círculo
Otros consejos
relativamente fácil: calcular la distancia de círculo máximo entre el punto y el centro del círculo. Si la distancia es menor que el radio, el punto está en el círculo, si no no. Si está en la circunferencia del círculo, a decidir. Ha habido varias discusiones etc. cálculo de distancias de círculo máximo, echar un vistazo a ellos.
Para acelerar las cosas que podría considerar el almacenamiento, con la definición de cada círculo, su cuadro delimitador mínimo de plazas '' de latitud / longitud. Esto le proporcionará la información necesaria para realizar una comprobación rápida de si un punto es, posiblemente, dentro de un círculo, solamente calcular distancias cuando el punto está dentro de la MBB.