Domanda

Ho trovato una funzione in una pagina PHP che calcola il numero di miglia tra 2 punti, ma è difettoso. Dovrebbe funzionare con google maps, ma la differenza di distanze varia da 1,3 a 1,65 volte più lontano in google maps (che è più preciso).

Ecco la funzione:

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

Trovo che sia un po 'complicato e non so molto sulla geometria sapere se questo è corretto o meno.

Qualcuno con un po 'più di knowhow può dare un'occhiata a questo e vedere cosa c'è che non va?

È stato utile?

Soluzione

Forse stai confrontando la "distanza in linea d'aria" (linea diretta tra due punti) con la distanza di guida?

Inoltre, vedi questo post per calcolare la distanza tra due punti in PHP.

Altri suggerimenti

Stai cercando la formula Haversine per calcolare la distanza tra due punti che hai longitudine e latitudine per.

Una sua semplice implementazione in Javascript può essere trovata qui , che dovrebbe essere facile da convertire in PHP.

Esistono almeno tre diversi metodi per calcolare la distanza sulla superficie della Terra, che variano in termini di accuratezza e calcolo richiesto.

  1. Legge sferica dei coseni [non molto preciso, molto semplice da calcolare]
  2. Formula Haversine [preciso tranne a distanze minori, ancora relativamente semplice da calcolare]
  3. Formula Vincenty [altamente accurato e può utilizzare diversi diversi modelli ellissoidali della superficie terrestre, più complicati da calcolare]

L'esempio che hai fornito sembra essere la legge del calcolo dei coseni, mentre Google Maps è più preciso poiché utilizza la formula Vincenty. (Trovo che il link Vincenty spieghi la formula in modo più dettagliato rispetto alla sua pagina Wikipedia)

Modifica: ho visto un commento sopra che l'errore introdotto dalla deviazione sulla superficie terrestre è banale e non è in grado di comporre l'errore che stai vedendo. Temo che ciò sia vero solo su distanze molto grandi. A distanze di circa duecento chilometri o meno, gli errori possono essere decisamente non banali.

Ecco una versione più semplice, ma non precisa per località molto distanti:

    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;
}

$ point e $ this sono istanze della classe Location con i metodi getLatitude () e getLongitude ().

Neanche io so nulla della geometria, ma google ha suggerito questa pagina . Forse lo troverai utile

Sembra che la formula sia accurata - vedi, ad esempio, Wikipedia su " ; grande distanza del cerchio " . Il fattore 69,09 davanti è, credo, il numero di miglia in un grado misurate lungo un grande cerchio (ad esempio miglia in 1 grado di longitudine all'equatore), quindi la tua risposta sarà in miglia.

L'idea di Jonstjohn che potresti confrontare erroneamente la distanza in linea retta con la distanza di guida mi sembra la spiegazione più probabile.

EDIT : o potrebbe essere l'errore di arrotondamento menzionato da Wikipedia, se stai lavorando con piccole separazioni. Ma prima vorrei puntare il dito sulla differenza di distanza diretta / di guida.

Sembra che il calcolo a cui fai riferimento usi un sistema di coordinate sferiche. La formula è quasi corretta. Parte di ciò che potrebbe essere buttare via il tuo calcolo è il raggio che stai usando. Il 69.09 è il raggio della sfera (terra in questo caso). Come forse saprai, la terra non è in realtà una sfera, più di un ellissoide. Suggerirei di provare la formulazione di seguito:

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

Per risultati più accurati, ti consigliamo di utilizzare i calcoli Vincenty o Haversine.

EDIT: per chiarire, non sto cercando di implicare che la maggior parte dell'errore che stai segnalando sia dovuta all'uso di un calcolo sferico delle coordinate. Questo errore è molto più piccolo di quello che stai vedendo. La regolazione della formula che ho fornito doveva essere una versione più chiara della formula, poiché il 69.09 era un valore del raggio della terra regolato su un sistema di gradi, che è meno intuitivo del semplice utilizzo dei radianti. Inoltre, vale la pena notare che per il calcolo di distanze molto ridotte, l'utilizzo della formula sopra è altamente preciso (fino a circa 1 m di distanza) purché il sistema che esegue il calcolo stia lavorando con abbastanza cifre decimali. L'uso di un float nell'informatica moderna ti dà questa precisione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top