2011-01-15 44 views
6

Tôi có một truy vấn cố gắng tìm mọi thứ trong một vị trí địa lý nhất định, nhưng kết quả mà nó mang lại là một chút ... lạ.Truy vấn những thứ gần vị trí địa lý?

Trước đây tôi đã đăng chủ đề này và cộng đồng đã giúp tôi tìm một công thức mà tôi cần: Querying within longitude and latitude in MySQL nhưng truy vấn hiện cung cấp kết quả thực sự lập dị.

dữ liệu của tôi là xung quanh thành phố San Francisco trong đó có các lat/lng 37.780182 , -122.517349

Query:

SELECT 
    id, 
    hike_title, 
    lat, 
    lng, 
    (3959 * acos( cos(radians(37)) 
        * cos(radians(lat)) 
        * cos(radians(lng) - radians(37.780182)) 
        + sin(radians(-122.517349)) * sin(radians(lat)) 
       ) 
    ) AS distance 
FROM 
    my_awesome_table 
HAVING 
    distance < 10000 
ORDER BY 
    distance 
LIMIT 
    0 , 50 

Vì vậy, như bạn thấy - ngay cả khi tôi làm cho bán kính 10000 nó vẫn doesn' t tìm thấy nhiều, vì vậy tôi tự hỏi nếu truy vấn của tôi là tắt. Một số kết quả nó mang lại thậm chí có 0,0 cho lat/lng đó là cách của tôi để biểu thị rằng không có lat/lng cho bản ghi đó.

Sau đây là cách công thức có nghĩa vụ phải trông giống như:

SELECT 
    id, 
    (3959 * acos( cos(radians(37)) 
        * cos(radians(lat)) 
        * cos(radians(lng) - radians(-122)) 
        + sin(radians(37)) * sin(radians(lat)) 
       ) 
    ) AS distance 
FROM 
    markers 
HAVING 
    distance < 25 
ORDER BY 
    distance 
LIMIT 
    0 , 20; 

Cảm ơn bạn và xin lỗi cho câu hỏi đau đớn dài! Nhân tiện, tôi đang sử dụng MySQL.


Hmmm,

Tôi chỉ thử với truy vấn chính xác mà bạn đã đưa ra và nó làm việc với độ chính xác 50%. Dưới đây là một mẫu của tập dữ liệu:

lat   lng  
| 37.223465 | -122.090363 | 
| 39.320980 | -111.093735 | 
| 38.031715 | -84.495132 | 
| 37.787144 | -122.493263 | 
| 52.975361 | -1.458620 | 
| 40.848557 | -111.906883 | 
| 40.572498 | -111.859718 | 

Vì vậy, bây giờ là truy vấn trả lại tất cả các mục mà rất nhiều dặm, nhưng không phải là mặt hàng mà là dưới 100 dặm. Giống như mặt hàng này (37.787144, -122,493263) không bao giờ bị quay trở lại mặc dù nó chỉ là khoảng 50 dặm từ điểm xuất phát. Bạn có biết tại sao không?

+3

Tại sao bạn không sử dụng phần mở rộng không gian của MySQL cung cấp các chức năng để loại công cụ này? http://dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html –

+1

Chỉ cần đọc qua một số chủ đề ở đó. Không chắc tôi hiểu nó quá rõ ràng, nhưng có thể dường như quá mức cần thiết cho nhu cầu của tôi. Nó có làm cho mọi việc nhanh hơn nhiều để truy vấn không? Bạn có nghĩ rằng đó là giải pháp tốt hơn nhiều so với một trong những chúng tôi đang thảo luận trong chủ đề này? Cảm ơn! – Genadinik

Trả lời

12

Tôi nghĩ rằng bạn đảo ngược các vĩ độ (37,780182) và vĩ độ (-122,517349) của điểm trung tâm của bạn, hãy thử:

select 
    id, 
    hike_title, 
    lat, 
    lng, 
    (3959 * acos( cos(radians(37)) 
        * cos(radians(lat)) 
        * cos(radians(lng) - radians(-122.517349)) 
        + sin(radians(37.780182)) * sin(radians(lat)) 
       ) 
    ) AS distance 
FROM 
    my_awesome_table 
HAVING 
    distance < 10000 
ORDER BY 
    distance 
LIMIT 
    0 , 50 
+0

Làm thế nào để chuyển đổi 'khoảng cách' thành mét? –

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