2011-01-14 38 views
20

Trước khi yêu cầu các ví dụ mã cụ thể, tôi chỉ muốn hỏi liệu có thể thực hiện truy vấn giống như mã giả này không:Truy vấn trong kinh độ và vĩ độ trong MySQL

chọn các mục từ bảng nơi lat/lon = - trong x dặm của một số lat/lon point-

có phải đó là doable? Hay tôi phải nhảy qua một số vòng? Bất kỳ phương pháp tiếp cận tốt nào có thể được đề xuất sẽ tuyệt vời!

Trả lời

49

Bạn nên tìm kiếm các công thức Haversine, nhưng một khởi đầu tốt có thể là:

Trích dẫn từ url đầu tiên :

Đây là câu lệnh SQL sẽ tìm thấy 20 vị trí gần nhất nằm trong bán kính 25 dặm về phía 37, -122 phối hợp. Nó tính toán khoảng cách dựa trên vĩ độ/kinh độ của hàng đó và vĩ độ/kinh độ mục tiêu, sau đó chỉ yêu cầu các hàng có giá trị khoảng cách nhỏ hơn 25, đặt hàng toàn bộ truy vấn theo khoảng cách và giới hạn nó thành 20 kết quả. Để tìm kiếm theo km thay vì dặm, thay thế 3959 với 6371.

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; 
+0

Cảm ơn bạn đã đề xuất. Tôi vừa đăng một câu hỏi mới ở đây: http://stackoverflow.com/questions/4697624/querying-for-things-near-a-geolocation – Genadinik

+2

Điều này không trả lại bất kỳ khoảng cách tính toán nào cho tôi, chỉ cần 'NULL' toàn bộ thời gian . –

+0

Không trả lại kết quả về điểm chính xác. Những kết quả trả về khoảng cách như NULL không hoạt động trên mệnh đề có. – Maykonn

5

Tôi rất muốn khuyên bạn sử dụng một trong hai SpatiaLite hoặc PostGIS cho các loại hình hoạt động. Họ đã xây dựng trong các loại chức năng mà bạn đang cố gắng để viết mã. Họ cũng có sự hỗ trợ thích hợp cho dữ liệu không gian không thực sự tồn tại trong MySQL.

Không chính xác một giải pháp trong MySQL nhưng là giải pháp tốt hơn nếu bạn muốn tiếp tục thực hiện các yêu cầu không gian trong tương lai.

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