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

Cách tiếp cận tốt nhất để tìm tất cả các địa chỉ nằm trong một khoảng cách cụ thể đến điểm đã chọn là gì

Khi tôi đã triển khai điều này trong MySQL (để lưu trữ các địa điểm trên một khối cầu, về cơ bản là trái đất (tôi cho rằng bạn đang nói về trái đất!)), Tôi đã lưu trữ càng nhiều thông tin được tính toán trước càng tốt trong cơ sở dữ liệu. Vì vậy, đối với một hàng lưu trữ latitudelongitude , Tôi cũng tính toán tại thời điểm chèn các trường sau:

  • radiansLongitude (Math.toRadians(longitude) )
  • sinRadiansLatitude (Math.sin(Math.toRadians(latitude) )
  • cosRadiansLatitude (Math.cos(Math.toRadians(latitude) )

Sau đó, khi tôi tìm kiếm các địa điểm nằm trong đơn vị X của latitude / longitude trong câu hỏi, tuyên bố đã chuẩn bị của tôi như sau:

from Location l where
    acos(
        sin(:latitude) * sinRadiansLatitude + 
        cos(:latitude) * cosRadiansLatitude * 
        cos(radiansLongitude - :longitude) 
        ) * YYYY < :distance
    and l.latitude>:minimumSearchLatitude
    and l.latitude<:maximumSearchLatitude 
    and l.longitude>:minimumSearchLongitude 
    and l.longitude<:maximumSearchLongitude 
    order by acos(
                sin(:latitude) * sinRadiansLatitude + 
                cos(:latitude) * cosRadiansLatitude * 
                cos(radiansLongitude - :longitude)  
        ) * YYYY asc

Nơi YYYY =3965 cung cấp cho bạn khoảng cách tính bằng dặm hoặc YYYY =6367 có thể được sử dụng cho khoảng cách tính bằng km.

Cuối cùng, tôi đã sử dụng maximumSearchLatitude / maximumSearchLongitude / minimumSearchLongitude / maximumSearchLongitude các tham số để loại trừ phần lớn các điểm khỏi tập kết quả trước khi cơ sở dữ liệu phải thực hiện bất kỳ phép tính nào. Bạn có thể cần hoặc không. Nếu bạn sử dụng điều này, bạn sẽ tùy thuộc vào giá trị nào mà bạn chọn cho các thông số này, vì nó sẽ phụ thuộc vào những gì bạn đang tìm kiếm.

Rõ ràng là các ứng dụng hợp lý của các chỉ mục trong cơ sở dữ liệu sẽ là cần thiết.

Lợi ích của việc sử dụng phương pháp này là thông tin không bao giờ thay đổi nhưng cần thiết mỗi lần chỉ được tính một lần, trong khi tính toán các giá trị của radiansLongitude , sinRadiansLatitude , cosRadiansLatitude cho mọi hàng mỗi khi bạn thực hiện tìm kiếm sẽ rất tốn kém rất nhanh.

Tùy chọn khác là sử dụng chỉ mục không gian địa lý , có nghĩa là tất cả những điều này sẽ được cơ sở dữ liệu xử lý cho bạn. Tôi không biết Hibernate tích hợp tốt như thế nào với điều đó.

Tuyên bố từ chối trách nhiệm:đã lâu rồi tôi không xem xét vấn đề này và tôi không phải là chuyên gia GIS!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặt NOW () làm Giá trị Mặc định cho kiểu dữ liệu datetime?

  2. Chuỗi hoặc int có được ưu tiên cho các khóa ngoại không?

  3. Cách giải quyết MySQL innodb Đang chờ khóa siêu dữ liệu bảng trên TRUNCATE TABLE?

  4. Chèn một đối tượng datetime.datetime trong Python vào MySQL

  5. Làm cách nào để sử dụng đúng đối tượng PDO cho truy vấn SELECT được tham số hóa