Photoshopで地図をトレースし、作成されたパスをKMLに変換するスクリプトです。誤差などが発生するため、あまり高い精度にはなりませんが、用途によっては十分使い物になるでしょう(学習用で、おおよその場所を示す場合など)。
ここでは、変換ツール(スクリプト)の使い方について手順を追って説明します。
【1】まず、地図をトレースします。この時、パスポイントはクリックのみで作成してください。最終点は閉じなくても構いません。ベジエ曲線で描いてもパスポイントのみ変換されるため意味がありません。また、キャンバス(画像)の端を作成したパスの端にあわせます。つまり、余計な部分は削除してください。これは緯度、経度とキャンバスの幅を対応させるようになっているためです。
トレースが終了したら、変換したいパスがあるレイヤーをアクティブ(レイヤーパレットで選択)にします。
// デフォルトの色など
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("ファイルが作成できませんでした");
}
}
})();