Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Koordinat perbandingan dalam database

Cara terbaik untuk menangani penelusuran kedekatan adalah memulai dengan semacam pendekatan persegi panjang, dan kemudian beralih dari sana ke jarak lingkaran besar yang sebenarnya di antara orang-orang.

Selama garis lintang Anda tidak terlalu dekat dengan kutub, perkiraan yang ceroboh tetapi dapat diterapkan untuk jarak antara dua titik adalah ini (dalam bahasa SQL):

GREATEST(ABS(lat1-lat2),ABS(long1-long2))

Jika Anda ingin lebih tepatnya dan Anda tahu bahwa Anda hanya peduli dengan orang-orang yang ada di dalam, katakanlah, 10 km satu sama lain, Anda dapat menggunakan pencarian persegi panjang pembatas seperti ini.

WHERE latitude_from_table
    BETWEEN latpoint  - (10.0 / 111.045)
        AND latpoint  + (10.0 / 111.045)
  AND longitude_from_table
    BETWEEN longpoint - (10.0 / (111.045 * COS(RADIANS(latpoint))))
        AND longpoint + (10.0 / (111.045 * COS(RADIANS(latpoint))))

Ini berfungsi karena ada 111,045 km dalam satu derajat garis lintang. Istilah kosinus dalam batas bujur menjelaskan fakta bahwa garis lintang lebih dekat saat Anda mendekati kutub. Ini memungkinkan Anda mengeksploitasi indeks MySQL pada kolom latitude_from_table dan longitude_from_table Anda.

Setelah Anda memiliki kedekatan kotak pembatas, Anda dapat menerapkan rumus jarak lingkaran yang bagus. Berikut latar belakang itu. http://www.plumislandmedia.net/mysql/haversine-mysql- lokasi terdekat/

Untuk jenis aplikasi yang Anda pertimbangkan, floating point IEEE-488 32-bit cukup presisi untuk koordinat Anda. Jika titik yang Anda lihat sangat berdekatan (kurang dari satu km atau lebih), Anda ingin menggunakan rumus Vincenty (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ) daripada yang lebih umum disebut rumus haversine (http://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/ ).

Jika jumlah orang Anda jauh di atas 300 ribu, Anda mungkin ingin mempertimbangkan untuk menggunakan skema pengindeksan geospasial MySQL. Ini hanya bekerja dengan tabel MyISAM, tetapi sangat cepat dalam melakukan pencarian bounding-rectangle. Lihat disini. http://www.plumislandmedia.net/mysql/haversine-mysql- lokasi terdekat/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. perbarui dengan pernyataan bergabung mysql?

  2. Flask-SQLAlchemy - Kapan tabel/database dibuat dan dimusnahkan?

  3. Menggunakan $_SESSION untuk membawa data

  4. perbarui dua tabel sekaligus

  5. dapatkah saya mereset bidang auto_increment di mySql?