2009-01-02 14 views
23

Złapałem bazę danych kodów pocztowych i ich szerokości/szerokości geograficznej, itp. Z tego This page. Posiada następujące pola:Obliczanie odległości między kodami pocztowymi w PHP

ZIP, szerokości, długości, miasto, województwo, powiat, ZIP_CLASS

dane zostały w pliku tekstowym, ale włożeniu go do tabeli MySQL. Moje pytanie brzmi: jak mogę wykorzystać powyższe pola do obliczenia odległości między dwoma kodami pocztowymi, które użytkownik może wprowadzić na stronie internetowej? Kod działa w PHP zostaną docenione

+5

Co to jest "odległość"? Czy chcesz mieć dystans "w linii prostej"/odległość świetnego koła? Odległość drogi? Rzeczywista odległość 3D między dwoma punktami w przestrzeni? – ShreevatsaR

+3

@Shreevats: Ponieważ prosi o obliczenia za pomocą lat/long, można bezpiecznie założyć, że nie osiągniesz dystansu. Rzeczywista odległość między dwoma punktami w przestrzeni (np. Przez ciało Ziemi) prawdopodobnie również nie jest przydatna. Dlatego "jak wabik"/najprawdopodobniej wielkie koło. –

Odpowiedz

6

Możesz także spróbować uderzenia usługę internetową calc odległość. Niech ktoś inny ciężko dźwiga.

https://www.zipcodeapi.com/API#distance

+3

, które działałoby na 2 zipcodes, ale wyobraź sobie, że próbujesz wybrać 100 najbliżej położonych lokalizacji dla danego kodu pocztowego, z tysięcy rekordów w bazie danych :) – aryaxt

+0

link jest martwy –

+0

zaktualizowany link do innej usługi, która działa – brendan

7

Można to zrobić tylko z matematyki ...

function calc_distance($point1, $point2) 
{ 
    $distance = (3958 * 3.1415926 * sqrt(
      ($point1['lat'] - $point2['lat']) 
      * ($point1['lat'] - $point2['lat']) 
      + cos($point1['lat']/57.29578) 
      * cos($point2['lat']/57.29578) 
      * ($point1['long'] - $point2['long']) 
      * ($point1['long'] - $point2['long']) 
     )/180); 

    return $distance; 
} 
+3

Czy możesz podać, skąd wziąłeś te obliczenia? –

+2

Zbyt wiele magicznych liczb i zbyt wiele wcięć po prawej stronie! –

+0

Jaką jednostkę zwraca ten dystans? Dla kodu pocztowego, który powinien dać 10 mil, dało to coś w rodzaju 7892.xx (w przybliżeniu). Jak można to przekształcić na mile? –

6

Zapoznaj się z Haversine formula obliczania koło wielkie odległości pomiędzy dwoma punktami. Kilka próbek można znaleźć here

Haversine Wzór:

  • R = promień ziemi (średni promień = 6,371km)
  • ALAT = lat2- lat1
  • Δlong = long2- long1
  • A = sin² (ALAT/2) + cos (lat1) .cos (lat2) .sin² (Δlong/2)
  • C = 2.atan2 (√a, √ (1-a))
  • d = Rc

(Należy zauważyć, że kąty muszą znajdować się w radianach, aby przejść do funkcji wyzwalania).

24

To odpowiedź Mike'a z adnotacjami na magicznych numerów. Wydawało się działać dobrze dla mnie some test data:

function calc_distance($point1, $point2) 
{ 
    $radius  = 3958;  // Earth's radius (miles) 
    $deg_per_rad = 57.29578; // Number of degrees/radian (for conversion) 

    $distance = ($radius * pi() * sqrt(
       ($point1['lat'] - $point2['lat']) 
       * ($point1['lat'] - $point2['lat']) 
       + cos($point1['lat']/$deg_per_rad) // Convert these to 
       * cos($point2['lat']/$deg_per_rad) // radians for cos() 
       * ($point1['long'] - $point2['long']) 
       * ($point1['long'] - $point2['long']) 
     )/180); 

    return $distance; // Returned using the units used for $radius. 
} 
1

W tabeli zip trzeba chwycić współrzędne (lat, długie) dla dwóch punktów dla których chcesz uzyskać dystans.

Następnie można obliczyć odległość w prawo w SQL lub z PHP. Oba sposoby są przedstawione na tym stanowisku:

http://dev.strategystar.net/2011/10/mysql-php-get-distance-between-two-coordinates-in-miles-kilometers/

Obliczenia na przykład w oparciu o wzorze omówionej w tym temacie. Zapewnia promień dla Ziemi zarówno w milach jak i kilometrach, więc pozwoli ci uzyskać odległość między dwoma punktami w obu jednostkach.

Powyższy link jest świetny, ponieważ metoda obliczania nie zawiera żadnych magicznych liczb, tylko promień ziemi!

Powiązane problemy