Map
家の前に広がる果樹園で農家の人が手入れを始めた。世間の休みなんてお構いなしにだ。 昔から、土方殺すにゃ刃物はいらぬ、雨の三日も降ればよい と言われるけど、これ、農家の 人にも当てはまるね。誰だって、寒風吹きすさむ雪の日になんて仕事したくないもん。
この間降った雪がまだ畑に残っているが、りんごの樹の周りだけが融けている。樹は暖かいんです ねぇ。生きているんですねぇ。朝は鳥さん達がやって来てにぎやかだ。虫でも食べているのかな?
農家の人は、不要な枝をさかんに切っている。いわゆる剪定ってやつだ。素人が見ても、どの枝を 落として、どの枝を残すかなんてさっぱり分からない。大きな枝をばっさりやってたりして、そん なに大胆に切ってしまって大丈夫? という程である。
切った枝を束ねて更に適当な大きさに揃えていた。後始末はどうするんだろう? 腐らせて肥料に でもするのだろうか? 興味は尽きない。これから1年、じっくりと観察してみよう。ベランダと 言う特等席から。
カシミール3D
昔からMapと言えば、Haskellのそれ、Schemeのそれ、Rubyにも有ったな。Rubyの場合はMap派と Collect派が対立してて、どっちかがエイリアスになってたような。まあ、matzさん流の事の 収め方なんでしょうな。
最近は、言語のMapじゃなくて実世界のMapでもかじってみようかと言う気になっている。 今はまだ寒いけど、雪が融けて日差しが暖かになったら、どこかに出かけてみようと思って いるからだ。
車のナビにここへ行けと指令しておけば、後は指示に従って左右にハンドルを切るだけで 連れて行ってくれるけど、それじゃちと味気ない。やっぱり全体を俯瞰したいなと。 それには地図だよ。ぱらぱらすれば、抜け道も分かろうと言うものだ。
で、今回はハムの移動先をどうしようと言う訳である。出来るだけ高い所へ行きたいよね。 馬鹿と煙は高い所へ上がる のだ。でも、やみくもに高い所へ行けばいいって訳でもない。 交信相手がいればこそ、なんで、ハムがいっぱいいそうな街が見える所がいいなって訳。(U/V狙い の場合)
山からの眺めがあらかじめ分かると最高。そんな地図ってあるのか? たまに雑誌で 見かけるカシミール3Dってのが良さそう。これって、山屋さんや 山ガール(時々、山婆もいるみたいだけど)の必携らしい。おいらは昔(青年の頃)、スキーが 好きでスキー屋(山スキー)をやっていたけど、あの頃、こういう道具が有ったら、256倍は優に 楽しめたと思うと残念である。少々、生まれた時が早すぎたかな。
最近の進んだハムはこのカシミールを使って、記録更新に挑戦してるらしい。高い周波数になると 光と同じで電波は直進する。よって高い山同士で、間に障害物ないポイントを見つけるのが肝要。 そういう絶景ポイントをカシミールで見つけ出して、それぞれの山に登って、遠距離交信の記録を 樹立したそうな。
このカシミール3Dは機能が豊富過ぎて、攻略本が出ている。本屋で探してみたけど置いて無かった。 そうか、山の中で暮らしていたら、山、山って騒ぐ事もないから、このあたりでは流通してない んだな。都会の山ガール用か。
HPの解説を見ながら、ふむふむしてるんだけど、任意の場所からの眺めや断面図は描けないみたい。 やっぱり、攻略本付属のCDから地図データを入れてやらないと、まともに使えんのかのう? ネットでうろうろしてたら、 カシミール3Dの使い方なんて のに出合った。
そうか、やりたい事をするには、普通の地図(って、どういうのや?)に標高データが入った地図を 重ねてあげるといいみたい。仰せに従って、トライしてみる事にした。
XMLの地図情報
攻略本には全国のデータが網羅されてるみたいだけど、おいらの行動範囲は、まあ、自宅から片道 100km圏内ぐらいだろうな。100kmなら、せいぜい車で2時間ぐらいで行けるだろう。それぐらいの範囲の データなら、ネットから落としてきても知れてるな。
基板地図情報のダウンロードサービスへ行き、数値標高モデルの (GML)形式をクリックして、自分の欲しい標高データを頂いてくる。結構、大きなデータなので 欲張らない事。
DLしたデータはZIPになっているので、圧縮を解いてあげると、ながったらしい名前のxmlファイルが 表れる。S式の劣化版にご対面。
<?xml version="1.0" encoding="Shift_JIS"?> <Dataset xsi:schemaLocation="http://fgd.gsi.go.jp/spec/2008/FGD_GMLSchema FGD_GMLSchema.xsd" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://fgd.gsi.go.jp/spec/2008/FGD_GMLSchema" gml:id="Dataset1"> <gml:description>基盤地図情報メタデータ ID=fmdid:7-26</gml:description> <gml:name>基盤地図情報ダウンロードデータ(GML版)</gml:name> <DEM gml:id="DEM001"> <fid>fgoid:10-00100-7-4-553803</fid> <lfSpanFr gml:id="DEM001-1"> <gml:timePosition>2008-12-03</gml:timePosition> </lfSpanFr> <devDate gml:id="DEM001-2"> <gml:timePosition>2008-12-03</gml:timePosition> </devDate> <orgGILvl>25000</orgGILvl> <orgMDId>fmdid:0-5</orgMDId> <type>10mメッシュ(標高)</type>
これ、冒頭部分ね。encodingがSJISって、そんな? いいんでしたっけ?(UTFじゃなくて) 土地を10m四方に区切った 時の標高データですって。timePositionってのは、観測日の事かな。
<gml:boundedBy> <gml:Envelope srsName="fguuid:jgd2000.bl"> <gml:lowerCorner>36.666666667 138.375</gml:lowerCorner> <gml:upperCorner>36.75 138.5 </gml:upperCorner> </gml:Envelope> </gml:boundedBy>
これは、データの収録範囲を表しているのかな。左下の緯度経度は、北緯36.666666667度、東経138.375度。 右上は北緯36.75度、東経138.5度。嗚呼、上は北極方面と言う仮定ね。
<gml:GridEnvelope> <gml:low>0 0</gml:low> <gml:high>1124 749</gml:high> </gml:GridEnvelope>
左下の座標は 0,0 右上が 1124,749 という事だな。するってえと、約11.2Km X 7.5Km 四方を 表すのか。データの個数は、1125x750個(843750個)になるのか。
<gml:tupleList> その他,400.00 その他,400.20 その他,400.40 : その他,1618.00 その他,1620.40 その他,1624.30 </gml:tupleList>
その他って言う情報量ゼロの属性と共に、各メッシュの標高データが記されていました。全く このXMLを定義した人って、どういう頭をしてたんでしょうね? せめて通し番号ぐらいは つけてくらはい。
心配なので、データの欠落等が無いか確認しておきました。
[sakae@cdr ~]$ grep , FG.xml | wc 843750 843750 12281735
どうやら、大丈夫そうです。(ファイル名は長すぎたので、短縮URLに習い適当に手動で縮めてあります。) そうそう、これらのデータをDLした時、付属文書も付いてたよ。
概要: この標高データは、全国の2万5千分1地形図の等高線データ等を基に、 地表0.4秒(約10m)間隔で区切った方眼(メッシュ)中心点の標高を求めた数値標高モデル (DEM)です。なお、標高値は0.1m単位となっていますが、1m単位で求めたものが有効値であり、 小数点以下につきましては、参考値として格納していますので、ご利用の際には予めご了承ください。
作成方法:(全国の2万5千分1地形図の等高線データ等から不規則三角網 (以下、「TIN」という。)を作成して、地表を緯度経度ともに0.4秒(約10m)間隔で 区切った方眼(メッシュ)の中心点の標高を記録した。)
データ変換
このxmlファイルでは扱いにくいので、カシミールでは専用のフォーマット(バイナリー)に 変換してから使うようになっている。その変換プラグインは、基盤地図情報(標高)プラグイン らしいので、インストールしてあげる。変換の手順とか使い方もマニュアルが 公開されているので、手順通りに進めればよい。
私の場合は、30個のxmlファイル(総容量373MB)のものを変換したら、13MBのサイズになったよ。その他 って 言う役立たずが消えてくれただけじゃ、こんなに小さくはならんだろう。バイナリーフォーマットは 公開されていないけど、どうなっているんだろう? ちょいと想像してみっかな。
普通に考えたら、標高って、一番高い山のチョモランマでも9000m弱だから、1データが2バイトの いわゆるshort intに収まりそうだ。そうすると、843k個のデータの2倍ぐらいになるんかな? 多分、皆同じサイズのファイル、違うかな?
[sakae@cdr ~/tmp]$ ls -lh * -rw-r--r-- 1 sakae kuma 497K 2 6 16:02 1.xem -rw-r--r-- 1 sakae kuma 527K 2 6 15:41 2.xem -rw-r--r-- 1 sakae kuma 12M 2 1 2009 FG.xml
変換後のxemと言う拡張子のつくファイルは、サイズも違うし、予想してたのよりもずっと小さい。これはきっと 圧縮されているに違いない。データの特性からして、10m離れた所で、何百メートルも標高が異なる 事はあるまい。そう仮定すれば、隣のデータとの差分だけを記憶すればよいな。そうすれば、1データが 1バイトに収まる。これだけじゃ、まだ大きいな。差分データを更に圧縮してるんだろうな。
鑑賞
先の『カシミール3Dの使い方』に習って、山頂からの眺めをシュミレートしてみた。指定した山は、 小学校時代に遠足で登った山。まだ有ったんだと感慨深いですな。ネットからデータを取得しつつ 描画していくので、少々待たされるけど、精緻な画像が表示された。目線をぐるっと360度回して 眺められるのが良い。
大体どこの山頂にも、遠方の山の名前が分かるようにレリーフが置いてあるけど、あんな感じで 山の名前が表示されてる。こちらの人なら誰でも知っている、まみくとい の山もちゃんと有ったぞ。 思えば、この名前も小学校の担任の先生が教えてくれたんだっけ。
山ばかりじゃなくて、東京付近のデータを持ってきておけば、スカイツリーからの眺めもきっと 再現出来るぞ。面白いな。
更に、断面図なんてのを選ぶと、(登山)ルートに沿った距離とか標高がグラフになって出てくる。 これを使えば、間に障害になるような山が有るかどうかも一発で判定出来るな。無線の通信記録を 樹立した人も、この機能を使って遠距離ルートを開発したんだな。暇に任せて色々やったら、更に 遠距離なルートを開拓出来るかな。
一方、標高を重ね合わせると地図が立体的に見えてくるんだ。そう、スイスで買った、芸術的な 地図のようにね。スイスで発行されている数値地図にカシミール3Dが対応するようにした所、 スイス連邦地理院から、感謝状が送られたとか。素晴らしい!
おいらもこのプラグインを入れて、久しぶりにスイスの地図でも眺めてみっかな。昔、アルプスで暮らす なんて本を読んだ時、モンブランの周りをぐるっとハイキングする、ツール・ド・モンブラン と呼ばれるものが人気とか書いてあった(全行程10日ぐらいかかるらしい)。地図を持って、回ってみたいな。
と思ったら、スイスの地図は有料なのね。それ以前に、スイス語と言うか、フランス語、ドイツ語、イタリア語 全然わかりませーん。そんな訳で潔く諦めて、フリーで使える地図データは無いものかと探してみると、 フリー数値地図を、カシミール3Dの作者 さんが公開されてるじゃないですか。
説明によると、山を円錐形に近似 したんで、リアリティーに欠けるとなってるな。山の形は、 フラクタルだそうですから、円錐にフラクタルを加味したら、リアルっぽくなるんじゃありません事? 何だか、こういう知ったかぶりな事を書くと、おまえがやれと言われそう。フラクタルって再帰で 表現出来るんだよね、とまた余計な事を言ってしまった。
おまけで見通し距離の計算
上で、スカイツリーに登った時のどう見えるか、なんて書いた。言い換えれば、どこまで遠くまで 見通せるかという事になる。よくあるよね。富士山に登ったらどこまで見えるかってのも。 ピタゴラスの定理で簡単に計算出来る。えっと、計算には地球の半径が必要だったな。
地球の半径は、赤道付近で 6378.157Kmだそうだ。スカイツリーの現在高は? 600m(0.600Km)と しておこうか。
[sakae@cdr ~]$ irb irb(main):001:0> a = 6378.157 => 6378.157 irb(main):002:0> c = a + 0.600 => 6378.757 irb(main):003:0> b = Math.sqrt(c * c - a * a) => 87.4879900329253
スカイツリーからだと、87Km四方(四方と言うより、半径だな)が見渡せて
irb(main):004:0> c = a + 3.776 => 6381.933 irb(main):005:0> b = Math.sqrt(c * c - a * a) => 219.504213718098
富士山からだと、約220Kmと見渡せる範囲が広がるのね。そんじゃ、高さを色々変化させた時に どうなるか調べてみる。このページのタイトルがmapってなってるので、mapに登場願おう。gosh(Scheme)を 久々に使ってみます。
(use srfi-1) (define (cal h) (let* ([a 6378.157] [c (+ a (/ h 1000))]) (floor (sqrt (- (* c c) (* a a))))))
高さをメートルで与えた時の見通し距離を返す手続きです。これが定義出来れば、後は計算したい値を 与えるだけですね。今回は色々な高さを与えたいので、リストを作ってmapで一気に計算します。
gosh> (iota 10 1 1) (1 2 3 4 5 6 7 8 9 10) gosh> (map cal (iota 10 1 1)) (3.0 5.0 6.0 7.0 7.0 8.0 9.0 10.0 10.0 11.0)
iotaって手続きは、等差数列を生成します。第一引数がデータの個数、次が数列の初期値、最後の引数はステップ値 となっています。unixにもiotaと同じ働きをするjotなんていう、コマンドもありましたね。尚、iotaを 使う場合、srfi-1をuseしておくのをお忘れなく。
1mの目線な人は3Km先まで、2mの目線な人は5Km先まで見通せ、10m高のアンテナだと11Km範囲内は 直接波が届くって事です。
そんじゃ、後は対数的に高さを変えてみますね。
gosh> (iota 10 10 10) (10 20 30 40 50 60 70 80 90 100) gosh> (map cal (iota 10 10 10)) (11.0 15.0 19.0 22.0 25.0 27.0 29.0 31.0 33.0 35.0) gosh> (map cal (iota 10 100 100)) (35.0 50.0 61.0 71.0 79.0 87.0 94.0 101.0 107.0 112.0) gosh> (map cal (iota 10 1000 1000)) (112.0 159.0 195.0 225.0 252.0 276.0 298.0 319.0 338.0 357.0) gosh> (map cal (iota 10 10000 10000)) (357.0 505.0 619.0 715.0 800.0 876.0 947.0 1013.0 1075.0 1133.0)
最後の行は、高度が10Kmから100Kmまでの見通し距離になります。これを見ると、上空100Kmから見渡せば、1133Km 先まで見えるって事ですね。(地球の球面を直線で近似してるから、誤差は大きいと思いますけど)
ふと、空から電波が降ってくるって事で、BS衛星の高度はどのぐらいか調べてみたら、赤道上空36000Kmに上がっている そうな。受信サービスエリアを日本に限定するなら、ずっと低い高度でも賄いきれそうだけど、何故に こんな高高度なん? 静止衛星にするためには、この高度が無いといかんから? 誰か詳しい人、教えてくださいな。