User:Mage Whopper/ISJ/isjp2osm-oaza.pl
Jump to navigation
Jump to search
国土数値情報のうち、大字・町丁目レベル位置参照情報から大字のみを抜き出して.osmに変換するスクリプト。動作にはperl 5.8.xが必要となります。
注意 : テスト公開中です。コンバート後のタグなどはまだ決定ではありませんので、アップロードする前にMLを確認してください。
2009年10月10日現在
必要な作業
- 数値情報(大字・町丁目レベル位置参照情報)をダウンロードする
- 下記スクリプトを適当なファイル名で保存する。(文字コード UTF-8 BOMなし、改行コードLF)
- 数値情報のcsvファイルとスクリプトを同じディレクトリにおく
- スクリプトのインポートするファイルを書き換えて保存する。
- スクリプトを実行する
- できたout.osmをJOSMで読み込む
- 必要なタグを追加する
- アップロード
その他追記随時受付中
タグ
変更受け付けます。07:48, 9 October 2009 (UTC)
項目 | 定義 | 記述例 | tag |
---|---|---|---|
都道府県コード | JIS都道府県コード | "13" | ISJ:prefecture_code |
都道府県名 | 当該範囲の都道府県名 | "東京都" | ISJ:prefecture_name |
市区町村コード | JIS市区町村コード | "13101" | ISJ:city_code |
市区町村名 | 当該範囲の市区町村名 (郡部は郡名,政令指定都市の区名も含む) |
"千代田区" | ISJ:city_name |
大字町丁目コード | 大字町丁目コード (JIS市区町村コード+独自7桁) |
"131010005002" | ISJ:code |
大字町丁目名 | 当該範囲の大字・町丁目名 (町丁目の数字は漢数字) |
"霞が関二丁目" | ISJ:name |
緯度 | 十進経緯度(単位:度、小数点以下第6位まで、半角) | "35.676155" | *lat |
経度 | 十進経緯度(単位:度、小数点以下第6位まで、半角) | "139.751075" | *lon |
原典資料 | 大字・町丁目位置参照情報作成における原典資料を表すコード 1:自治体資料、2:街区レベル位置参照情報、3:1/25000地形図、0:その他資料 |
"1" | ISJ:cite |
カテゴリ | 大字/字/丁目の区別を表すコード 1:大字、2:字、3:丁目、0:不明(通称) |
"3" | ISJ:category |
- lat とlonはnode固有情報なので変更できません。
name | 内容 |
---|---|
name | 名前 市区町村名からコピー 日本語文字列 (アルファベット表記) |
name:ja | 日本語名 市区町村名からコピー |
division_level:jp | カテゴリを文字列に変換 |
source | "ISJ" 固定 |
place | "village" 固定 |
note | "National-Land Numerical Information (place) 2008, MLIT Japan" 固定 |
note:ja | 国土数値情報(大字・町丁目レベル位置参照情報)2008年 国土交通省" 固定 |
source_ref | http://nlftp.mlit.go.jp/isj/" 固定 |
source:file | スクリプトが読み込んだcsvファイルの名前 |
年度については、設定で変更できるようにしてあります。2008年以外のファイルを読むには$source_yearを変更してください。
ソース
#!/usr/bin/perl
use strict;
use warnings ;
use Encode;
use utf8;
use encoding "utf8";
# use encoding "utf8", STDOUT => "shiftjis", STDERR => "shiftjis"; # for Windows
######################################
#
# ISJ 大字・町丁目レベル位置参照情報CSV->osm変換スクリプト
#
# 国土交通省国土計画局
# 国土数値情報 位置参照情報
# http://nlftp.mlit.go.jp/isj/
# の都道府県単位 のCSVファイルをosmデータに変換します。
#
# ダウンロードしたファイルと同じフォルダにスクリプトをおいて
# 適当に設定し、
# >perl isj2osm 変換するファイル名.csv
# と入力してください。しばらくすると指定したファイル名のosmファイルができます。
#
######################################
# 設定
#
##################
# 必ず変更するもの
##################
# source:fileタグ用のファイル
# '20_2008.csv' をダウンロードした数値情報のcsvファイルのものに変更してください。
our $source_file = "41_2008.csv";
#
# ソースの年度
our $source_year ="2008";
##################
#通常変更が必要ない設定
##################
# 空のname:ja_rmとname:enを埋め込むとき1
our $gNullNametagsOutput =0;
# 出力ファイル 'out.osm' をお好みの名前に変更してください。
open OUT, '>:encoding(utf8)','out.osm';
# 読み込むファイル (通常はこのままで)
open IN, '<:encoding(cp932)',$source_file;
# ログ (未使用)
our $log_file_name = "isj2osm";
######################################
sub main() {
# ヘッダ書き込み
print OUT create_osmheader();
# ノードの一時記憶
my $node;
#カウンタ定義
my $c=0;
#各行を処理
while (<IN> ) {
# カウント
$c++;
#最初の行をスキップ
if($c==1) {
next;
}
chomp; # 行末の改行削除
s/\"//g; # "削除
# ノード作成
$node =create_node ($c,$_);
if($node ne ""){
print OUT $node."\n";
}
# debug
# if($c>20){
# last;
#}
}
print OUT create_osmfooter();
close (OUT);
}
# xml/osmヘッダ作成
sub create_osmheader(){
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<osm version=\"0.6\" generator=\"OpenStreetMap server\">\n";
}
# osmフッタ作成
sub create_osmfooter(){
return "</osm>\n\n";
}
# node 一つ生成
# 都道府県コード,都道府県名,市区町村コード,市区町村名,大字町丁目コード,大字町丁目名,緯度,経度,原典資料,カテゴリ
sub create_node(){
my($id,$line)=@_;
my($p_code, $p_name, $c_code,$c_name,$o_code,$oname,$lat,$lon,$cite,$cat) = split(/,/,$line);
# ノード開始
my $s = start_node($id, $lat, $lon);
# 都道府県コード
$s.=&insert_tag("ISJ:prefecture_code",$p_code);
# 都道府県名
$s.=&insert_tag("ISJ:prefecture_name",$p_name);
# 市区町村コード
$s.=&insert_tag("ISJ:city_code",$c_code);
# 市区町村名
$s.=&insert_tag("ISJ:city_name",$c_name);
# 大字町丁目コード
$s.=&insert_tag("ISJ:code",$o_code);
# 大字町丁目名
$s.=&insert_tag("ISJ:name",$oname);
# 原典資料
$s.=&insert_tag("ISJ:cite",$cite);
# カテゴリ
$cat =~ s/\r//;
$cat =~ s/\n//;
$s.=&insert_tag("ISJ:category",$cat);
# name
$s.=&insert_tag("name",$oname);
# name:ja
$s.=&insert_tag("name:ja",$oname);
if($gNullNametagsOutput == 1){
# name:ja_rm
$s.=&insert_tag("name:ja_rm","");
# name:en
$s.=&insert_tag("name:en","");
}
# カテゴリ
if($cat eq "1"){
$s.=&insert_tag("division_level:jp","大字");
}elsif($cat eq "2"){
$s.=&insert_tag("division_level:jp","字");
}elsif($cat eq "3"){
$s.=&insert_tag("division_level:jp","丁目");
}elsif($cat eq "0"){
$s.=&insert_tag("division_level:jp","不明");
$s.=&insert_tag("division_level","unknown");
}
# source
$s.=&insert_tag("source","ISJ");
$s.=&insert_tag("place","village");
# sourcefile
$s.=&insert_tag("note","National-Land Numerical Information (place) ".$source_year.", MLIT Japan");
$s.=&insert_tag("note:ja","国土数値情報(大字・町丁目レベル位置参照情報)".$source_year."年 国土交通省");
$s.=&insert_tag("source_ref","http://nlftp.mlit.go.jp/isj/");
$s.=&insert_tag("source:file",$source_file);
# ノード終了
$s.=&end_node();
return $s;
}
# ノード開始:<node id="303153264" lat="48.1448919" lon="11.542937"/>
sub start_node{
my($id, $lat, $lon) = @_;
return ' '.'<node id="'.$id.'" lat="'.$lat.'" lon="'.$lon.'" version="1" changeset="" user="" >'."\n";
}
#ノード終了 </node>
sub end_node{
return " </node>\n";
}
#tag: <tag k="name" v="value"/>
sub insert_tag{
return " <tag k=\"".$_[0]."\" v=\"".$_[1]."\" />\n";
}
# run this script.
main();
# end of script