Mysql
 sql >> база данни >  >> RDS >> Mysql

Сортиране на MySQL заявка по географска ширина/дължина

Помните ли Питагор?

$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))";

Технически това е квадратът на разстоянието вместо действителното разстояние, но тъй като го използвате само за сортиране, това няма значение.

Това използва формулата за планарно разстояние, която трябва да е добра на малки разстояния.

ОБАЧЕ:

Ако искате да сте по-точни или да използвате по-дълги разстояния, използвайте тази формула за големи кръгови разстояния в радиани :

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

(За да получите разстоянието в реални единици вместо в радиани, умножете го по радиуса на Земята. Това обаче не е необходимо за целите на подреждането.)

Ширината и дължината се приемат от изчислителната машина на MySQL като в радиани, така че ако се съхраняват в градуси (а вероятно е така), ще трябва да умножите всяка стойност по pi/180, приблизително 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))";

или дори:

$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. Дублиране на MySQL таблица, индекси и данни

  2. Как мога да използвам jQuery за изпълнение на MySQL заявки?

  3. MySQL :Множество реда като единичен ред, разделен със запетая

  4. Ограничете SQL със сумата от стойността на реда

  5. Вътрешният цикъл while не работи