User:Mage Whopper/ISJ/isjp2osm-oaza.pl

From OpenStreetMap Wiki
Jump to: navigation, search

国土数値情報のうち、大字・町丁目レベル位置参照情報から大字のみを抜き出して.osmに変換するスクリプト。動作にはperl 5.8.xが必要となります。

注意 : テスト公開中です。コンバート後のタグなどはまだ決定ではありませんので、アップロードする前にMLを確認してください。
2009年10月10日現在

必要な作業

  1. 数値情報(大字・町丁目レベル位置参照情報)をダウンロードする
  2. 下記スクリプトを適当なファイル名で保存する。(文字コード UTF-8 BOMなし、改行コードLF)
  3. 数値情報のcsvファイルとスクリプトを同じディレクトリにおく
  4. スクリプトのインポートするファイルを書き換えて保存する。
  5. スクリプトを実行する
  6. できたout.osmをJOSMで読み込む
  7. 必要なタグを追加する
  8. アップロード

その他追記随時受付中

タグ

変更受け付けます。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