[解決済み】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
.
解決方法は?
-
を使用してポイントを作成します。
Point
の値です。Geometry
のデータ型はMyISAM
テーブルを使用します。 Mysql 5.7.5時点では。InnoDB
テーブルもサポートされるようになりました。SPATIAL
インデックスを表示します。 -
を作成します。
SPATIAL
インデックスを作成します。 -
使用方法
MBRContains()
を使って値を探します。SELECT * FROM table WHERE MBRContains(LineFromText(CONCAT( '(' , @lon + 10 / ( 111.1 / cos(RADIANS(@lat))) , ' ' , @lat + 10 / 111.1 , ',' , @lon - 10 / ( 111.1 / cos(RADIANS(@lat))) , ' ' , @lat - 10 / 111.1 , ')' ) ,mypoint)
で、あるいは
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)
.
これは実際には箱ではなく、球体の長方形:緯度と経度が球体のセグメントを拘束している。のプレーンな長方形とは異なる場合があります。 フランツ・ヨーゼフ・ランド しかし、人が住んでいる場所であれば、ほぼそれに近いものがあります。
-
追加のフィルタリングを適用して、円内のすべてを選択する(四角は選択しない)
-
大きな円の距離を考慮し、さらに細かいフィルタリングを適用する可能性があります(距離が大きい場合)。
関連
-
[解決済み】#1273 - 不明な照合順序:'utf8mb4_unicode_520_ci'
-
[解決済み】MAMPのmysqlサーバーが起動しない。mysqlのプロセスが起動していない
-
[解決済み] MySQL エラー 1093 - FROM 句で更新のターゲット テーブルを指定できません。
-
[解決済み] ONLY_FULL_GROUP_BYの無効化
-
[解決済み] WHEREで集計関数は使用できません "というエラーを回避する方法
-
[解決済み] MySQLです。テーブルを作成できません (errno: 150)
-
[解決済み] この操作を行うには、少なくとも1つのSUPER権限が必要です。
-
[解決済み] WindowsでMySQLの画面コンソールをクリアする方法は?
-
[解決済み] 日付の挿入時にエラーが発生しました - 日付の値が正しくありません。
-
[解決済み] エラーコード1111。グループ関数の無効な使用
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】mysql 外部キー制約が不正に形成されているエラー
-
[解決済み】Fatal error: mysqldをrootで実行する方法は、マニュアルの「セキュリティ」セクションをお読みください。
-
[解決済み】MySQLのDESCRIBE [table]に相当するSQLiteはあるか?]
-
[解決済み] MySQLのforeachループ
-
[解決済み] ONLY_FULL_GROUP_BYの無効化
-
[解決済み] テーブル 'performance_schema.session_variables' は存在しません。
-
[解決済み] mysqladmin: 'localhost'のサーバーへの接続に失敗しました。
-
[解決済み] MySQL エラー 1241。オペランドには1つのカラムが含まれている必要があります。
-
[解決済み] WindowsでMySQLの画面コンソールをクリアする方法は?
-
[解決済み] エラーコード1111。グループ関数の無効な使用