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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top