1. ホーム
  2. マイスル

[解決済み】2つの緯度経度点間の距離を最速で求める方法

2022-04-04 16:38:56

質問

現在、mysqlデータベースに100万件弱の地点があり、すべて経度と緯度の情報を持っています。

ある地点と他の多くの地点との距離をクエリで求めようとしています。特に1秒間に100回以上のヒットがあると、思うように速度が出ない。

もっと速いクエリ、あるいはmysql以外の高速なシステムはないのでしょうか?私はこのクエリを使っています。

SELECT 
  name, 
   ( 3959 * acos( cos( radians(42.290763) ) * cos( radians( locations.lat ) ) 
   * cos( radians(locations.lng) - radians(-71.35368)) + sin(radians(42.290763)) 
   * sin( radians(locations.lat)))) AS distance 
FROM locations 
WHERE active = 1 
HAVING distance < 10 
ORDER BY distance;

注:提供された距離は マイル数 . もし、あなたが キロメートル を使用します。 6371 の代わりに 3959 .

解決方法は?

で、あるいは MySQL 5.1 以上とする。

    SELECT  *
    FROM    table
    WHERE   MBRContains
                    (
                    LineString
                            (
                            Point (
                                    @lon + 10 / ( 111.1 / COS(RADIANS(@lat))),
                                    @lat + 10 / 111.1
                                  ),
                            Point (
                                    @lon - 10 / ( 111.1 / COS(RADIANS(@lat))),
                                    @lat - 10 / 111.1
                                  ) 
                            ),
                    mypoint
                    )

これは、ボックス内のほぼすべてのポイントを選択します (@lat +/- 10 km, @lon +/- 10km) .

これは実際には箱ではなく、球体の長方形:緯度と経度が球体のセグメントを拘束している。のプレーンな長方形とは異なる場合があります。 フランツ・ヨーゼフ・ランド しかし、人が住んでいる場所であれば、ほぼそれに近いものがあります。

  • 追加のフィルタリングを適用して、円内のすべてを選択する(四角は選択しない)

  • 大きな円の距離を考慮し、さらに細かいフィルタリングを適用する可能性があります(距離が大きい場合)。