Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Khoảng cách vị trí địa lý SQL từ một bảng thành phố

Nếu bạn có thể giới hạn khoảng cách tối đa giữa các thành phố và vị trí địa phương của mình, hãy tận dụng thực tế là một phút vĩ độ (bắc - nam) là một hải lý.

Đặt một chỉ mục trên bảng vĩ độ của bạn.

Hãy tạo cho mình một hàm được lưu trữ hasrsine (lat1, lat2, long1, long2, unit) từ công thức hasrsine được hiển thị trong câu hỏi của bạn. Xem bên dưới

Sau đó, làm điều này, với mylatitude, mylongitude và mykm.

SELECT * 
  from cities a
 where :mylatitude >= a.latitude  - :mykm/111.12
   and :mylatitude <= a.latitude  + :mykm/111.12
   and haversine(:mylatitude,a.latitude,:mylongitude,a.longitude, 'KM') <= :mykm
 order by haversine(:mylatitude,a.latitude,:mylongitude,a.longitude, 'KM')

Điều này sẽ sử dụng hộp giới hạn vĩ độ để loại trừ thô sơ các thành phố quá xa so với điểm của bạn. DBMS của bạn sẽ sử dụng quét phạm vi chỉ mục trên chỉ mục vĩ độ của bạn để nhanh chóng chọn ra các hàng trong bảng thành phố của bạn đáng được xem xét. Sau đó, nó sẽ chạy hàm hasrsine của bạn, hàm chứa tất cả các phép toán sin và cosine, chỉ trên các hàng đó.

Tôi đề xuất vĩ độ vì khoảng cách trên mặt đất của kinh độ thay đổi theo vĩ độ.

Lưu ý điều này là thô. Nó tốt cho một công cụ tìm cửa hàng, nhưng đừng sử dụng nó nếu bạn là một kỹ sư xây dựng - trái đất có hình elip và điều này giả sử nó là hình tròn.

(Xin lỗi về con số kỳ diệu 111,12. Đó là số km tính theo vĩ độ, tính bằng sáu mươi hải lý.)

Xem tại đây để biết hàm khoảng cách khả thi.

Tại sao hàm được lưu trữ trong MySQL này lại cho kết quả khác với thực hiện phép tính trong truy vấn?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nhiều mysql HOẶC KHÔNG THÍCH

  2. Cách tốt nhất để xác thực JDBC đầu vào của người dùng?

  3. Sử dụng các phím ngoại để thay thế ràng buộc kiểm tra

  4. Đặt hàng theo `updated_at` và` create_at` ngay cả khi chúng là NULL

  5. Các bảng MySQL lớn