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

    技術的には、これは実際の距離ではなく距離の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. MySQLで過去12か月のデータを取得する方法

    2. Codeigniter db-> update()VS MySQLネイティブUPDATE影響を受ける行:0

    3. mysqlクエリにバッククォート/バッククォートを使用する

    4. Oracle 11g Express Edition for Windows 64ビット?