オンライン地球儀と言えばグーグルアースが有名です。そのグーグルアースで地球儀上にビルなどの建物の表示や特定の地点や地域の情報を示す場合に使われているのがKMLというXML形式のデータです。
今回は、Photoshopで作成したパスを、このKMLに変換するためのスクリプトです。これは日本の県や市町村など地域の形状をグーグルマップ上に重ねたい(表示したい)ために作成したスクリプトです。
基本的に地図をPhotoshopでトレースしてやるだけです。ただし、パスはベジエ曲線などはサポートしていません。このため、トレースする地図上でポチポチとクリックしてパスポイントを打っていくだけの作業を行うことになります。
あとは、パスポイントから外側の領域(余計な部分)がないようにドキュメントサイズを調整します(パス全体を囲む最小限のドキュメントサイズにしてください)。これは座標変換にドキュメントのサイズを基準にしているためです。次にトレースした地図の最小と最大の緯度経度を調べておきます。
これで、準備が完了しました。あとは以下おスクリプトを実行すればPhotoshopのパスがKMLに変換されます。できあがったKMLファイルはグーグルアースでもグーグルマップでも使うことができます。ただ、そんなに精度は期待しないでください。
// デフォルトの色など
opac = "7f"; // 不透明度
red = "ff"; // 赤色
green = "00"; // 緑色
blue = "7f"; // 青色
defColor = opac+blue+green+red;
lineWidth = 1; // 線の太さ
fillFlag = 1; // 塗りつぶす時は1、そうでないときは0
LF = String.fromCharCode(10);
kmlHeader = '<?xml version="1.0" encoding="UTF-8"?>';
kmlHeader += '<kml xmlns="http://earth.google.com/kml/2.2">';
kmlHeader += '<Document><Style id="style1"><PolyStyle><color>';
kmlHeader += defColor+'</color><fill>'+fillFlag+'</fill>';
kmlHeader += '<LineStyle><width>'+lineWidth+'</width></LineStyle>';
kmlHeader += '</PolyStyle></Style>';
kmlHeader += '<Placemark>';
kmlHeader += '<name> </name><styleUrl>#style1</styleUrl>';
kmlHeader += '<Polygon>';
kmlHeader += '<extrude>1</extrude>';
kmlHeader += '<altitudeMode>relativeToGround</altitudeMode>';
kmlHeader += '<outerBoundaryIs>';
kmlHeader += '<LinearRing>';
kmlHeader += '<coordinates>';
kmlHeader += LF;
kmlFooter = '</coordinates></LinearRing></outerBoundaryIs>';
kmlFooter += '</Polygon></Placemark></Document></kml>';
docW = activeDocument.width.value;
docH = activeDocument.height.value;
function mapPath(){
var layObj = activeDocument.activeLayer;
if(layObj.kind != LayerKind.SOLIDFILL){
alert("パスで塗りつぶされたレイヤーを選択してから実行してください");
return;
}
var pObj = activeDocument.pathItems[0];
var result = "";
var pp = pObj.subPathItems[0].pathPoints;
for(var i=0; i<pp.length; i++){
var x = pp[i].anchor[0];
var y = pp[i].anchor[1];
x = gLeft + (x / docW) * gDX;
y = gTop - (y / docH) * gDY;
result += x+","+y+",4000" + LF;
}
return result;
}
(function(){
gTop = prompt("上側の緯度を入れて下さい",0);
if (!gTop) return;
gBottom = prompt("下側の緯度を入れて下さい",0);
if (!gBottom) return;
gLeft = prompt("左側の経度を入れて下さい",0);
if (!gLeft) return;
gRight = prompt("右側の経度を入れて下さい",0);
if (!gRight) return;
gTop = parseFloat(gTop);
gBottom= parseFloat(gBottom);
gLeft= parseFloat(gLeft);
gRight= parseFloat(gRight);
gDX = gRight-gLeft;
gDY = gTop-gBottom;
var text = mapPath();
var fileObj = File.saveDialog("保存ファイル名を入れて下さい");
if (fileObj){
var flag = fileObj.open("w");
if (flag == true){
fileObj.write(kmlHeader);
fileObj.write(text);
fileObj.write(kmlFooter);
fileObj.close();
alert("変換が終了しデータを保存しました");
}else{
alert("ファイルが作成できませんでした");
}
}
})();