2009-08-07 26 views
6

Tôi đã tìm thấy PHP/MySQL Script phổ biến này được gọi là Zip Location bởi SaniSoft và nó hoạt động tốt bên cạnh một điều: Nó không trong một số trường hợp.Tìm mã Zip trong một Radius cụ thể

Dường như bất kỳ bán kính dưới 20 dặm trả về cùng một lượng mã zip như 20 dặm. Tôi đã tìm kiếm trên tất cả các google, nhưng vô ích và tôi đã tự hỏi nếu ai đó có một số cái nhìn sâu sắc về tình trạng này.

Tôi muốn tìm ra vấn đề này trước khi phải trả tiền cho một chương trình và tôi cũng có thể sử dụng trải nghiệm học tập. Cơ sở dữ liệu là danh sách các mã zip và kinh độ và vĩ độ của từng mã zip. Kịch bản lệnh sử dụng một phương pháp xác định khoảng cách xung quanh mã zip đã nhập và trả về mã zip trong bán kính đó dựa trên lon/lat của chúng.

Cảm ơn bạn !!

Edit: Từ sử dụng chức năng khoảng cách mà kịch bản cung cấp tôi đã phát hiện ra rằng khoảng cách giữa Mã Zip rằng chương trình mang lại cho tôi và mã zip của tôi đang mọc lên như 0 dặm.

CẬP NHẬT CHỦ YẾU

Từ nghiên cứu đó chỉ ra rằng cơ sở dữ liệu đã sao chép lat giá trị/lon. Xin lưu ý điều này khi sử dụng Zip Locator. Mặc dù PHP thực hiện công việc của mình, bạn sẽ cần phải tìm Cơ sở dữ liệu mã zip mới. Tôi sẽ đăng các phát hiện của tôi vào một ngày sau đó.

Trả lời

1

Lần thử thứ hai!

Xem tuyên bố vấn đề đã chỉnh sửa của bạn, tôi sẽ xem xét cách bạn chỉ định giá trị zip của mình.

Rất nhiều lỗi có thể được giới thiệu nếu mã zip của bạn là số nguyên thay vì chuỗi. Vấn đề lớn nhất là mã zip của Hoa Kỳ có thể bắt đầu bằng 0.

Các ví dụ trong ziptest.php không tốt, vì điều chỉnh nén là số nguyên. Khi bạn cố gắng để mô tả mã zip của riêng tôi với một số nguyên:

$zip1 = 02446; 

nó giải thích bằng PHP như giá trị bát phân 2446. phpZipLocator những ứng dụng mà đánh giá như là một chuỗi mà không cần bất kỳ chuyển đổi rõ ràng. Do đó, PHP cung cấp cho nó giá trị thập phân của bát phân 2446 dưới dạng một chuỗi (1318) không phải là mã zip.

Thay vì thông báo rằng nó đã không tìm thấy một mã zip, phpZipLocator hiện một tìm kiếm bán kính của tất cả các mã zip trong vòng bán kính nhất định cái gì đó không tồn tại, mà nó quyết định nên 1.

Nếu Tôi đặt mã zip bằng cách sử dụng một chuỗi

$zip1 = '02446'; 

Tôi nhận được kết quả chính xác.

IMHO có vẻ như phpZipLocator có thể sử dụng một ít công việc.

+0

Cảm ơn bạn rất nhiều otterfan. 1 cho bạn nhưng, tiếc là điều này không giải quyết được vấn đề. Mã zip tôi đang sử dụng là 11950 và bán kính i được đặt thành 5, mã này đi kèm với 73 mã zip. Tôi đang gửi biến mã zip thông qua biến đăng hiện tại. Nhưng tôi đã thay đổi biến thành $ zip1 = '11950'; và tôi vẫn nhận được kết quả tương tự. –

+0

Tôi thấy nó hoạt động như thế nào với Mã Zip của bạn, những thứ thú vị ở đây. –

+0

Thậm chí thú vị hơn, một số mã 73 zip mà đi lên khoảng 20 dặm. –

10

Các tính toán khoảng cách gần đúng tương đối đơn giản, nhưng có thể tạo ra lỗi khoảng cách từ 10% trở lên. Các tính toán xấp xỉ này được thực hiện bằng cách sử dụng các giá trị vĩ độ và kinh độ trong độ. Xấp xỉ đầu tiên đòi hỏi hàm toán học chỉ đơn giản:

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

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

Bạn có thể cải thiện tính chính xác của tính toán khoảng cách tương đối điều này bằng cách thêm chức năng cosin toán:

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) 

Nếu bạn cần độ chính xác cao hơn, bạn phải sử dụng tính toán khoảng cách chính xác. Việc tính toán khoảng cách chính xác yêu cầu sử dụng hình học hình cầu, vì Trái đất là một hình cầu. Việc tính toán khoảng cách chính xác cũng yêu cầu mức độ cao của độ chính xác toán học dấu phẩy động - khoảng 15 chữ số chính xác (đôi khi được gọi là "độ chính xác kép"). Ngoài ra, các phép tính trig được sử dụng trong phép tính chính xác yêu cầu chuyển đổi vĩ độ và các giá trị kinh độ từ độ sang radian. Để chuyển đổi vĩ độ hoặc kinh độ từ độ sang radian, hãy chia giá trị vĩ độ và kinh độ trong cơ sở dữ liệu này 180/pi hoặc 57,2958. Bán kính của Trái đất được giả định được 6371 km, hoặc 3,958.75 dặm.

Bạn phải bao gồm chuyển đổi từ thành radian trong tính toán . Độ thay thế cho radian, phép tính là:

  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

Giá trị mặc định cho bán kính trong kịch bản trình diễn cho phpZipLocator (ziptest).php) sử dụng 20 dặm như bán kính mặc định của nó

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

tôi đoán sẽ là giá trị cho $radius vẫn còn trong mã của bạn và được ghi đè lên bán kính bạn muốn sử dụng. Thử thực hiện tìm kiếm và thay thế cho $radius.

Tốt hơn, hãy xem mã của bạn bằng trình gỡ lỗi và xem nếu $radius được đặt thành 20 khi bạn gọi inradius().

+0

Tôi đã thay đổi giá trị đó trực tiếp lần đầu tiên. Cảm ơn bạn đã giúp đỡ của bạn mặc dù. –

+0

Ive sử dụng các chức năng từ xa, và trước sự ngạc nhiên của tôi, các mã zip mà đi lên là 0 dặm từ mã zip của tôi. –

Các vấn đề liên quan