2010-11-16 24 views
9

Mam lokalizację (szerokość geograficzna & długości geograficznej). Jak mogę uzyskać listę kodów pocztowych, które są częściowo lub całkowicie w promieniu 10 mil od mojej lokalizacji?Podane współrzędne, w jaki sposób mogę uzyskać wszystkie kody Zip w promieniu 10 mil?

Rozwiązaniem może być połączenie z dobrze znaną usługą sieciową (mapy google, mapy bing, itp.) Lub rozwiązanie do lokalnej bazy danych (klient ma serwer sql 2005) lub algorytm.

Widziałem trochę similar question, ale wszystkie odpowiedzi tam w dużej mierze dotyczą korzystania z funkcji geograficznej SQL Server 2008, która jest dla mnie niedostępna.

+2

W jakim kraju szukasz kodów pocztowych? – Pedery

+0

@Pedery. US of A – AngryHacker

Odpowiedz

5

Po pierwsze, będziesz potrzebować bazy danych wszystkich kodów pocztowych i odpowiadających im szerokości i długości geograficznych. W Australii jest ich tylko kilka tysięcy (a informacje są łatwo dostępne), ale zakładam, że jest to prawdopodobnie trudniejsze zadanie w USA.

Po drugie, jeśli wiesz, gdzie jesteś i znasz promień, którego szukasz, możesz wyszukać wszystkie kody zip, które mieszczą się w tym promieniu. Coś prostego napisany w PHP będzie w następujący sposób: (przepraszam to nie jest w C#)

function distanceFromTo($latitude1,$longitude1,$latitude2,$longitude2,$km){ 
    $latitude1 = deg2rad($latitude1); 
    $longitude1 = deg2rad($longitude1); 
    $latitude2 = deg2rad($latitude2); 
    $longitude2 = deg2rad($longitude2); 
    $delta_latitude = $latitude2 - $latitude1; 
    $delta_longitude = $longitude2 - $longitude1; 
    $temp = pow(sin($delta_latitude/2.0),2) + cos($latitude1) * cos($latitude2) * pow(sin($delta_longitude/2.0),2); 
    $earth_radius = 3956; 
    $distance = $earth_radius * 2 * atan2(sqrt($temp),sqrt(1-$temp)); 
    if ($km) 
    $distance = $distance * 1.609344; 
    return $distance; 
} 
+0

AngryHacker: Luke opublikował implementację PHP formuły Haversine, o której wspomniałem. – winwaed

5

Większość wyszukiwań współpracuje z centroidami. Aby pracować z częściowymi kodami zip znajdującymi się w promieniu 10 mil, będziesz musiał kupić bazę danych wielokątów z kodu pocztowego (*). Następnie zaimplementuj algorytm sprawdzający kody z wierzchołkami w promieniu 10 mil. Aby wykonać to poprawnie, należy użyć formuły Haversine do pomiaru odległości. Dzięki sprytnym strukturom danych można znacznie zmniejszyć przestrzeń wyszukiwania. Podobnie, można znacznie przyspieszyć wyszukiwanie poprzez przechowywanie i początkowe porównywanie z zasięgiem zipcoe (północ, zachód, wschód, południe).

(*) Uwaga: Technicznie kody pocztowe NIE są wielokątami! Wiem, że wszyscy tak o nich myślą, ale tak naprawdę są to zbiory punktów danych (adresy uliczne) i tak naprawdę USPS je wykorzystuje. Oznacza to, że kody zip mogą zawierać inne kody zip; kody zip mogą być wykonane z wielu "wielokątów"; a kody pocztowe mogą nakładać się na inne kody zip. Większość tych sytuacji nie powinna stanowić problemu, ale będziesz musiał obsługiwać kody zip, które można zdefiniować jako wiele wielokątów.

9

przycisk Start z bazy danych kod pocztowy, który zawiera zipcodes i ich odpowiednie współrzędne geograficzne:

http://www.zipcodedownload.com/Products/Product/Z5Commercial/Standard/Overview/

Aby uzyskać odległość między szerokością geograficzną i długością geograficzną, będziesz potrzebował dobrej formuły odległości. Ta strona ma kilka odmian:

http://www.meridianworlddata.com/distance-calculation/

„Wielki Krąg Odległość” formuła jest trochę ekstremalne. Ten działa wystarczająco dobrze z mojego doświadczenia:

sqrt(x * x + y * y) 

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

zapytanie SQL będzie wtedy wyglądać tak:

select zd.ZipCode 
from ZipData zd 
where 
    sqrt(
     square(69.1 * (zd.Latitude - @Latitude)) + 
     square(69.1 * (zd.Longitude - @Longitude) * cos(@Latitude/57.3)) 
    ) < @Distance 

powodzenia!

+2

To była naprawdę świetna odpowiedź ... wszystkie dystanse znajdują się w odległości ćwierć mili, które wymyśliłem ...+1 –

+0

świetna odpowiedź +1 - czy możesz mi powiedzieć, skąd pochodzi matematyka? Co oznaczają liczby dziesiętne? –

+0

Link do meridianworld.com nie jest już ważny, więc zaktualizowałem go do wersji z pamięci podręcznej. Wierzę, że magiczne liczby pochodzą z pewnego przybliżenia odległości, które oblicza odległości na powierzchni kuli. Istnieją bardziej dokładne formuły, ale dla twojego podstawowego scenariusza "lokalizatora sklepu" ten działał dobrze dla mnie. – dana