Google Earth(TM) 地図サービスのオススメスポット・Wiki更新状況・おもしろい情報の紹介などを書き綴っていきます。

木曜日, 8月 09, 2007

Rubyで測地系変換準備中

測地系変換
 以前より、測地系の変換を行う場合に、Nowralさんのこちらのサイトを参考に簡易変換式を利用させていただいていましたが、GoogleEarthでマッシュアップを行う場合のために、同サイトで紹介されている計算式の内容を流用させていただくことにしました。  流用に際し、Nowralさんには快く許可いただき、また、アドバイスもいただきました。ありがとうございます。  最終的には、coodinatesタグで利用するために、変換後は「経度,緯度,高度(または0)」というような感じで書き出すようにするつもりです。また、GoogleEarth利用が目的なので、TokyoからWGS84への一方通行です。  といっても、近々利用する予定が無いですので、画像のようにコマンドラインで変換が出来ているか確認するまでに留めて作業はストップ。どうやら上手くいっている模様です。  楽天の宿泊用のAPIは日本測地系ですので、またの機会に利用してみようと思っています。とりあえずお盆休み明けです。 【暫定ソース】 include Math def llh2xyz(a,b,c) #Constant @rd = PI / 180 #Move @dx = 148 @dy = 507 @dz = 681 #Tokyo @ta = 6377397.155 @tf = 1/299.152813 @te2 = 2 * @tf - @tf ** 2 #WGS84 @wa = 6378137 @wf = 1/298.257223 @we2 = 2 * @wf - @wf ** 2 @af = a.to_f @bf = b.to_f @cf = c.to_f @ap = @af * @rd @bp = @bf * @rd @sb = sin(@ap) @cb = cos(@ap) @rn = @ta / sqrt(1 - @te2 * (@sb ** 2)) @x = (@rn + @cf) * @cb * cos(@bp) @y = (@rn + @cf) * @cb * sin(@bp) @z = (@rn *(1 - @te2) + @cf) * @sb @a1 = @x - @dx @b1 = @y + @dy @c1 = @z + @dz @bda = sqrt(1 - @we2) @p = sqrt(@a1 ** 2 + @b1 ** 2) @t = atan2(@c1 , @p * @bda) @st = sin(@t) @ct = cos(@t) @bb = atan2(@c1 + @we2 * @wa / @bda * (@st ** 3) , @p - @we2 * @wa * (@ct ** 3)) @l = atan2(@b1 , @a1) @sbb = sin(@bb) @rnn = @wa / sqrt(1 - @we2 * (@sbb ** 2)) @h = @p / cos(@bb) - @rnn @lat = @bb / @rd @lon = @l / @rd return @lat.to_s + ',' + @lon.to_s + ',' + @h.to_s end p llh2xyz(ARGV[0],ARGV[1],ARGV[2])

2 コメント:

茜丸 さんのコメント...

とあるWebAPIの場合、受け付ける数値がTokyoの場合が多いので、逆も利用する機会はあるかと思います。

出力結果もTokyoしかないものも多いですがそちらはこれまで通りです。インとアウト両方WGS84で受け付けてくれればいいのにとは思いますけれどね。

Takashi.U さんのコメント...

茜丸さんへ

 お盆休みで遅れてしまいました。すみません。

 受け付ける数値がTokyoという場合もあるわけですか…。
 となると、逆も出来ないといけませんね。