2地点の緯度経度から距離を求める(Goole MAPS API ~距離の計算式編~)

my-hobby : 2地点の緯度経度から距離を求める(Google MAPS APIとの比較~結果報告編~)の結果で、Google Maps API リファレンス – Google Maps API – Google Code(google方式)の精度が、3平方の定理を使用した方式(ろっきー方式)よりも精度が良い事が分かりました。
そこでgoogle方式の計算式を調べていたところ、偶然、javascriptのコードを緯度経度から2点の距離を求める – masakiplusの日記で見つけました。

今回は、これをVB.netに変換し、2点間の距離を算出しました。
以下のプログラムです。
[vbnet]
Imports System.Math
Public Function Getdistance(ByVal longitudeFrom As Double, ByVal latitudeFrom As Double, ByVal longitudeTo As Double, ByVal latitudeTo As Double)As Double
Dim from_x As Double ‘A地点の経度(ラジアン)
Dim from_y As Double ‘A地点の緯度(ラジアン)
Dim to_x As Double ‘B地点の経度(ラジアン)
Dim to_y As Double ‘B地点の緯度(ラジアン)
Dim deg As Double
Dim distance As Double ‘2地点の距離

from_x = longitudeFrom* Math.PI / 180
from_y = latitudeFrom * Math.PI / 180
to_x = longitudeTo * Math.PI / 180
to_y = latitudeTo * Math.PI / 180

deg = Sin(from_y) * Sin(to_y) + Cos(from_y) * Cos(to_y) * Cos(to_x – from_x)
distance = 6378140 * (Atan(-deg / Sqrt(-deg * deg + 1)) + Math.PI / 2) / 1000 ‘2地点の距離(Km)
Return distance

End Function
[/vbnet]

このプログラムを使用して、計算を行った結果と、google方式の結果を比較したところ、以下の様な結果となりました。

図1-計算結果

図1-計算結果

※赤がgoogle方式、黒がインターネット上で見つけた計算式です。
google方式、インターネット上で見つけた方式の順に上書き描画しています。

なんと黒色の点しか存在しません。

詳細に調べる為、結果を数値レベルで比較したところ、最も誤差の大きいところでも0.013Km程度でした。(0.00008%の誤差)
また、上記のケースは東経0~180度、北緯0~90度の範囲ですが、念の為に世界全体で比較した場合も同様の結果となりました。(図2を参照)

図2-計算結果(世界全体)

図2-計算結果(世界全体)

プログラムで小数点以下を扱う以上、この程度の誤差は出てしまうので、ほぼこの計算式で間違いないと言えます。

なおGoogle MAPS APIの公式な情報として、この計算式が発表されているわけでは無いので、本当の計算式は不明ですが、非常によく似た結果になった事は事実です。
今回は計5回に分けて記事を書きましたが、その結果以下の結論を得る事が出来ました。

・三平方の定理を使用した2地点の距離の計算式(ろっきー方式)よりは、Google MAPS APIが提供している機能(google方式)の方が精度が良い。
・図1、図2の様なテストケースにおいて、Google MAPS APIが提供している2地点の距離を求める計算結果は、上記の計算式を使用して計算した結果と非常によく似ている。

前者は悔しいですが、ある意味予想通りの結果でした。
ただ後者の事実が得られた事は予想外の収穫でした。

この計算式があれば、インターネットが利用できない環境(Google MAPS APIが利用できない環境)でも、Google MAPS APIを利用した場合と同等の結果(2地点の距離)を求めることが出来るようになります。

ちなみに余談ですが、計算式のヒントとして紹介したサイトから、更にそのサイトが参考にしたサイト(Seis Pesos)は、googleマップを使った技術がすごいです。
上記の計算式も、元々はこのサイトで掲載されていた様です。(今は無かったです)
今後googleマップを使ったアプリを作る機会があったら参考にしたいと思います。(今回のもう一つの収穫でした)

カテゴリー: flashcast, googlemap, VB.NET, 緯度経度検索 パーマリンク

2地点の緯度経度から距離を求める(Goole MAPS API ~距離の計算式編~) への1件のフィードバック

  1. ピンバック: my-hobby : GoogleAPI~2つの住所から距離を求める~

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です