2010-11-16 18 views
9

Tôi có một vị trí (vĩ độ & kinh độ). Làm thế nào tôi có thể nhận được một danh sách các mã zip một phần hoặc toàn bộ trong bán kính 10 dặm của vị trí của tôi?Đã đặt tọa độ, làm thế nào để tôi nhận được tất cả Mã Zip trong bán kính 10 dặm?

Giải pháp có thể là cuộc gọi đến dịch vụ web nổi tiếng (bản đồ google, bản đồ bing, v.v ...) hoặc giải pháp cơ sở dữ liệu cục bộ (máy khách có sql server 2005) hoặc thuật toán.

Tôi đã thấy phần similar question, nhưng tất cả các câu trả lời có khá nhiều liên quan đến việc sử dụng chức năng địa lý SQL Server 2008 không khả dụng đối với tôi.

+2

Bạn đang cố gắng tìm mã zip cho quốc gia nào? – Pedery

+0

@Pedery. US of A – AngryHacker

Trả lời

5

Thứ nhất, bạn sẽ cần một cơ sở dữ liệu về tất cả các mã zip và vĩ độ và kinh độ tương ứng của chúng. Ở Úc, chỉ có một vài nghìn trong số này (và thông tin có sẵn một cách dễ dàng), tuy nhiên tôi cho rằng đây có thể là một nhiệm vụ khó khăn hơn ở Mỹ.

Thứ hai, cho bạn biết bạn đang ở đâu và bạn biết bán kính bạn đang tìm kiếm, bạn có thể tra cứu tất cả các mã zip nằm trong bán kính đó. Một cái gì đó đơn giản viết bằng PHP sẽ như sau: (xin lỗi nó không phải trong 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 đã đăng một bản PHP thực hiện công thức Haversine mà tôi đã đề cập. – winwaed

5

Hầu hết các tìm kiếm đều hoạt động với các centroid. Để làm việc với zipcodes một phần là trong vòng 10 dặm, bạn sẽ phải mua một cơ sở dữ liệu đa giác mã bưu điện (*). Sau đó, thực hiện một thuật toán kiểm tra mã zip với đỉnh trong bán kính 10 dặm của bạn. Để được thực hiện đúng, bạn nợ sử dụng công thức Haversine để đo khoảng cách. Với một số cấu trúc dữ liệu thông minh, bạn có thể giảm đáng kể không gian tìm kiếm. Tương tự như vậy, các tìm kiếm có thể được đẩy nhanh đáng kể bằng cách lưu trữ và so sánh ban đầu với các vùng mở rộng zipcoe (Bắc, Tây, Đông, Nam).

(*) Lưu ý: Mã zip kỹ thuật KHÔNG phải là đa giác! Tôi biết tất cả chúng ta đều nghĩ về chúng như thế, nhưng thực sự chúng là tập hợp các điểm dữ liệu (địa chỉ đường phố) và đây là cách mà USPS thực sự sử dụng chúng. Điều này có nghĩa là mã zip có thể bao gồm các mã zip khác; mã zip có thể được tạo thành từ nhiều "đa giác"; và mã zip có thể chồng lên các mã zip khác. Hầu hết các tình huống này không phải là một vấn đề, nhưng bạn sẽ phải xử lý các mã zip có thể được định nghĩa là đa giác.

9

Bắt đầu với một cơ sở dữ liệu mã zip chứa zipcodes và vĩ độ và kinh độ tương ứng của họ phối:

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

Để có khoảng cách giữa vĩ độ và kinh độ, bạn sẽ cần một công thức khoảng cách tốt. Trang web này có một vài biến thể:

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

Các "Great Circle cách" công thức là một cực ít. Cái này hoạt động tốt đủ từ kinh nghiệm của tôi:

sqrt(x * x + y * y) 

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

Query SQL của bạn sau đó sẽ giống như thế này:

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 

Chúc may mắn!

+2

Đây thực sự là một câu trả lời tuyệt vời ... tất cả các khoảng cách đều nằm trong vòng một phần tư dặm mà tôi đã tìm ra ...+1 –

+0

câu trả lời tuyệt vời +1 - bạn có thể cho tôi biết toán học đến từ đâu không? Số thập phân đại diện cho những gì? –

+0

Liên kết đến meridianworld.com không còn hợp lệ, vì vậy tôi đã cập nhật nó lên phiên bản được lưu trong bộ nhớ cache. Tôi tin rằng những con số ma thuật đến từ một khoảng cách xấp xỉ tính toán khoảng cách trên bề mặt của một hình cầu. Có nhiều công thức chính xác hơn, nhưng đối với kịch bản "định vị cửa hàng" cơ bản của bạn, công thức này đã hoạt động tốt đối với tôi. – dana