株式会社シスアナコム

情報システムに関することなら、どんなことでも適切に助言いたします!

この投稿は1年以上前に公開されました。
現在では状況や内容が変わっている可能性があります。
ご注意下さい。m(_ _)m

VBAで2地点間の距離を計算。駅から最も近い公園と遠い公園は?

      2015/05/08

位置の次は距離

前回の記事で、全国の公園の名称と位置をACCESSのデータベースにすることができました。

取得できた位置情報を使って何かできないか考えた結果、次は距離を計測することにしました。

2地点間の距離が非常に短ければ、それほど難しい計算は必要ありませんが、地球を意識するぐらいの長く離れた2地点間の距離を計算する場合は、特別な計算式が必要です。

2地点の緯度と経度を使って距離を計算する方法を検索したところ、なんとこちらの「やまだらけ」というウェブサイトにJavaのプログラムまで掲載してました。

Javaのプログラムでしたので、VBAに移植。

Option Compare Database
Option Explicit

Const GRS80_A = 6378137#
Const GRS80_E2 = 6.69438002301188E-03
Const GRS80_MNUM = 6335439.32708317

Const PAI = 3.14159265358979

Function deg2rad(deg As Double) As Double

    deg2rad = deg * PAI / 180#

End Function

Function calcDistHubeny(lat1 As Double, lng1 As Double, lat2 As Double, lng2 As Double) As Double

    Dim my As Double
    Dim dy As Double
    Dim dx As Double
    Dim sin As Double
    Dim w As Double
    Dim m As Double
    Dim n As Double
    Dim dym As Double
    Dim dxncos As Double
    
    my = deg2rad((lat1 + lat2) / 2#)
    dy = deg2rad(lat1 - lat2)
    dx = deg2rad(lng1 - lng2)
    
    sin = Math.sin(my)
    w = Math.Sqr(1# - GRS80_E2 * sin * sin)
    m = GRS80_MNUM / (w * w * w)
    n = GRS80_A / w
    
    dym = dy * m
    dxncos = dx * n * Math.Cos(my)
    
    calcDistHubeny = Math.Sqr(dym * dym + dxncos * dxncos)

End Function

ヒュベニの公式とGRS80という測地系を使って距離を求めています。

「やまだらけ」の管理人様、参考にさせて頂き、ありがとうございました。

試しに北海道立十勝エコロジーパークと国営沖縄記念公園首里城公園の距離を計算してみました。

?calcDistHubeny(42.93256721,143.31486359,26.21700311,127.71924499)
 2342278.05778668 

およそ2340km離れているようです。

日本の長さは3000kmぐらいだと言われていますから、こんなもんかな。

国土地理院の測量計算サイトでもっと正確に距離を測定できるサイトがあったのでチェック。

2,333,861.247(m)

だいぶ誤差があるようですが、使えないほどではないと思いました。

最寄り駅を計算

これで2地点間の距離を測定できるようになりました。

次は駅の位置情報をどこかから持ってきて、公園の最寄り駅を計算してみました。

公園の最寄り駅を計算して役に立つのかは分かりませんが。

駅の位置情報は国土数値情報の中にもあるのですが、今回はこちらの「駅データ.JP」というサイトからダウンロードしました。

国土数値情報のデータはやや古いのですが、このサイトの情報は常に最新の情報に更新されているようです。

このようなデータを無料でダウンロードできるなんて驚き。

さらにこちらはCSVファイルなので、ACCESSへのインポートも簡単でした。

公園のテーブルに駅コードと距離を格納できるフィールドを追加。

駅の位置情報と公園の位置情報を総当たりの多対多で計算して、最も短い距離の駅コードを公園のコードと記録してみました。

プログラムはあまりに簡単なので掲載しませんが、総当たりなので全てを計算するのに数日かかりました。

結果

まず、前回掲載した家近くの公園と最寄り駅。
西所沢駅まで546mなら納得できる距離。

<br /> 埼玉県所沢市春の台公園 西所沢駅まで546m<br />

駅から最も近い公園は駅からたったの6mで駅名が公園名。

<br /> 千葉県千葉市葭川公園 葭川公園駅まで6m<br />

駅から最も遠い公園は東京都にありました。

<br /> 東京都小笠原村大神山公園 伊豆急下田駅まで896,548m<br />

 - ACCESSデータベース, ひとこと, ひとこと(情報化), 週末プログラマー

↓ブログランキングに参加しています!


ネット・PC(全般) ブログランキングへ
にほんブログ村 IT技術ブログ ITコンサルティングへ
にほんブログ村

Message

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