ページ

2009年5月19日火曜日

おーくがすごい

先週に引き続き今週も国土交通省の国土数値情報統一フォーマットと格闘する
先週は,エクセルやらなにやらを駆使して"ちからわざで"土地分類メッシュから
シェープファイルを作成した
まぁあれはあれでなかなかよい結果だったのだが,今回もその続きである。

今日やりたいことは,国土数値情報統一フォーマットのラインデータからシェー
プファイルを作成するといもの。
こちらは前回よりも少し楽だったような気がする(まだ終わってないけれど)

おおまかな手順はここから

まずいつものとおり国土数値情報の統一フォーマットから目的のデータ,今回は
流路データ(W15-52L-48-01.0a)をダウンロードする。
これを解凍すると,htmファイルが2つとテキストファイルが1つ出てくる。
使うのはもちろんこのテキストファイル。

このテキストファイルには,頭から"ヘッダデータ","ノードデータ(行のはじ
めがN)","リンクデータ(行のはじめがL)","ラインデータ(行のはじめが
S)","台帳データ(行のはじめがDS)"の順に各1行単位でデータが格納されて
いる。

ここから必要なデータをとってきて加工すればよいのだ。
今回の場合,流路の線を書くだけならリンクデータ(行のはじめがL)の部分だ
けでできる。
ほかのデータの場合には必要に応じて,ラインデータも加工する必要があるかも...

というわけで,エディタでこのテキストファイルからリンクデータのみを切り出
して保存する。
データは次のような形で格納されている。

******************************

L 362336000003362336000004000002 0 000030
4455281 876147 4455207 875966 4455236 875914 4455287 875883 4455426
875933
4455441 875920 4455374 875862 4455377 875841 4455528 875856 4455570
875813
(中略)
4456704 875335 4456802 875215 4456826 875177 4456899 875134 4456924
875084
L 362336000005362337000006000003 0 000045
4459446 874186 4459352 874280 4459217 874364 4459208 874398 4459133
874428
4459020 874393 4458889 874369 4458641 874366 4458602 874405 4458658
874464
(以下省略)

******************************

どこに何が書かれているかは,データの中のhtmファイルを確認してください。

あとは,これをGRASSの
ベクトル型データのスタンダードフォーマット
に変換すればよいだけ。

いつものように力業でやってもよいのだが,前からおーく(awk)に興味があっ
たので,今回はこれを勉強してみることに!

おーくの取り扱いについては,web上にいろいろと出ているので,ここでは割愛
するけど,かなりいろいろできそうな気がする。
参考になったのはこちらのサイト

とりあえず試行錯誤をしながらスクリプトを書いていくと,次のような内容で無
事に変換することができた。

以下おーくファイル(link_awk)の内容
{
if($0 ~ /L /)
{
printf(FS);
printf("%d",1);
printf(FS);
printf("%d\n",1);
printf($1);
printf(FS);
printf("%d",$4);
printf(FS);
printf("%d\n",1)
}
else
{
printf(FS);
printf("%4.8f",$1/10/60/60);
printf(FS);
printf("%4.8f\n",$2/10/60/60);
printf(FS);
printf("%4.8f",$3/10/60/60);
printf(FS);
printf("%4.8f\n",$4/10/60/60);
printf(FS);
printf("%4.8f",$5/10/60/60);
printf(FS);
printf("%4.8f\n",$6/10/60/60);
printf(FS);
printf("%4.8f",$7/10/60/60);
printf(FS);
printf("%4.8f\n",$8/10/60/60);
printf(FS);
printf("%4.8f",$9/10/60/60);
printf(FS);
printf("%4.8f\n",$10/10/60/60)
}
}

あとは次のコマンドを実行すればよい


awk -f link_awk link_all.txt | awk '!/0.00000000/' > result.txt

ちなみに"linl_awk"は上のスクリプトを書いたファイル,"link_all.txt"はデー
タファイルからリンクデータだけを切り出したファイル。
結果は"result.txt"ファイルに格納される。

実行した結果がこちら

*************************************

L 6 1
123.74916667 24.35216667
123.75330556 24.34763889
123.75830556 24.34677778
123.76108333 24.34375000
123.76058333 24.34113889
123.75816667 24.33741667
1 1
L 6 1
123.87350000 24.35269444
123.87419444 24.35313889
123.87577778 24.35419444
123.87600000 24.35475000
123.87730556 24.35597222
123.87891667 24.35680556
1 1

(以下省略)
*************************************

実際の処理は1分ぐらいでおわる!

おぉ〜感動!!

世の中には便利なものがいっぱいあるね〜

次はもっとややこしいことに挑戦しよう。

0 件のコメント: