スマートフォンにインストールされているOruxMapsで、目的地の自動ナビゲーションをするためのKMLファイルを作成する自動スクリプト
日本国内の場合は国土地理院の地図サイトで作成できるが、海外のものを作成するサイトは知らないためPerlスクリプトを作った。
目的地の座標(緯度、軽度)の取得方法
GoogleMapで目的地をクリック(①)すると、画面下に座標(緯度、軽度)が表示される。
表示された座標をクリック(②)すると、検索ボックスに「テキストコピー出来る形で」座標が表示される。この座標を、次のPerlスクリプトでの入力値にする。
KMLファイル自動作成Perlスクリプト
kml_placemark_make.plをダウンロードする
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
# IOの文字コードを規定
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
my $kml_filename = "";
my $flag_mode;
my $coord_lat_long;
my $placename;
print("KML Placemark 自動作成スクリプト\n");
print("出力ファイル名(日本語名称不可) [output.kml] : ");
$_ = <STDIN>;
chomp;
if(length($_) <= 0) {
$kml_filename = "output.kml";
}
else {
$kml_filename = $_;
}
open(FH_OUT, ">$kml_filename") or die("出力ファイルに書き込めません\n");
binmode(FH_OUT, ":utf8");
print(FH_OUT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" .
"<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n" .
"<Document>\n\n" .
"<Style id=\"Icon_Red\">\n" .
" <IconStyle>\n" .
" <Icon>\n" .
" <href>https://maps.google.com/mapfiles/kml/paddle/red-circle-lv.png</href>\n" .
" </Icon>\n" .
" <scale>1</scale>\n" .
" </IconStyle>\n" .
"</Style>\n" .
"<Style id=\"Icon_Green\">\n" .
" <IconStyle>\n" .
" <Icon>\n" .
" <href>https://maps.google.com/mapfiles/kml/paddle/grn-circle-lv.png</href>\n" .
" </Icon>\n" .
" <scale>1</scale>\n" .
" </IconStyle>\n" .
"</Style>\n" .
"<Style id=\"Icon_Blue\">\n" .
" <IconStyle>\n" .
" <Icon>\n" .
" <href>https://maps.google.com/mapfiles/kml/paddle/blu-circle-lv.png</href>\n" .
" </Icon>\n" .
" <scale>1</scale>\n" .
" </IconStyle>\n" .
"</Style>\n\n") or die("出力ファイルに書き込めません\n");
while(1) {
print("処理選択 r/b/g:地点追加(icon Red/Blue/Green), q:終了 (r/g/b/q) [r] : ");
$_ = <STDIN>;
chomp;
if(length($_)<=0 || lc($_) eq 'r'){ $flag_mode = 'r'; }
elsif(lc($_) eq 'g'){ $flag_mode = 'g'; }
elsif(lc($_) eq 'b'){ $flag_mode = 'b'; }
elsif(lc($_) eq 'q'){ $flag_mode = 'q'; }
else { next; }
print("flag = " . $flag_mode . "\n");
if($flag_mode eq 'q') {
print(FH_OUT "</Document>\n</kml>\n") or die("出力ファイルに書き込めません\n");
print("処理終了\n");
close(FH_OUT);
exit();
}
print("座標 北緯,東経 (例 : 35.5,135.2) : ");
$_ = <STDIN>;
chomp;
if(length($_) <= 0){ next; }
$coord_lat_long = $_;
my @coord = split(/,/, $coord_lat_long);
print("座標のラベル (例 : 中央駅) : ");
$_ = <STDIN>;
chomp;
if(length($_) <= 0){ next; }
$placename = $_;
print(FH_OUT "<Placemark>\n" .
" <name>". $placename . "</name>\n");
if($flag_mode eq 'r') { print(FH_OUT " <styleUrl>#Icon_Red</styleUrl>\n"); }
if($flag_mode eq 'g') { print(FH_OUT " <styleUrl>#Icon_Green</styleUrl>\n"); }
if($flag_mode eq 'b') { print(FH_OUT " <styleUrl>#Icon_Blue</styleUrl>\n"); }
print(FH_OUT " <Point>\n" .
" <coordinates>" . $coord[1] . "," . $coord[0] . "</coordinates>\n" .
" </Point>\n" .
"</Placemark>\n\n") or die("出力ファイルに書き込めません\n");
}
実行結果
次のように画面入力すると…
$ perl kml_placemark_make.pl KML Placemark 自動作成スクリプト 出力ファイル名(日本語名称不可) [output.kml] : 処理選択 r/b/g:地点追加(icon Red/Blue/Green), q:終了 (r/g/b/q) [r] : r flag = r 座標 北緯,東経 (例 : 35.5,135.2) : 39.360268, 22.306355 座標のラベル (例 : 中央駅) : ファルサロスの戦い 処理選択 r/b/g:地点追加(icon Red/Blue/Green), q:終了 (r/g/b/q) [r] : q flag = q 処理終了
このようなKMLファイルが出力される
output.kml
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <Style id="Icon_Red"> <IconStyle> <Icon> <href>https://maps.google.com/mapfiles/kml/paddle/red-circle-lv.png</href> </Icon> <scale>1</scale> </IconStyle> </Style> <Style id="Icon_Green"> <IconStyle> <Icon> <href>https://maps.google.com/mapfiles/kml/paddle/grn-circle-lv.png</href> </Icon> <scale>1</scale> </IconStyle> </Style> <Style id="Icon_Blue"> <IconStyle> <Icon> <href>https://maps.google.com/mapfiles/kml/paddle/blu-circle-lv.png</href> </Icon> <scale>1</scale> </IconStyle> </Style> <Placemark> <name>ファルサロスの戦い</name> <styleUrl>#Icon_Red</styleUrl> <Point> <coordinates> 22.306355,39.360268</coordinates> </Point> </Placemark> </Document> </kml>
