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

PHP MySql và định vị địa lý

Việc tính toán khoảng cách bằng cách sử dụng hàm đó ở đó khá tốn kém về mặt tính toán, bởi vì nó liên quan đến một loạt các hàm siêu việt. Điều này sẽ có vấn đề khi bạn có một số lượng lớn hàng để lọc.

Đây là một giải pháp thay thế, một phép tính gần đúng ít tốn kém hơn về mặt tính toán:

Khoảng cách gần đúng tính bằng dặm:

sqrt(x * x + y * y)

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

Bạn có thể cải thiện độ chính xác của phép tính khoảng cách gần đúng này bằng cách thêm hàm toán học cosine:

Cải thiện khoảng cách gần đúng tính bằng dặm:

sqrt(x * x + y * y)

where x = 69.1 * (lat2 - lat1) 
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3) 

Nguồn: http://www.meridianworlddata.com/Distance-Calculation.asp

Tôi đã chạy một loạt các thử nghiệm với các tập dữ liệu được tạo ngẫu nhiên.

  • Sự khác biệt về độ chính xác của 3 thuật toán là tối thiểu , đặc biệt là ở khoảng cách ngắn
  • Tất nhiên, thuật toán chậm nhất là thuật toán có các hàm trig (thuật toán trong câu hỏi của bạn). Nó chậm hơn 4 lần so với hai cái kia.

Chắc chắn là không đáng. Chỉ cần ước lượng.
Mã ở đây: http://pastebin.org/424186

Để sử dụng tính năng này trên MySQL, hãy tạo thủ tục được lưu trữ nhận các đối số tọa độ và trả về khoảng cách, sau đó bạn có thể làm như sau:

SELECT columns 
  FROM table 
 WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. làm thế nào để điền giá trị cột mysql dựa trên một công thức?

  2. Dữ liệu phân cấp - Mô hình tập hợp lồng nhau:MySql

  3. Làm cách nào để có được danh sách đầy đủ tất cả các truy vấn hiện đang chạy trên máy chủ MySQL của tôi?

  4. MySQL:Không thể đặt tên cho bảng trong trường hợp Upper Camel (Pascal Case)

  5. mysql nếu hàng không tồn tại, hãy lấy giá trị mặc định