12 June 2016

(Perl) Placemarkを列挙したKMLファイルの自動作成

スマートフォンにインストールされているOruxMapsで、目的地の自動ナビゲーションをするためのKMLファイルを作成する自動スクリプト

日本国内の場合は国土地理院の地図サイトで作成できるが、海外のものを作成するサイトは知らないためPerlスクリプトを作った。

目的地の座標(緯度、軽度)の取得方法

GoogleMapで目的地をクリック(①)すると、画面下に座標(緯度、軽度)が表示される。

20160612-googlemap-point.jpg

表示された座標をクリック(②)すると、検索ボックスに「テキストコピー出来る形で」座標が表示される。この座標を、次の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>