Home » Programing » SQLで2点間の緯度経度から距離を測定する方法

Check     このエントリーをはてなブックマークに追加

位置情報をmysqlなどのRDBMS上に保持して、2点間の距離を求めたり、ユーザの現在地とデータベース上にある位置データとの距離を求めるときにSQLで何とかしようという話です。

まず2点間の距離は、三平方の定理を使うと

a^2 + b^2 = c^2(cが斜辺)

ということのようです。ただし地球は丸いので直線での公式とは違うため、長い距離になるとずれるようですが、その辺りは誤差として無視することとします。

そしてWikipediaから平均で緯度1度あたり111km、経度1度あたり91kmということなので、距離は

距離(km) = √((緯度1 – 緯度2) / 0.0111)^2 + ( (経度1 – 経度2) / 0.0091)^2

で求められるということになります。

mysqlのSQLで書くと下記のようになります。

SELECT SQRT(POWER((緯度1 – 緯度2) / 0.0111, 2) + POWER((経度1 – 経度2) / 0.0091, 2)) AS distance

渋谷駅(35.658482,139.701441)と新宿駅(35.690224,139.700089)の距離を求めると、

[code]
mysql> SELECT SQRT(POWER((35.658482 - 35.690224) / 0.0111, 2) + power((139.701441 - 139.70008) / 0.0091, 2)) AS distance;
+------------------+
| distance |
+------------------+
| 2.86354800792301 |
+------------------+
1 row in set (0.01 sec)
[/code]

2.8kmくらいになりました。これでデータと現在地の距離を求めて近い順に出すとかがSQLでできてしまいます。例えば下記のような雰囲気で。

[code]
SELECT SQRT(POWER((現在地緯度 - lat) / 0.0111, 2) + power((現在地経度 - lng) / 0.0091, 2)) AS distance FROM geodata ORDER BY distance
[/code]

Check     このエントリーをはてなブックマークに追加
タグ:
  • あああ

    緯度が極めて高いOR低い場合は全く使えませんね。