matemática pergunta relacionada PHP + latitude
-
21-08-2019 - |
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?
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.
- Lei esférica dos cossenos [não muito exata, muito simples para calcular]
- Haversine Fórmula [precisas, exceto em distâncias menores, ainda relativamente simples para calcular]
- 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.