sql >> データベース >  >> RDS >> Mysql

データベース:地理的位置データを照会するための最良の方法は?

    MySQLのジオロケーションパフォーマンスに関する優れた論文がありますここ> 。

    編集 これが固定半径を使用していることを確認してください。また、距離を計算するためのアルゴリズムが最も進んでいるとは100%確信していません(つまり、地球を「ドリル」します)。

    重要なのは、適切な距離検索を行うために、アルゴリズムが安価で行数にボールパーク制限を与えることです。

    アルゴリズムは、ソースポイントの周囲の正方形で候補を取得し、距離をマイルで計算することにより、事前にフィルタリングします。 。

    これを事前に計算するか、ソースが示唆するようにストアドプロシージャを使用してください:

    # Pseudo code
    # user_lon and user_lat are the source longitude and latitude
    # radius is the radius where you want to search
    lon_distance = radius / abs(cos(radians(user_lat))*69);
    min_lon = user_lon - lon_distance;
    max_lon = user_lon + lon_distance;
    min_lat = user_lat - (radius / 69);
    max_lat = user_lat + (radius / 69);
    
    SELECT dest.*,
      3956 * 2 * ASIN(
        SQRT(
          POWER(
            SIN(
              (user_lat - dest.lat) * pi() / 180 / 2
            ), 2
          ) + COS(
            user_lat * pi() / 180
          ) * COS(
            dest.lat * pi() / 180
          ) * POWER(
            SIN(
              (user_lon - dest.lon) * pi() / 180 / 2
            ), 2
          )
        )
      ) as distance
    FROM dest
    WHERE 
      dest.lon between min_lon and max_lon AND
      dest.lat between min_lat and max_lat
    HAVING distance < radius
    ORDER BY distance
    LIMIT 10
    


    1. Python FlaskとMySQLを使用してゼロからWebアプリを作成する:パート5

    2. PHP / MySQL-一意のランダムな文字列を作成する最良の方法は?

    3. ネイティブライブラリsqljdbc_auth.dllはすでに別のクラスローダーにロードされています

    4. 別のテーブルの外部キーとして使用される自動生成された主キーを判別する方法