ホームページ >データベース >mysql チュートリアル >データベース内で地理空間データの半径検索を効率的に実行するにはどうすればよいですか?

データベース内で地理空間データの半径検索を効率的に実行するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-01 01:13:28728ブラウズ

How can I efficiently perform radius searches in a database for geospatial data?

地理空間半径検索のためのデータベース クエリ

このコンテキストでは、マーカーによって表される定義された半径エリア内に位置が含まれる個人を識別することを目的としています。地図。

半径の計算

点 (x, y) が (x1, y1) を中心とする半径 r の円内にあるかどうかを判断するには、次の式を使用します:

(x - x1)^2 (y - y1)^2

度からキロメートルへの変換

方程式の両側で一貫した単位を確保するために、変換係数 111.12 km/度を使用して緯度と経度をキロメートルに変換します。

修正された式

変換を適用すると、変更された式は次のようになります:

((x - x1) * 111.12)^2 ((y - y1) * 111.12)^2

ここで、4 は 2 キロメートルの半径 2 乗を表します。

SQL 実装

MySQL でこの式を実装するには、各マーカー (ユーザー A) をペアにするクエリを構築します。 ) 位置を特定するユーザー (ユーザー B) の中心点を使用します:

<code class="sql">SELECT A.user_id, A.radius_id, A.latitude, A.longitude
FROM UserA AS A
JOIN (SELECT user_id, latitude, longitude FROM UserB WHERE user_id = 8) AS B
ON (POW((A.latitude - B.latitude) * 111.12, 2) + POW((A.longitude - B.longitude) * 111.12, 2)) <= 4</code>

精度向上

より正確な結果を得るには、式を次のように変更できます。緯度に関して緯度経度の差を考慮します:

((x - x1) * 111.12 * cos(B.latitude))^2 ((y - y1) * 111.12)^2 < = 4

または経度に関して:

((x - x1) * 111.12 * cos(A.latitude))^2 ((y - y1) * 111.12)^2 < ;= 4

以上がデータベース内で地理空間データの半径検索を効率的に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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