ホームページ >データベース >mysql チュートリアル >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)
このクエリ内:
結果を円内の点に制限し、近接性によって並べ替え、クエリを別のクエリ内で囲みます:
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 サイトの他の関連記事を参照してください。