前回のつづき。csvファイルを市町村ごとにテキストファイルに分割し、緯度経度を分秒表記に直した。
・同じ市区町村の名前はテキストに出力しない。
・同じ緯度経度の行はテキストに出力しない。
これでかなり無駄データをはしょることができるはず。
ところが
A町1 38.90.12.3 137.23.45.6
A町2 38.12.34.5 137.21.09.8
A町2 38.90.12.3 137.23.45.6
A町3 38.12.34.5 137.21.09.8
みたいな、どう~も規則性があるエラーとおぼしきデータがあちらこちらにある。これはもう国交省がアホなのであきらめることにした。
これでひとつの市町村ファイルがほとんど1MB以下で、どんなへっぽこPDAでも閲覧→GPSに登録が可能になった。日本全体で約140MB、県レベルで10MB以下。これで通信手段がない旅行先でも電話帳かなにかで住所さえ分かればGPSに位置を表示できる。かなりの安心感だ。
しかしカシオペアA-51のstorage cardに日本全国140MBをぶち込むとActiveSyncが出来ないのだが、これは仕様だからあきらめる。(レジストリいじってリセットだけでCFを切り離す方法はある)
/*街区レベル位置参照情報ファイルが大きすぎるので分割する。*/ #include <stdio.h> #include <string.h>/*strtok()*/ #include <direct.h>/*_mkdir()*/ #include <math.h>/*atof(),floor()*/ void dolatlon( char *s, char *ret)/*緯度経度の小数点を分秒表記にする*/ { double d,di; char seisu[4];/*整数部*/ char fun[3];/*分*/ d = atof( s); di = floor( d);/*整数部分(床関数)*/ if( di > 360 || di < 0 ) return; sprintf( seisu, "%3d", (int)di);//整数部3桁なのは緯度経度共通。 d -= di; d *= 60.; if( d > 60 || d < 0 ) return; sprintf( fun, "%02d", (int)d); d -= floor( d); d *= 60.; if( d > 60 || d < 0 ) return; sprintf( ret, "%s.%s.%04.1f", seisu, fun, d); } void doline( char *s, char *data[]) { char delimiter[] = ",\""; char *token; int c = 0; token = strstr( s, ",\"\",");/*,"大字・町丁目",が,"",という場合がある*/ if( token != NULL ) *(token + 1) = ' ';/*空白を入れて,"",→, ",とする*/ token = strtok( s, delimiter);/*以下、普通に文字列分割*/ while( token != NULL ) { data[c] = token; token = strtok(NULL, delimiter); c++; } /* int i; for( i = 0; i < c; i++ ) { printf( "[%s]", data[i]); } printf( "\n");*/ } void dofile( FILE *fp) { char buf[256]; char fname[80]; FILE *out; char *data[99]; char kenmei[32]; char simei[32]; char bsimei[32]; char latlon[32]; char blatlon[32]; char bdata2[32]; char bdata3[32]; char lat[32]; char lon[32]; if( fgets( buf, 256, fp) == NULL ) return; /*1行目は読み捨て*/ fgets( buf, 256, fp);/*2行目を読む*/ doline( buf, data); strcpy( kenmei, data[0]);/*県名を記憶*/ if( _mkdir( kenmei) == -1 )/*県名でディレクトリを作成*/ { puts( "既に県名フォルダがあり。たぶん。"); return;/*終了*/ } strcpy( bsimei, data[1]);/*市名をバッファに記憶*/ sprintf( fname, "%s\\%s.txt", kenmei, bsimei); out = fopen( fname, "wt"); if( out == NULL ) return; else { strcpy( blatlon, "");//緯度経度前回文字列クリア。 strcpy( bdata2, "");//大字・町丁目前回文字列クリア。 strcpy( bdata3, "");//街区符号・地番前回文字列クリア。 while( fgets( buf, 256, fp) != NULL ) { doline( buf, data); strcpy( simei, data[1]);/*市名*/ if( strcmp( simei, bsimei) != 0 )/*市名が前回と違っているか*/ { fclose( out); sprintf( fname, "%s\\%s.txt", kenmei, simei); out = fopen( fname, "wt"); if( out == NULL ) return; strcpy( bsimei, simei); } dolatlon( data[7], lat); dolatlon( data[8], lon); sprintf( latlon, "%s %s", &lat[1], lon);/*緯度の整数部はどうせ2桁なので[1]から。*/ if( strcmp( blatlon, latlon) != 0 )/*前回と同じなら出力しない。*/ { if( strcmp( bdata2, data[2]) != 0 )/*大字・町丁目が前回と違う*/ { fprintf( out, "%s%s %s\n", data[2], data[3], latlon);/*→全部出力。*/ } else if( strcmp( bdata3, data[3]) != 0 )/*大字・町丁目が前回と同じで街区符号・地番が前回と違う。*/ { fprintf( out, "%s %s\n", data[3], latlon);/*→大字・町丁目をはしょって出力。*/ }/*大字・町丁目と街区符号・地番が同じなら出力しない。*/ sprintf( bdata2, data[2]);/*大字・町丁目を控えておく。*/ sprintf( bdata3, data[3]);/*街区符号・地番を控えておく。*/ sprintf( blatlon, latlon);/*緯度経度を控えておく。*/ } } fclose( out); } } int main( int ac, char *av[]) { FILE *fp; if( ac == 2 ) { printf( av[1]); fp = fopen( av[1], "rt"); if( fp == NULL ) { printf("ファイル名がヘンです"); /*終了*/ } else { dofile( fp); fclose( fp); } } else printf("うさげ:>jusho filename"); return 0; }
タグ変換元
実際に使うときはこんなバッチファイルを組む。
jusho 01_2005.csv
jusho 02_2005.csv
jusho 03_2005.csv
…
jusho 46_2005.csv
jusho 47_2005.csv
おまけ。地方フォルダ割り振りバッチファイル。
md 東北地方
move 青森県 東北地方
move 岩手県 東北地方
move 宮城県 東北地方
move 秋田県 東北地方
move 山形県 東北地方
move 福島県 東北地方
rem
md 関東地方
move 東京都 関東地方
move 神奈川県 関東地方
move 埼玉県 関東地方
move 千葉県 関東地方
move 茨城県 関東地方
move 栃木県 関東地方
move 群馬県 関東地方
move 山梨県 関東地方
rem
md 信越地方
move 新潟県 信越地方
move 長野県 信越地方
rem
md 北陸地方
move 富山県 北陸地方
move 石川県 北陸地方
move 福井県 北陸地方
rem
md 東海地方
move 愛知県 東海地方
move 岐阜県 東海地方
move 静岡県 東海地方
move 三重県 東海地方
rem
md 近畿地方
move 大阪府 近畿地方
move 兵庫県 近畿地方
move 京都府 近畿地方
move 滋賀県 近畿地方
move 奈良県 近畿地方
move 和歌山県 近畿地方
rem
md 中国地方
move 鳥取県 中国地方
move 島根県 中国地方
move 岡山県 中国地方
move 広島県 中国地方
move 山口県 中国地方
rem
md 四国地方
move 徳島県 四国地方
move 香川県 四国地方
move 愛媛県 四国地方
move 高知県 四国地方
rem
md 九州地方
move 福岡県 九州地方
move 佐賀県 九州地方
move 長崎県 九州地方
move 熊本県 九州地方
move 大分県 九州地方
move 宮崎県 九州地方
move 鹿児島県 九州地方