2012-01-24 25 views
23

Tôi có một cơ sở dữ liệu có khoảng 10 nghìn hàng hiện tại. Tất cả chúng đều có kinh độ/vĩ độ dựa trên trung tâm của một mã zip. Tôi tìm thấy một truy vấn mà bây giờ tôi đang cố gắng mở rộng, nhưng tất cả trong tất cả nó hoạt động tốt đến một điểm. Tuy nhiên, trong ví dụ của tôi dưới đây tôi đang cố gắng tìm những thứ trong bán kính 25 dặm, mà tất cả dường như làm việc cho hầu hết các phần. Hầu hết các kết quả của tôi làm mang lại trong các tiêu chuẩn 25 dặm, tuy nhiên tôi nhận được một số ít đó là cách tắt bất cứ điều gì từ 86 dặm đến 800 dặm ngoài khơi dấu.truy vấn kinh độ và vĩ độ mySQL cho các hàng khác trong bán kính x dặm

Ví dụ: Đây là trung tâm của tôi lat/lon: 37,2790669, -121,874722 = San Jose, CA Im nhận được kết quả như sau: 33,016928, -116,846046 = San Diego, CA đó là khoảng 355 dặm từ San Jose.

truy vấn hiện tại của tôi trông giống như:

SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180)) 
* cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515) 
AS `distance` FROM `geo_locations` HAVING `distance` <= 25 ORDER BY `distance` ASC" 

Trả lời

72

Dưới đây là các truy vấn tôi sử dụng trên cửa hàng định vị tôi làm việc với:

SELECT 
    `id`, 
    (
     6371 * 
     acos(
      cos(radians(:lat)) * 
      cos(radians(`lat`)) * 
      cos(
       radians(`long`) - radians(:long) 
      ) + 
      sin(radians(:lat)) * 
      sin(radians(`lat`)) 
     ) 
    ) `distance` 
FROM 
    `location` 
HAVING 
    `distance` < :distance 
ORDER BY 
    `distance` 
LIMIT 
    25 

:lat:long là những điểm trôi qua bởi người sử dụng ở đâu latlong là các điểm được lưu trữ trong cơ sở dữ liệu.

Các: Khoảng cách được đo bằng dặm, trong phiên bản làm việc của mã: khoảng cách thực sự kéo từ một danh sách thả xuống từ 10-50 dặm

Thay đổi mã để làm việc với cây có thể được thực hiện bằng cách thay đổi 3959 (khoảng cách từ trung tâm của trái đất để bề mặt của nó trong dặm) đến 6371 (3959 dặm chuyển đổi sang cây số) nhờ joshhendo cho giải pháp đó.

+1

vui vì đã làm việc cho bạn – Gordnfreeman

+3

Gordnfreeman, bạn có thể cho tôi biết chữ "<25" có nghĩa là gì không? Là 25 dặm hoặc km? Và tôi có một câu hỏi khác cho bạn nếu bạn không phiền khi trò chuyện nhanh với tôi? – dcolumbus

+0

Có cách nào chúng ta có thể dễ dàng chuyển đổi điều này để sử dụng KM không? Tôi đoán nó có một cái gì đó để làm với 3935 ở đầu truy vấn, nhưng không hoàn toàn chắc chắn những gì nó làm. – joshhendo

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