ホームページ >データベース >mysql チュートリアル >MySQL を使用して、指定された緯度と経度の半径内のポイントを見つけるにはどうすればよいですか?

MySQL を使用して、指定された緯度と経度の半径内のポイントを見つけるにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-06 12:44:41437ブラウズ

How Can I Use MySQL to Find Points Within a Given Radius of Latitude and Longitude?

MySQL 空間拡張を使用して円内の点を取得する

緯度と経度に基づいて空間クエリを実行するには、地理空間関数を使用して MySQL を拡張する必要があります。ただし、MySQL には、これらの座標を含む距離計算用に特別に設計された組み込みの空間関数がないことに注意することが重要です。

代わりに、地球の表面上の近接円には、大圏距離を使用する必要があります。これは、ハバーサインまたは他の適切なアルゴリズムを使用して実装できます。 MySQL 5.6 は、平面形状内のデカルト距離を計算する文書化されていない st_ distance(p1, p2) 関数を提供しますが、これはデカルト距離によって生じる歪みのため、緯度と経度に基づく計算には適していません。

実際のアプリケーションとして、特定の場所から 10 法定マイル以内にあるすべての旗を検索するクエリを考えてみましょう。緯度/経度ポイント:

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)

このクエリ内:

  • 緯度点と経度点は、ユーザーの位置の緯度と経度を表します。
  • r は検索です。マイル単位の半径。
  • 単位は、地球の表面の緯度ごとの距離単位を表します。 (例: マイルの場合は 69 マイル、キロメートルの場合は 111.045 km)。
  • MbrContains は、境界四角形に基づいて検索エリアの外側にある点を明らかに除外します。
  • 大圏距離の式は距離を計算します。

結果を円内の点に制限し、近接性によって並べ替え、クエリを別のクエリ内で囲みます:

SELECT id, coordinates, name
   FROM (
         /* the above query, pasted in here */
        ) AS d
  WHERE d.distance <= d.r
  ORDER BY d.distance ASC

以上がMySQL を使用して、指定された緯度と経度の半径内のポイントを見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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