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に上がっている そうな。受信サービスエリアを日本に限定するなら、ずっと低い高度でも賄いきれそうだけど、何故に こんな高高度なん? 静止衛星にするためには、この高度が無いといかんから? 誰か詳しい人、教えてくださいな。