Pergunta

Eu encontrei uma função em uma página PHP que calcula o número de milhas entre 2 pontos, mas é defeituoso. É suposto a trabalhar com os mapas do Google, mas a diferença de distâncias estão variando de 1,3 a 1,65 vezes mais em mapas do Google (que é mais preciso).

Aqui está a função:

$M =  69.09 * rad2deg(acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2))));

Eu acho que ele seja um pouco complicado e eu não sei muito sobre geometria saber wheter ou não isso é correto.

Pode alguém com um pouco mais know-how dar uma olhada nisso e ver o que há de errado com ele?

Foi útil?

Solução

Talvez você está comparando a 'distância em linha recta' (linha direta entre dois pontos) com a distância dirigindo?

Além disso, ver este pós para calcular distância entre dois pontos em PHP.

Outras dicas

Você está procurando o Haversine fórmula a distância calcular entre dois pontos que você tem longitude e latitude para.

Uma implementação simples do que em Javascript pode ser encontrada aqui , que deve ser fácil de converter para PHP.

Há pelo menos três dois diferentes métodos de cálculo da distância na superfície da Terra, que variam em precisão e computação necessário.

  1. Lei esférica dos cossenos [não muito exata, muito simples para calcular]
  2. Haversine Fórmula [precisas, exceto em distâncias menores, ainda relativamente simples para calcular]
  3. Vincenty Fórmula [altamente precisa e pode usar vários diferentes modelos elipsoidais da superfície da Terra, mais complicado para calcular]

O exemplo que você forneceu parece ser a lei de cálculo cossenos, enquanto o Google Maps é mais preciso, uma vez que utiliza a Fórmula Vincenty. (Acho que o link Vincenty explica a fórmula em melhor detalhe do que da página da Wikipedia)

Editar: Eu vi um comentário acima que o erro introduzido pelo desvio na superfície da Terra é trivial e não pode compor o erro que você está vendo. Receio que esta só é verdade sobre distâncias muito grandes. A distâncias de algumas centenas de km ou menos, os erros podem ser decididamente não-trivial.

Aqui está uma versão mais simples, mas não é preciso para locais muito distantes:

    const ONE_DEGREE = 111120;

public function distance( $point ) {
    $coef = cos( $this->getLatitude() / 180 * M_PI );
    $x = $this->getLatitude() - $point->getLatitude();
    $y = ( $this->getLongitude() - $point->getLongitude() ) * $coef;
    $result = sqrt( $x * $x + $y * $y ) * self::ONE_DEGREE;
    return $result;
}

$ ponto e $ this são instâncias de Localização classe com getLatitude () e getLongitude () métodos.

Eu não sei nada sobre geometria, quer, mas o Google sugeriu esta página .talvez você vai achar que é útil

Parece que a fórmula é preciso - ver, por exemplo, Wikipedia em "grande distância círculo ". O fator de 69,09 em frente é, creio eu, o número de milhas em um grau medido ao longo de um grande círculo (por exemplo milhas em 1 grau de longitude no equador), para que a sua resposta será em milhas.

A idéia de jonstjohn que você pode ser incorretamente comparando distância em linha reta com distância de carro parece ser a explicação mais provável para mim.

Editar : ou poderia ser o erro de arredondamento Wikipedia menciona, se você estiver trabalhando com pequenas separações. Mas eu gostaria de apontar o dedo para o / diferença de distância direta dirigir em primeiro lugar.

Parece que o cálculo que você está referenciando usa um sistema esférico de coordenadas. A fórmula é quase correcta. Parte do que poderia estar jogando o seu cálculo off é o raio que você está usando. O 69,09 é o raio da esfera (terra neste caso). Como você deve saber, a terra não é realmente uma esfera, mais de um elipsóide. Eu sugiro tentar a formulação abaixo:

3963 * acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2)));

Para obter resultados mais precisos, você vai querer usar cálculos Vincenty ou Haversine.

EDIT: Para esclarecer, eu não estou tentando dar a entender que a maior parte do erro que você está relatando é devido ao uso de um esférico coordenar cálculo. Esse erro é muito menor do que o que você está vendo. O ajuste de fórmula I fornecido foi destinado a ser uma versão mais clara da fórmula, como o era 69,09 um valor do raio da terra ajustado para um sistema de medida, que é menos intuitiva do que simplesmente usando radianos. Além disso, é importante notar que, para calcular distâncias muito pequenas, usando a fórmula acima é altamente preciso (para cerca de distâncias 1m), desde que o sistema de fazer o cálculo está trabalhando com bastante casas decimais. Usando um flutuador na computação moderna lhe dá essa precisão.

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