- Este tópico contém 7 respostas, 3 vozes e foi atualizado pela última vez 14 anos atrás por
fabiogalera.
-
AutorPosts
-
7 de dezembro de 2011 às 8:40 pm #102057
Alfeu
ParticipanteOlá pessoal,
Alguém conhece alguma função PL/SQL que calcula a distância (retorna km) entre dois pontos, partindo de valores de coordenadas (graus, min, seg)?
Não estou conseguindo encontrar nada parecido, nem pra adaptar.
Agradeço antecipadamente a ajuda.
Valeu.8 de dezembro de 2011 às 7:29 pm #102064fabiogalera
ParticipanteNussa, irei lembrar os tempos de faculdade.
Bom, não possui propriamente uma função para calcular isso, acredito que somente no Spatial.
O que você precisaria fazer é transformar tudo em grau:
GRAU + MINUTO60 + SEGUNDO3600, tanto para latitude quanto longitude
Dai voce tera:
Ponto 1: XX,XX Latitude YY,YY Longitude
Ponto 2: WW,WW Latitude ZZ,ZZ LongitudeUtilize a fórmula de cálculo geométrico:
6371ACOS(COS(PI()(90-WW,WW)/180)COS((90-XX,XX)PI()/180)+SEN((90-WW,WW)PI()/180)SEN((90-XX,XX)PI()/180)COS((YY,YY–ZZ,ZZ)*PI()/180))
6371 = Raio da terra em KM, portanto a distância será medida em KM.
Para milhas use 3959, que é x 1,6. (Milhas X km).obs: função do cosseno é cos(x), do seno é sin(x), agora não sei se o Oracle possui constante do PI ou possui função para converter graus para radianos, você pode usar pi = 3.141618 que está bem próximo do valor.[/b]
8 de dezembro de 2011 às 8:25 pm #102065msantino
ParticipanteCaraca, viajei!!!
hahahaha9 de dezembro de 2011 às 12:33 am #102071Alfeu
ParticipantePuxa, fabiogalera… vc entendeu exatamente o que eu preciso.
Tentei seguir exatamente a sua proposta, mas algo está errado.
Os resultados (km) estão absurdamente altos.
Já verifiquei todas as variáveis e reproduzi exatametne o que vc propôs, mas mesmo assim não achei nada errado.
Porém, não tenho conhecimento suficiente para analisar a fórmula.
Vc poderia, por favor, rever a fórmula e verificar se tem algo errado?
Peço desculpas pela ignorância no assunto, mas não consigo identificar o erro, caso haja.Agradeço demais!!!
9 de dezembro de 2011 às 8:03 am #102072fabiogalera
ParticipanteAh, é suposto mesmo dar número gigantescos.
Esqueci de mencionar, você precisa verificar antes se as coordenadas são NORTE ou SUL.
As do Norte, as conversões dos GRAUS, MINUTOS e SEGUNDOS são positivas, já as do SUL, precisam ser negativas.
Então na hora de converter tudo para GRAU, caso seja SUL, o número deve ser negativo.
9 de dezembro de 2011 às 5:29 pm #102076Alfeu
ParticipanteOlá, fabiogalera.
Descobri o problema…
Na sua proposta de transformar os valores em graus, vc colocou multiplicação. Na verdade é divisão:
GRAU + MINUTO/60 + SEGUNDO/3600Agora os valores ficaram coerentes.
Vou utilizar essa fórmula para os cálculos!!!Apesar do Google Earth mostrar valores ligeiramente diferentes, não creio que vale a pena ficar preocupado com isso.
No link abaixo, existe uma outra proposta de cálculo e um exemplo muito bom utilizando a distância de uma pista de pouso do Campo de Marte (aeroporto aqui de São Paulo).http://www.pilotopolicial.com.br/calcul … ograficas/
O valor conseguido pela fómula proposta foi: 1.147,9 metros
O valor conseguido pelo Google Earth foi: 1.247,8 metrosUma pequena diferença, porém não sabemos qual é a fórmula que o Google utilizou.
Agraço demais a sua atenção e de todos que perderam alguns minutos pensando no assunto.
Valeu galera!!!
9 de dezembro de 2011 às 5:36 pm #102077Alfeu
ParticipantePessoal,
Coloco abaixo o código que utilizei para os testes dessa fórmula.
Existem muitas formas de escrever esse código, mas fiz o mais didático possível e por partes, para melhor entendimento.Espero que seja útil…
CREATE OR REPLACE FUNCTION fc_distancia
(p_lat_a varchar2, p_lon_a varchar2, p_lat_b varchar2, p_lon_b varchar2) RETURN number
AS
— variaveis
v_lat_a_graus number(2);
v_lat_a_minutos number(2);
v_lat_a_segundos number(4,2);
v_lon_a_graus number(2);
v_lon_a_minutos number(2);
v_lon_a_segundos number(4,2);v_lat_b_graus number(2);
v_lat_b_minutos number(2);
v_lat_b_segundos number(4,2);
v_lon_b_graus number(2);
v_lon_b_minutos number(2);
v_lon_b_segundos number(4,2);v_lat_a number(12,8 );
v_lat_b number(12,8 );
v_lon_a number(12,8 );
v_lon_b number(12,8 );
v_km number(12,8 );v_pi number(10,6):=3.141618;
BEGIN
— Separa informacoes da coordenada Lat A
SELECT
substr(p_lat_a,1,2) graus,
substr(p_lat_a,4,2) minutos,
substr(p_lat_a,7) segundos
INTO v_lat_a_graus,
v_lat_a_minutos,
v_lat_a_segundos
FROM dual;— Separa informacoes da coordenada Lon A
SELECT
substr(p_lon_a,1,2) graus,
substr(p_lon_a,4,2) minutos,
substr(p_lon_a,7) segundos
INTO v_lon_a_graus,
v_lon_a_minutos,
v_lon_a_segundos
FROM dual;— Separa informacoes da coordenada Lat B
SELECT
substr(p_lat_b,1,2) graus,
substr(p_lat_b,4,2) minutos,
substr(p_lat_b,7) segundos
INTO v_lat_b_graus,
v_lat_b_minutos,
v_lat_b_segundos
FROM dual;— Separa informacoes da coordenada Lon B
SELECT
substr(p_lon_b,1,2) graus,
substr(p_lon_b,4,2) minutos,
substr(p_lon_b,7) segundos
INTO v_lon_b_graus,
v_lon_b_minutos,
v_lon_b_segundos
FROM dual;— transforma em graus as coordenadas
v_lat_a:= v_lat_a_graus + (v_lat_a_minutos/60) + (v_lat_a_segundos/3600);
v_lat_b:= v_lat_b_graus + (v_lat_b_minutos/60) + (v_lat_b_segundos/3600);
v_lon_a:= v_lon_a_graus + (v_lon_a_minutos/60) + (v_lon_a_segundos/3600);
v_lon_b:= v_lon_b_graus + (v_lon_b_minutos/60) + (v_lon_b_segundos/3600);— calcula distancia em km
v_km:= 6371ACOS(COS(v_pi(90-v_lat_b)/180)COS((90-v_lat_a)v_pi/180)+SIN((90-v_lat_b)v_pi/180)SIN((90-v_lat_a)v_pi/180)COS((v_lon_a-v_lon_b)*v_pi/180));— retorna resultado em Km
RETURN v_km;END;
— TESTE:
— utilizei as mesmas coordenadas propostas no link acima, para poder comparar.SELECT fc_distancia(’23;30;36,50′,’46;38;32,90′,’23;30;29,93′,’46;37;53,01′) km FROM dual
— RESULTADO:
1,14792494 km
Mais uma vez quero agradecer ao “fabiogalera” que mostrou o caminho das pedras.
Portanto, todos os méritos são dele.Valeu!!!
9 de dezembro de 2011 às 6:04 pm #102078fabiogalera
ParticipanteEu nem reparei que coloquei multiplicação, realmente é divisão hehe.
Para verificar o calculo do google, basta você selecionar duas cidades, verificar a distância delas pelo google no modo “Como Chegar” e depois utilizar os valores para calcular =)
-
AutorPosts
- Você deve fazer login para responder a este tópico.