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

Menyortir kueri MySQL berdasarkan Latitude/Longitude

Ingat Pythagoras?

$sql = "SELECT * FROM table 
    WHERE lon BETWEEN '$minLon' AND '$maxLon' 
      AND lat BETWEEN '$minLat' AND '$maxLat'
    ORDER BY (POW((lon-$lon),2) + POW((lat-$lat),2))";

Secara teknis itu adalah kuadrat jarak, bukan jarak sebenarnya, tetapi karena Anda hanya menggunakannya untuk menyortir, itu tidak masalah.

Ini menggunakan rumus jarak planar, yang seharusnya bagus untuk jarak kecil.

NAMUN:

Jika Anda ingin lebih presisi atau menggunakan jarak yang lebih jauh, gunakan rumus ini untuk jarak lingkaran besar dalam radian :

dist = acos[ sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lng1-lng2) ]

(Untuk mendapatkan jarak dalam satuan nyata, bukan radian, kalikan dengan jari-jari Bumi. Namun, itu tidak perlu untuk tujuan pengurutan.)

Lintang dan bujur diasumsikan oleh mesin komputasi MySQL dalam radian, jadi jika disimpan dalam derajat (dan mungkin demikian), Anda harus mengalikan setiap nilai dengan pi/180, kira-kira 0,01745:

$sf = 3.14159 / 180; // scaling factor
$sql = "SELECT * FROM table 
    WHERE lon BETWEEN '$minLon' AND '$maxLon' 
      AND lat BETWEEN '$minLat' AND '$maxLat'
    ORDER BY ACOS(SIN(lat*$sf)*SIN($lat*$sf) + COS(lat*$sf)*COS($lat*$sf)*COS((lon-$lon)*$sf))";

atau bahkan:

$sf = 3.14159 / 180; // scaling factor
$er = 6350; // earth radius in miles, approximate
$mr = 100; // max radius
$sql = "SELECT * FROM table 
    WHERE $mr >= $er * ACOS(SIN(lat*$sf)*SIN($lat*$sf) + COS(lat*$sf)*COS($lat*$sf)*COS((lon-$lon)*$sf))
    ORDER BY ACOS(SIN(lat*$sf)*SIN($lat*$sf) + COS(lat*$sf)*COS($lat*$sf)*COS((lon-$lon)*$sf))";


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masalah tipe data Laravel 4.2 BIT

  2. Perulangan persegi panjang svg dari database

  3. JDBC Buat Tabel Contoh Penggunaan Pernyataan

  4. Cara menulis kueri SQL dengan LIMIT dinamis

  5. MySQL Mengubah Prosedur Tersimpan