ページ

2009年5月15日金曜日

DBFふぁいる

またまたはまってしまった
今回は,丸丸2日間も...
GISってやつは難しいのね〜

何につまずいたかというと,シェープファイルのdbfの取り扱いについてである。
こいつがなかなかくせ者で,いろんなところに落とし穴がある...
まあGIS初心者&なるべくフリーソフト(i.e. GRASS & QGIS)で解析しようとし
てるんだからしょうがないか...

まあぼちぼち勉強するとして,ここ2日間の記録を書いておこう。

やりたいことは国土数値情報の統一フォーマット(ふるいでーた)をシェープ
ファイルに変換すること!!

国土数値情報の統一フォーマットはただのテキストファイルだから,それを(ち
からわざで)加工すればシェープファイルに変換することができる。

ちなみにMANDARAを利用すると,いくつかのメッシュデータ(斜面方位・傾斜,
土地利用 etc.)については変換することができるらしい。それ以外には,MMTM.TVの2種類のコンバーターを利用すれば変
換できるらしい。ただしこちらは有償(各5,000円)! 評価版あり!

実際,ちからわざで変換してみた感想だけど,ちからわざではそれなりに時間が
かかるから,時間をとるかお金を取るかは難しいところ...

でもなるべくお金は使いたくないし!
まぁ数こなせば,少しは処理手順もこなれて早くなるでしょ


ということでここから実際の手順

まず,国土数値情報統一フォーマットのメッシュデータをダウンロード
今回の場合(土地分類メッシュ G05-54M-48-010.zip)解答すると,htmlファイ
ルが2つとデータファイル(txt)が出てくる。
データはすべてテキストファイルに入っているので,これを加工すればよい!

まずエディタでデータファイルのヘッダデータ(1行目)を削除して保存

次にデータファイルをエクセルで読み込むのだが,エクセル(2003以前)は最大
行数(約63000行)が決まっているので,行数が多いと全部読み込んでくれな
い。2007を使うともっと多くの行数を扱うことができる(たしか100万行ぐら
い)のだが,残念なことにdbf形式で保存することができない...

そこでデータファイルをエクセル2003に取り込むために,いくつかに分割する

コマンドラインから

split -l 50000 "データファイル名" #50000行づつに分割

分割されたファイルをエクセルで読みこむ。
データが1列に読み込まれるので,データの区切り位置(ウィザード)でコード
ごとに分割する
マニュアルによると土地分類メッシュは1行が31文字で記述されていて,

文字数 内容
1-3 レイヤーコード
4-5 メッシュの大きさ
6-9 1次メッシュコード
10-11 2次メッシュコード
12-13 3次メッシュコード
14-16 地形分類(主分類2桁+副分類1桁)
17-21 表層地質(岩石区分2桁+かたさ1桁+時代1桁+断層1桁)
22-24 土壌(土壌統計2桁+付加記号1桁)
25-27 図葉コード(都道府県コード2桁+年紀区分1桁) ※年紀区分は北海道の
み,その他はブランク
28-30 資料年紀
31 縮尺

となっている。

今回,メッシュコードを3次で区分するから,分割は3,2,8,2,1,2,
1,1,1,2,1,2,1,3,1桁になる。
ファイル名をdb.xlsとして保存!ちなみにデータシート名はdb,db(1)〜db(7)ま
での8枚!dbが南でdb(7)にかけて北の順で並ぶ!

そしたら次は,シェープファイルの素材となるファイルを入手する!
都道府県別の3次メッシュコードのシェープファイル素材は,地域地盤環境研究所 村上貴志氏のページで入手するこ
とができる。

適当なところに解答して,でてきたdbfファイルを加工する。

まずdbfファイルをエクセル2003などで開き,名前の定義を必要な範囲に変更す
る(詳しくはこちら)。

そしたらあとはエクセルのif & vlookup関数で,データベースからdbfファイル
にデータを書き込む。今回は,北海道以外の都道府県のdbfファイルにデータを
書き込むので,ついでにマクロも組んだ。

ちなみにif & vlookup関数は次のように書いた

=if($A2>65431720,vlookup($A2,'[db.xls]db
(7)'!$C$1:$O$50001,2,FALSE),if($A2>63396678,vlookup($A2,'[db.xls]db
(6)'!$C$1:$O$50001,2,FALSE),if($A2>57406784,vlookup($A2,'[db.xls]db
(5)'!$C$1:$O$50001,2,FALSE),if($A2>54403127,vlookup($A2,'[db.xls]db
(4)'!$C$1:$O$50001,2,FALSE),if($A2>53365634,vlookup($A2,'[db.xls]db
(3)'!$C$1:$O$50001,2,FALSE),if($A2>52330567,vlookup($A2,'[db.xls]db
(2)'!$C$1:$O$50001,2,FALSE),if($A2>50321146,vlookup($A2,'[db.xls]db
(1)'!$C$1:$O$50001,2,FALSE),vlookup($A2,'[db.xls]db'!$C$1:$O$50001,2,FALSE))))))))

ちなみにA2のセルにはdbf元ファイルの3次メッシュコードが入っている。
vlookupの参照桁数(?:2と書いてあるところ)は,データ要素が2〜9まであるの
で,順次ずらしていく。

参考までにマクロもここに置いておく。

あとはマクロを走らせればいい

振り返ってみると,メッシュデータは割と簡単だったかも!

次は流域のラインデータが待っているのでちょっと戦ってみよう

ここまでの手順は次のサイトを参考にしました。

0 件のコメント: