2009-08-07 16 views
6

Znalazłem ten popularny skrypt PHP/MySQL o nazwie Zip Location autorstwa SaniSoft i działa świetnie poza jednym: w niektórych przypadkach nie działa.Znajdowanie kodów pocztowych w określonym promieniu

Wygląda na to, że jakikolwiek promień poniżej 20 mil zwraca tę samą liczbę kodów pocztowych co 20 mil. Przeszukałem google, ale bezskutecznie. Zastanawiałem się, czy ktoś ma jakiś wgląd w tę sytuację.

Wolę rozgryźć ten problem, zanim będę musiał zapłacić za program, a także mógłbym wykorzystać doświadczenie edukacyjne. Baza danych to lista kodów pocztowych oraz długości i szerokości geograficzne każdego kodu pocztowego. Skrypt wykorzystuje metodę, która określa odległość wokół wprowadzonego kodu pocztowego i zwraca kody pocztowe w tym promieniu na podstawie ich długości.

Dziękuję!

Edycja: Korzystając z funkcji odległości, którą zapewnia skrypt, odkryłem, że odległość między kodami Zip, które program daje mi, a moim kodem pocztowym, wynosi 0 mil.

MAJOR UPDATE

Z badań okazuje się, że baza danych zawiera zduplikowane wartości szer/dł. Pamiętaj o tym, używając Lokalizatora Zip. Mimo że PHP wykonuje swoją pracę, musisz znaleźć nową bazę danych kodów pocztowych. Opublikuję moje wyniki w późniejszym terminie.

Odpowiedz

1

Druga próba!

Podczas przeglądania edytowanego opisu problemu sprawdzam, w jaki sposób przypisujesz wartości zip.

Dużo błędów można wprowadzić, jeśli twoje kody pocztowe są liczbami całkowitymi zamiast ciągów. Największym problemem jest to, że amerykańskie kody pocztowe mogą zaczynać się od 0.

Przykłady w ziptest.php nie są dobre, ponieważ traktuj zamki jako liczby całkowite. Podczas próby opisać mój własny kod pocztowy z liczby całkowitej:

$zip1 = 02446; 

Jego interpretowany przez PHP jako wartości ósemkowej 2446. phpZipLocator zastosowań że wartość jako ciąg bez wyraźnej konwersji. Dlatego PHP podaje dziesiętną wartość 2446 jako ciąg (1318), który w ogóle nie jest kodem pocztowym.

Zamiast powiadamiając, że nie znaleźć kod pocztowy, phpZipLocator robi promień wyszukiwania wszystkich kodów pocztowych w danym promieniu czegoś, co nie istnieje, który zdecyduje powinien być 1.

Jeśli Ustawiam kod pocztowy za pomocą ciągu znaków:

$zip1 = '02446'; 

Otrzymuję poprawny wynik.

IMHO wygląda na to, że phpZipLocator może zużyć trochę pracy.

+0

Dziękuję bardzo otterfan. +1 dla ciebie, ale niestety to nie rozwiązuje problemu. Kod pocztowy, którego używam to 11950, a promień i ustawiony na 5, zawiera 73 kody pocztowe. Wysyłam obecnie zmienną kodu pocztowego za pośrednictwem zmiennej pocztowej. Ale zmieniono zmienną na $ zip1 = '11950'; i wciąż mam taki sam wynik. –

+0

Widzę, jak działa z twoim kodem pocztowym, ciekawe rzeczy tutaj. –

+0

Jeszcze bardziej interesujące, niektóre z 73 kodów pocztowych, które pojawią się około 20 mil od hotelu. –

10

Poniższe przybliżone obliczenia odległości są stosunkowo proste, ale może powodować błędy odległości rzędu 10%. Te przybliżone obliczenia są wykonywane przy użyciu wartości szerokości i długości geograficznej w stopniach. Pierwszym przybliżeniem wymaga jedynie prostych funkcji matematycznych:

Approximate distance in miles = sqrt(x * x + y * y) 

where 
     x = 69.1 * (lat2 - lat1) 
and 
     y = 53 * (lon2 - lon1) 

można poprawić dokładność tej przybliżonego obliczania odległości przez dodanie funkcji cosinus Matematyka:

Approximate distance in miles = sqrt(x * x + y * y) 

where 
     x = 69.1 * (lat2 - lat1) 
and 
     y = 69.1 * (lon2 - lon1) * cos(lat1/57.3) 

Jeśli potrzebna jest większa dokładność, należy użyć dokładne obliczenie odległości. Dokładne obliczenie odległości wymaga użycia geometrii sferycznej, ponieważ ziemia to sfera. Dokładne obliczenie odległości wymaga również wysokiego poziomu dokładności matematycznej zmiennoprzecinkowej - około 15 cyfr dokładności (czasami nazywane "podwójną precyzją"). Ponadto funkcja obliczeń matematycznych używana do dokładnego obliczenia wymaga przeliczenia szerokości geograficznej oraz wartości długości geograficznej od stopni do radianów. Aby przekonwertować szerokość geograficzną lub długość od stopni do radianów, podziel wartości szerokości i długości geograficznej w tej bazie danych przez 180/pi lub 57,2958. Przyjmuje się, że promień Ziemi wynosi , czyli 6 371 kilometrów, czyli 3,958,75 mil.

Konieczne jest uwzględnienie konwersji stopni na radiany w obliczeniach . Podstawiając stopni na radiany, obliczenie jest:

  Exact distance in miles = 3958.75 * arccos[sin(lat1/57.2958) * 
           sin(lat2/57.2958) + 
           cos(lat1/57.2958) * 
           cos(lat2/57.2958) * 
           cos(lon2/57.2958 - lon1/57.2958)] 
0

Domyślna wartość promienia w skrypcie demonstracyjnego phpZipLocator (ziptest.php) wykorzystuje 20 mil jako domyślnego promienia

$radius = 20; 
$zipArray = $zipLoc->inradius($zipOne,$radius); 

Moje przypuszczenie byłoby, że wartość dla $radius jest nadal w kodzie i nadpisywania promień, którego chcesz użyć. Spróbuj wykonać wyszukiwanie i zamień dla $radius.

Co więcej, spójrz na swój kod za pomocą debuggera i sprawdź, czy $radius jest ustawione na 20, gdy zadzwonisz pod numer inradius().

+0

Zmieniłem tę wartość bezpośrednio za pierwszym razem. Dziękuję za pomoc. –

+0

Ive użył funkcji odległości, i ku mojemu zdziwieniu, kody pocztowe, które pojawiają się to 0 mil od mojego kodu pocztowego. –

Powiązane problemy