GPSの座標データを読み出し表示する (Illustrator CS2/CS3編)

今では携帯電話でもGPS機能が搭載され珍しい機能ではなくなりました。GPS = Global Positioning System、つまり地球上での位置を特定するためのものです。GPSを使えば地球上のどの地点なのかを手軽に調べることができます。
GPS機によっては計測したデータなどをXMLデータで出力できるものがあります。このXMLデータ内には位置座標などが入っています。今回は、このGPS機から出力されたXMLデータの座標値を読み出してIllustrator上のドキュメントに表示します。今回表示するのは36.222, 136.45676という数値になります。ドキュメント上には今回はプロットしません。
まず、今回使用したのはGarmin社製のGPSmap60CSxです。この機器からソフトを経由して出力したXMLデータを読み出して座標値を表示します。

http://www.garmin.com/garmin/cms/site/us

出力されるXMLデータは大きいため必要事項だけを抽出すると以下のようになります。


<wpt lat="36.1287498" lon="137.9705339">
<ele>705.7282715</ele>
<name>118</name>
<cmt>2007-12-31 1:37:21PM</cmt>
<desc>2007-12-31 1:37:21PM</desc>
<sym>Flag, Blue</sym>
<extensions>
<gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensions/v3/GpxExtensionsv3.xsd">
<gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode>
<gpxx:Address>
<gpxx:State> </gpxx:State>
</gpxx:Address>
</gpxx:WaypointExtension>
</extensions>
</wpt>

<wpt>タグで囲まれた範囲が登録地点の座標になります。緯度が<wpt>タグのlat (Latitude)、経度が<wpt>タグのlon (Longitude) 属性に入っています。
ここで、少し困ったことが発生します。というのもIllustrator CS2/CS3ではXMLデータ(テキスト)を読み込んで簡単に処理する機能が用意されていないということです。ブラウザであればDOM (Document Object Model : ドキュメントオブジェクトモデル) Scriptingで簡単にできることが、Illustratorではできません。CS3では実装されるかと思いましたが、全くXML関連処理は実装されませんでした。
仕方ないので1行ずつ読み込んで<wpt>タグかどうかを調べ、該当した場合のみ、さらに属性値を抽出するという面倒なことを行なっています。
説明は長いのですが、プログラムは割と短めです。以下のスクリプトを実行すると指定したXMLデータを読み込んで座標値だけを抽出しドキュメント上に配置してくれます。単なる座標値なのでコピーしてエクセルなどで利用することもできます。

if (documents.length < 1) // ドキュメントがなかった場合は新規に作成
{
documents.add(DocumentColorSpace.CMYK,595.2756,841.8898);
}
docObj = activeDocument;
result = "";
CR = String.fromCharCode(13);
filename = File.openDialog("GPSで出力したXMLファイルを指定してください");
fileObj = new File(filename);
flag = fileObj.open("r");
if (flag == true)
{
while(!fileObj.eof)
{
text = fileObj.readln();
if(text.indexOf("<wpt ") > -1) // XML Tag Search
{
xmlData = text.split(" "); // 空白で分割
lat = xmlData[3].substring(5,xmlData[3].length-1);
lon = xmlData[4].substring(5,xmlData[4].length-2);
result += lat+","+lon+CR;
}
}
textObj = docObj.textFrames.add();
textObj.contents = result;
fileObj.close();
}else{
alert("XMLファイルが開けませんでした");
}


[サンプルをダウンロード]