ホームページ >データベース >mysql チュートリアル >## 緯度と経度を使用して正確な位置情報検索を行うために MySQL クエリを最適化するにはどうすればよいですか?

## 緯度と経度を使用して正確な位置情報検索を行うために MySQL クエリを最適化するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-25 19:52:02470ブラウズ

## How to Optimize MySQL Queries for Accurate Geolocation Searches Using Latitude and Longitude?

緯度と経度を使用した位置情報検索のための MySQL クエリの最適化

MySQL では、地理的近接性に基づいてデータを取得するのが一般的なタスクです。経度と緯度の値を操作する場合、予期しない結果を避けるために効率的なクエリを使用することが重要です。

中心の緯度と経度から半径 25 マイル以内の行を検索しようとする次のクエリを考えてみましょう。

<code class="sql">SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180))
* cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515)
AS `distance` FROM `geo_locations` HAVING `distance` <= 25 ORDER BY `distance` ASC</code>

このクエリは通常は機能しますが、一部の行については不正確な結果が生成され、指定された半径からはるかに遠い結果が表示される可能性があります。

精度を向上させるには、次の最適化されたクエリを検討してください。

<code class="sql">SELECT
    `id`,
    (
        6371 *
        acos(
            cos( radians( :lat ) ) *
            cos( radians( `lat` ) ) *
            cos(
                radians( `long` ) - radians( :long )
            ) +
            sin(radians(:lat)) *
            sin(radians(`lat`))
        )
    ) `distance`
FROM
    `location`
HAVING
    `distance` < :distance
ORDER BY
    `distance`
LIMIT
    25</code>

このクエリでは、:lat パラメータと :long パラメータは中心点の緯度と経度を表し、: distance は半径をマイル単位で表します。

2 つのクエリの主な違いは次のとおりです。ラジアンをマイルに変換するための変換係数として 6371 を使用します。この係数は、元のクエリで使用されている 3959 よりも正確です。さらに、最適化されたクエリでは、緯度と経度に基づいて距離を計算するためのより厳密な式が使用されます。

これらの最適化を実装することで、緯度と経度の値を使用して位置情報検索を実行する際の MySQL クエリの精度を大幅に向上させることができます。結果が常に指定された半径距離内に収まるようにします。

以上が## 緯度と経度を使用して正確な位置情報検索を行うために MySQL クエリを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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