ホームページ >データベース >mysql チュートリアル >MySQL の空間拡張と緯度/経度を使用して円内の点を選択する方法

MySQL の空間拡張と緯度/経度を使用して円内の点を選択する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-06 12:23:41383ブラウズ

How to Select Points Within a Circle Using MySQL Spatial Extensions and Latitude/Longitude?

MySQL 空間拡張: 緯度/経度に基づいて円内の点を選択する

背景:

MySQL は、その空間拡張を使用して地理空間データを保存できます。これにより、点、線、ポリゴンなどの空間オブジェクトの効率的なクエリと操作が可能になります。一般的なタスクの 1 つは、指定された場所から指定された半径内のポイントを選択することです。

地理空間拡張の使用:

このタスクを実行するために、MySQL はバッファーなどのいくつかの地理空間関数を提供します。 () は、点または線の周囲にバッファー ゾーンを作成します。ただし、MySQL は緯度と経度に基づく近接計算をネイティブにサポートしていないことに注意することが重要です。

代替アプローチ:

以下に基づいて円内の点を決定します。緯度と経度が異なる場合は、別のアプローチが必要です。大圏距離公式を使用して、地球の表面上の 2 点間の距離を計算できます。これを MySQL クエリに組み込んで、指定した半径内のポイントをフィルタリングできます。

サンプル クエリ:

次のクエリは、大圏距離の式を使用して次のことを行う方法を示しています。指定された緯度と経度から半径 100 メートル以内のフラグを選択します:

SELECT id, coordinates, name, r,
        units * DEGREES(ACOS(LEAST(1.0, COS(RADIANS(latpoint))
                  * COS(RADIANS(latitude))
                  * COS(RADIANS(longpoint) - RADIANS(longitude))
                  + SIN(RADIANS(latpoint))
                  * SIN(RADIANS(latitude))))) AS distance
   FROM flags
   JOIN (
        SELECT 42.81  AS latpoint,  -70.81 AS longpoint, 
               10.0 AS r, 69.0 AS units
        ) AS p ON (1=1)
  WHERE MbrContains(GeomFromText (
        CONCAT('LINESTRING(',
              latpoint-(r/units),' ',
              longpoint-(r /(units* COS(RADIANS(latpoint)))),
              ',', 
              latpoint+(r/units) ,' ',
              longpoint+(r /(units * COS(RADIANS(latpoint)))),
              ')')),  coordinates)

この例ではクエリでは、latpoint パラメーターと Longpoint パラメーターはユーザーの位置を表します。 r パラメータと単位パラメータは、半径 (メートル単位) と緯度ごとの距離単位を指定します。

追加の考慮事項:

  • 上記のクエリは距離を計算します。大圏距離の公式を使用します。これは、緯度および緯度のデカルト距離よりも正確です。
  • 結果を円内の点に制限するには、WHERE 句を追加して、半径以下の距離をフィルターします。
  • 結果を距離で並べ替えて、最も近いフラグを表示します。まず。
  • 座標列の空間インデックス作成により、クエリのパフォーマンスが大幅に向上します。

次のようにします。このアプローチでは、緯度と経度に基づいて円内の点を効果的に選択でき、MySQL 空間拡張機能を使用して位置ベースのアプリケーションを作成できるようになります。

以上がMySQL の空間拡張と緯度/経度を使用して円内の点を選択する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。