Cześć {Hi} Mam potrzebę obliczenia odległości między dwoma punktami mającymi szerokie i długie.
Chciałbym uniknąć jakichkolwiek odwołań do zewnętrznego API.
Próbowałem zaimplementować formułę Haversine w PHP:
Oto kod:
class CoordDistance
{
public $lat_a = 0;
public $lon_a = 0;
public $lat_b = 0;
public $lon_b = 0;
public $measure_unit = 'kilometers';
public $measure_state = false;
public $measure = 0;
public $error = '';
public function DistAB()
{
$delta_lat = $this->lat_b - $this->lat_a ;
$delta_lon = $this->lon_b - $this->lon_a ;
$earth_radius = 6372.795477598;
$alpha = $delta_lat/2;
$beta = $delta_lon/2;
$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($this->lat_a)) * cos(deg2rad($this->lat_b)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);
$this->measure = $distance;
}
}
Testując to z niektórymi punktami, które mają publiczne odległości, nie otrzymuję wiarygodnego wyniku.
Nie rozumiem, czy w oryginalnej formule czy w mojej implementacji jest błąd
php
coordinates
geocoding
haversine
maxdangelo
źródło
źródło
Odpowiedzi:
Niedawno napisałem przykład formuły haversine i opublikowałem go na swojej stronie internetowej:
➽ Zwróć uwagę, że odległość otrzymujesz z powrotem w tej samej jednostce, jaką podajesz z parametrem
$earthRadius
. Wartość domyślna to 6371000 metrów, więc wynik również będzie w [m]. Aby otrzymać wynik w milach, możesz np. Przejechać 3959 mil jako,$earthRadius
a wynik będzie w [mi]. Moim zdaniem dobrym zwyczajem jest trzymanie się jednostek SI, jeśli nie ma powodu, aby postępować inaczej.Edytować:
Jak słusznie zauważył TreyA, formuła Haversine ma słabe punkty z punktami antypodalnymi z powodu błędów zaokrąglania (chociaż jest stabilna dla małych odległości). Aby je ominąć, możesz zamiast tego użyć formuły Vincenty'ego .
źródło
Znalazłem ten kod, który daje mi wiarygodne wyniki.
wyniki:
źródło
To tylko dodatek do odpowiedzi @martinstoeckli i @Janith Chinthana . Dla ciekawskich, który algorytm jest najszybszy, napisałem test wydajności . Najlepszy wynik wydajności pokazuje zoptymalizowaną funkcję z codexworld.com :
Oto wyniki testu:
źródło
1.1515 * 1.609344 = 1.853
. Dzięki, naprawiono do 1.853.Oto prosty i doskonały kod do obliczania odległości między dwiema szerokościami i długościami geograficznymi. Znaleziono następujący kod tutaj - http://www.codexworld.com/distance-between-two-addresses-google-maps-api-php/
źródło
Dla tych, którzy lubią krótsze i szybsze (bez wywoływania deg2rad ()).
źródło
Spróbuj to daje niesamowite rezultaty
źródło
Dość stare pytanie, ale dla tych, którzy są zainteresowani kodem PHP, który zwraca takie same wyniki, jak Google Maps, następujące zadanie:
Testowałem z różnymi współrzędnymi i działa idealnie.
Myślę, że powinno być szybsze niż niektóre alternatywy. Ale tego nie przetestowałem.
Wskazówka: Google Maps używa 6378137 jako promienia Ziemi. Więc użycie go z innymi algorytmami może również działać.
źródło
Aby uzyskać dokładne wartości, zrób to w ten sposób:
Hmm, myślę, że to powinno wystarczyć ...
Edytować:
W przypadku formularzy i przynajmniej implementacji JS spróbuj: http://www.movable-type.co.uk/scripts/latlong.html
Ośmiel mnie ... zapomniałem zdeg2radować wszystkie wartości w funkcjach koła ...
źródło
Witaj tutaj Kod, aby uzyskać odległość i czas za pomocą dwóch różnych szerokości i długości
Możesz sprawdzić przykład poniżej. Link pobiera czas między dwiema różnymi lokalizacjami, używając szerokości i długości geograficznej w php
źródło
Wypróbuj tę funkcję, aby obliczyć odległość między punktami szerokości i długości geograficznej
Następnie użyj funkcji jako
Mam nadzieję, że to pomoże
źródło
Mnożnik jest zmieniany dla każdej współrzędnej z powodu teorii wielkiej odległości po okręgu, jak napisano tutaj:
http://en.wikipedia.org/wiki/Great-circle_distance
i możesz obliczyć najbliższą wartość za pomocą tego wzoru opisanego tutaj:
http://en.wikipedia.org/wiki/Great-circle_distance#Worked_example
klucz konwertuje wartość każdego stopnia - minuty - sekundy na wartość wszystkich stopni:
źródło
Jednym z najłatwiejszych sposobów jest:
Zaokrągla do 2 miejsc po przecinku.
źródło