Aponte no círculo (longitude/latitude) em .NET/SQL
-
20-09-2019 - |
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?
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.