#!/usr/bin/perl # # 国土交通省地図またはGoogle Mapsマイマップで作成したKMLファイルより # 地点座標(Placemarkの緯度・軽度)を抜き出すスクリプト use strict; use warnings; use XML::Simple; use Encode; use utf8; # 処理対象ファイルのユーザ入力と存在確認 print "kml placemark parseer\ninput KML filename ? : "; my $filename = ; chomp($filename); if ( !-f $filename ) { print "error: file $filename does not exist\.n"; exit; } print $filename . " exist.\n"; my $xs = new XML::Simple( NoSort => 1 ); my $myFile = $xs->XMLin($filename); # 国土地理院地図 KML { while ( my ( $key, $folder ) = each %{ $myFile->{Document}{Placemark} } ) { $key =~ s/[\r\n]//; # 改行を削除 my $coord = $folder->{Point}->{coordinates}; # Placemark以外の図形などのとき、その行の表示を省略する場合 次の行を有効化 if ( !$coord ) { next; } # Placemarkが未定義または空白のとき、画面出力エラーを回避するためダミー文字を設定 $coord = ( !$coord || $coord eq '' ) ? "undefined" : $coord; $coord =~ s/[\r\n ]+//g; # 改行と空白文字を削除 # 画面表示 print Encode::encode( 'utf-8', $key ) . "," . $coord . "\n"; } } # Google Maps KML (Folderタグでグループ分けされている場合) { while ( my ( $key0, $folder0 ) = each %{ $myFile->{Document}{Folder} } ) { $key0 =~ s/[\r\n]//; # 改行を削除 if ( ref $folder0 ne ref {} ) { # $folder0がハッシュのリファレンスでない場合は処理スキップ next; } while ( my ( $key1, $folder1 ) = each %{ $folder0->{Placemark} } ) { $key1 =~ s/[\r\n]//; # 改行を削除 my $coord = $folder1->{Point}->{coordinates}; # Placemark以外の図形などのとき、その行の表示を省略する場合 次の行を有効化 if ( !$coord ) { next; } # Placemarkが未定義または空白のとき、画面出力エラーを回避するためダミー文字を設定 $coord = $coord ? $coord : "undefined"; $coord =~ s/[\r\n ]+//g; # 改行と空白文字を削除 # 画面表示 print Encode::encode( 'utf-8', $key0 ) . "," . Encode::encode( 'utf-8', $key1 ) . "," . $coord . "\n"; } } } # Google Maps KML { while ( my ( $key, $folder ) = each %{ $myFile->{Document}{Folder}{Placemark} } ) { $key =~ s/[\r\n]//; # 改行を削除 my $coord = $folder->{Point}->{coordinates}; # Placemark以外の図形などのとき、その行の表示を省略する場合 次の行を有効化 if ( !$coord ) { next; } # Placemarkが未定義または空白のとき、画面出力エラーを回避するためダミー文字を設定 $coord = ( !$coord || $coord eq '' ) ? "undefined" : $coord; $coord =~ s/[\r\n ]+//g; # 改行と空白文字を削除 # 画面表示 print Encode::encode( 'utf-8', $key ) . "," . $coord . "\n"; } }