Pular para o conteúdo
  • Este tópico contém 7 respostas, 3 vozes e foi atualizado pela última vez 14 anos atrás por fabiogalera.
Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Autor
    Posts
  • #102057
    Alfeu
    Participante

      Olá 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.

      #102064
      fabiogalera
      Participante

        Nussa, 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 Longitude

        Utilize 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,YYZZ,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]

        #102065
        msantino
        Participante

          Caraca, viajei!!!
          hahahaha

          #102071
          Alfeu
          Participante

            Puxa, 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!!!

            #102072
            fabiogalera
            Participante

              Ah, é 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.

              #102076
              Alfeu
              Participante

                Olá, 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/3600

                Agora 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 metros

                Uma 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!!!

                #102077
                Alfeu
                Participante

                  Pessoal,

                  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!!!

                  #102078
                  fabiogalera
                  Participante

                    Eu 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 =)

                  Visualizando 8 posts - 1 até 8 (de 8 do total)
                  • Você deve fazer login para responder a este tópico.