« 2007年9月 | トップページ | 2007年12月 »

国土数値情報(旧形式)→シェープファイル

以前、国土数値情報の、行政区域を、シェープファイル・PostGISデータにしました。 道路も表示したいと思ったのですが、 JPGIS準拠データには 道路が無いみたいで・・・旧フォーマット だと「道路(線)」があるけど、この シェープファイルへの変換ツールは使用できません。

よく参考にさせてもらうYaskeyさんのサイト国土数値情報のラインデータをShapefileに変換する方法 が説明されていたので、それに従ってやってみました。

必要なソフトは、 Shapefile C Librarygen2shpdbftools(txt2dbf,dbf2txt)。 Windowsへのインストールの仕方はYaskeyさんの テキストファイルをShapefileに変換する方法 に書かれています。簡単に言うと、Shaplib129_bin_win.zipとgen2shp-0.3.1.bin.msw.zipと dbftools-cygwin.zipを解凍して中身を同じフォルダ(C:¥Program Files¥gen2shp-0.3.1¥とか) に入れれて、あとMSVCRTD.DLLをC:¥WINDOWS¥system32に入れる。

道路(線)は都道府県別になっていて、山口県のファイルは N01-07L-35-01.0a.zip。 これを解凍すると、次のファイルができます。
N01-07L-2K-35.txt
N01_07L_台.txt
KS-META-N01-07L-35.html
N01-07L.html

genファイル

N01-07L-2K-35.txtの線分データの部分(左にL。下部2/3強) だけを抜き出してこれをgenファイルに整形します。

国土数値情報の線データのフォーマットは、 こちらに説明があります。 Lがあるのがリンクデータ(線分データ)の1行目で、 2行目以降に中間点(X座標 Y座標)が、1行に5点ずつはいります。 座標は、東経をX、北緯をYとして0.1秒単位で表しています。 例えば、X座標4712954というのは、東経130度54分55.4秒ということです。

genデータ(Arc/Info Generate files)のフォーマットは

番号
経度,緯度
経度,緯度
END
という感じ。データとファイルの最後にENDが入ります。経度緯度は度の十進数。 フォーマットについてよくわからなくても、Yaskeyさんのページをよくみて やれば大丈夫です。

attファイル

Yaskeyさんのページでは、genファイルに整形する方法は丁寧に説明してあるのですが、 attファイルの整形についてはあっさり書いてありますので、勝手に少し補足してみます。

・属性データを編集する
N01_07L_台.txtをExcelにインポートしたもので、後に必要となるのは、 路線コード、路線種別コード、路線名、線名、通称。 だから、1,2行目やA列・C列は不要です。削除してもよいけど、 残しておいても問題はないと思います。

・attファイルに属性をマッチングさせる
「整形したエクセルのattワークシート」とは、genファイルを整形した時に作っておいたatt というシート。1列目に路線コードがはいったものです。 これに、VLOOKUP関数で路線名、線名、通称、路線種別コードをつけてやります。 N01_07L_台.txtをインポートしたワークシートがsheet1、attワークシートがattで同じファイルに あるとして、attのB1はこんな感じ。(E列に路線名がある場合)
=IF(ISNA(VLOOKUP(A1,sheet1!A:G,5,FALSE)),"",
(VLOOKUP(A1,sheet1!A:G,5,FALSE)))
C1、D1にも同様に、線名・通称がはいるようにして、これらのセルを下までコピーします。 また、よくわからないのですが、2列目には何か一意のNo.が要るようなので、 AとBの間に列を挿入して連番をつけました。

あとの「genデータをShapefileへ変換する」や「txt2dbfを使用してattファイルをdbfファイルに投入する」 はわかりやすく書かれてあり、それにしたがってやれば大丈夫です。

| | コメント (0) | トラックバック (0)

PHP4→PHP5移行 fgetcsv、囲み文字が無い場合は

前回の話題の続きです。

fgetcsv($fp,1024)
は、デフォルトで区切り文字はカンマ、囲み文字がダブルクォーテーションになります。 php4では、囲み文字が無い場合でもこれで同じように読めていました。 php5では、要素の1文字目が半角英数だと囲みの有無に関係なく読めますが、 2バイト文字で始まっていると、"で囲まれていないと読めない。 囲み文字が無いなら無いではっきり指定してやる必要があるようです。 そこで、
fgetcsv($fp,1024,',','')
としてみたら、 enclosure must be a character というメッセージが出ました。
fgetcsv($fp,1024,',',' ')
としてやったらうまくいきました。空白じゃなく"無い"んだけどなー。 ちなみに、php4では''でも' 'でも動きます。良いんだか悪いんだか。

PHPマニュアルfgetcsv

追記 10/23
「うまくいきました」、と書きましたが、囲み文字が無いとやはり1文字目に 日本語文字が来る要素は読めていませんでした。最新のphp-5.2.4に してみても同様でした。fgetcsv使わない方向も考えておこうと思います。

| | コメント (2) | トラックバック (0)

PHP4→PHP5移行、 fgetcsv、日本語文字

先日も書いたとおり、 のろのろと、PHP4からPHP5への移行作業をしています。 ほとんどはそのまま動きそうなのですが、今のところ一つ 問題がみつかりました。fgetcsvです。

文字コードShift-JISのcsvファイルをfgetcsvで読み込んだ後、EUC-JPに変換していたのですが、 日本語のデータの読み込みがうまくいきませんでした。 csvファイルからfgetcsvで読み込んだ時点で、日本語の要素が1字目だけ文字化けするのです。 サーバーはEUC-JP、PHPの内部エンコーディングはEUC-JPなのですが、それでSJISを読み込む時 の不具合らしい。

対策として、まずEUCに変換しておいてからfgetcsvを使ってみたら一応うまくいきました。 他に、fgetsなどで読んでから配列にしたり、一時的にロケールを変更する手もあるようです。

参考にしたページ:
BLOG.PLASTIK.JP:PHP5のfgetcsv()で読み込み内容が腐る現象
yossy.blog:PHP5でfgetcsvが正常に動作しない

一応、というのは、またちょっと試していたら、囲み文字があるものは 日本語文字コードをシステムをあわせてやれば読めるのですが、囲み文字がない 日本語要素の読み込みがうまくできていなかった。詳しくは後日。

| | コメント (0) | トラックバック (0)

« 2007年9月 | トップページ | 2007年12月 »