位置情報を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]
