Pergunta

Eu tenho o seguinte problema: tenho uma tabela com valores longos/lat e outra tabela com um projeto-ID e long/lat/raio (círculo).

Agora eu preciso descobrir qual projeto corresponde aos valores longos/lat da primeira tabela.

Existe uma maneira fácil de fazer isso?

Foi útil?

Solução

Existem vários algoritmos para calcular a distância na esfera, mas usamos seguintes:

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

(onde 6378.137 - é o raio da Terra)

Então agora, quando você pode calcular a distância entre 2 pontos na Terra, você pode construir consulta

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

onde @youradius - raio parametrizado do seu círculo

Outras dicas

Relativamente fácil: calcule a distância de grande círculo entre o ponto e o centro do círculo. Se a distância for menor que o raio, o ponto estará no círculo, se não não. Se estiver na circunferência do círculo, você decide. Houve várias discussões sobre o cálculo de distâncias de grandes círculos, dê uma olhada nelas.

Para acelerar as coisas, você pode considerar armazenar, com a definição de cada círculo, sua caixa delimitadora mínima em 'quadrados longos'. Isso forneceria as informações necessárias para fazer uma verificação rápida se um ponto está possivelmente dentro de um círculo, apenas as distâncias computando quando o ponto está dentro do MBB.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top