2010-11-16 10 views
9

Bir konumum var (enlem & boylam). Konumumun 10 mil yarıçapında kısmen veya tamamen olan zipkodların listesini nasıl alabilirim? Çözüm, iyi bilinen bir web servisine (google maps, bing haritaları, vb.) Veya yerel bir veritabanı çözümüne (istemcide sql server 2005'e) veya bir algoritmaya çağrı olabilir.Koordinatlar verildiğinde, tüm Posta Kodlarını 10 mil yarıçapında nasıl alabilirim?

Biraz da similar question'u gördüm, ancak bana verilen tüm yanıtlar, bana ulaşamayan SQL Server 2008 coğrafya işlevselliğini kullanmaya oldukça yakın.

+2

Posta kodlarını hangi ülkede bulmaya çalışıyorsunuz? – Pedery

+0

@Pedery. A: – AngryHacker

cevap

5

İlk olarak, tüm zipkodların ve bunlara karşılık gelen enlem ve boylamların bir veritabanına ihtiyacınız olacaktır. Avustralya'da, bunlardan sadece birkaç bin tanesi var (ve bu bilgiler kolayca elde edilebilir), ancak ABD'de muhtemelen daha zor bir görev olduğunu düşünüyorum.

İkincisi, nerede olduğunuzu bildiğiniz ve aradığınız yarıçapı bildiğiniz sürece, bu yarıçapa düşen tüm zipkodları araştırabilirsiniz. aşağıdaki gibi PHP ile yazılmış basit bir şey olacaktır: zipcodes içerir ve bunlara karşılık gelen enlem ve boylam koordinatları posta kodu veritabanı ile

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, bahsettiğim Haversine formülünün bir PHP uygulamasını yayınladı. – winwaed

5

Çoğu arama, sentroidlerle çalışır. Kısmi zipkodlarla 10 mil içinde çalışmak için, zipcode çokgenler (*) içeren bir veritabanı satın almanız gerekecektir. Ardından, 10 mil yarıçapınızda zipkodları köşe noktaları ile kontrol eden bir algoritma uygulayın. Düzgün yapılması için, Haversine formülünü mesafe ölçümü için kullanmalısınız. Bazı akıllı veri yapılarıyla, arama alanını önemli ölçüde azaltabilirsiniz. Benzer şekilde, aramalar, büyük ölçüde, zipcoe uzantılarına (Kuzey, Batı, Doğu, Güney) karşı kaydedilerek ve başlangıçta karşılaştırılarak hızlandırılabilir.

(*) Not: Teknik olarak zipcodes çokgen DEĞİLDİR! Biliyorum ki hepimiz böyle düşünürüz, ama gerçekten veri noktalarının (sokak adresleri) koleksiyonlarıdır ve USPS'nin bunları nasıl kullandığı budur. Bu, zipkodların diğer zipkodları içerebileceği anlamına gelir; zipkodlar çoklu "çokgenler" den yapılabilir; ve zipkodlar diğer zipkodlarla örtüşebilir. Bu durumların çoğu bir sorun olmamalı, ancak çoklu çokgenler olarak tanımlanabilen zipkodları işlemek zorunda kalacaksınız.

9

Başlat (özür C# değil):

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

Enlem ve boylam arasındaki mesafeyi elde etmek için iyi bir mesafe formülü gerekir. Bu site bir kaç varyasyonu vardır:

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

"Büyük Çember Mesafe" formülü biraz aşırıdır. Bu, benim deneyimlerinden yeterince iyi çalışıyor:

sqrt(x * x + y * y) 

where x = 69.1 * (lat2 - lat1) 
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3) 
Kişisel SQL sorgusu sonra böyle bir şey olacaktır

:

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 

İyi şanslar!

+2

Aslında bu harika bir cevaptı ... tüm mesafeler, düşündüğüm çeyrek mil ...1 –

+0

harika cevap 1 - matematik nereden geldiğini söyleyebilir misin? Ondalık sayılar neyi temsil eder? –

+0

meridianworld.com link artık geçerli değil, bu yüzden önbelleğe alınmış sürüme güncellendi. Sihirli sayıların, bir kürenin yüzeyindeki mesafeleri hesaplayan bir uzaklık yaklaşımından geldiğine inanıyorum. Orada daha doğru formüller var, ancak temel "mağaza bulma" senaryosu için, bu benim için iyi çalıştı. Eğer .asp uzantısı damla eğer linke benziyor – dana

İlgili konular