スマートフォンにインストールされている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>