Respostas:
O rolamento plano pode ser calculado usando ST_Azimuth
:
SELECT ST_Azimuth(ST_MakePoint(1,2),
ST_MakePoint(3,4))/(2*pi())*360 as degAz,
ST_Azimuth(ST_MakePoint(3,4),
ST_MakePoint(1,2))/(2*pi())*360 As degAzrev
degaz degazrev
------ ---------
45 225
Para azimute esférico (grupo Citando potgis-users ):
A função azimute do PostGIS parece usar uma função arctan simples para determinar o azimute. Se você converter suas coordenadas em um sistema de coordenadas projetado e executar a consulta, seus resultados ficarão muito mais próximos dos resultados do site da FCC.
Aqui está uma conversão rápida para a Zona 31 da UTM:
select degrees(azimuth(
'POINT(634714.442133176 5802006.052402816)',
'POINT(634731.2410598891 5801981.648284801)'
));
que gera um azimute de 145.457858825445. Pontos no centro da zona UTM, ou uma projeção mais adequada, dariam melhores resultados.
Esta é a solução que eu escolhi quando tive que lidar com esses problemas, principalmente por motivos de legado (eu tinha uma função Python que calcula o azimute). Primeiro, precisamos encontrar uma função que nos diga a distância exata entre dois pontos. Citando o manual do postgis :
ST_distance_sphere (ponto, ponto) Retorna a distância linear em metros entre dois pontos lat / lon. Usa uma terra esférica e raio de 6370986 metros. Mais rápido que distance_spheroid (), mas menos preciso. Implementado apenas para pontos.
Meça a distância da longitude e latitude entre os pontos e use a arctan
função para recuperar o ângulo.
atan
? Minha trigonometria é um pouco nebulosa ...