Photoshopで作成したパスをKMLに変換するツールの使い方

説明

Photoshopで地図をトレースし、作成されたパスをKMLに変換するスクリプトです。誤差などが発生するため、あまり高い精度にはなりませんが、用途によっては十分使い物になるでしょう(学習用で、おおよその場所を示す場合など)。
ここでは、変換ツール(スクリプト)の使い方について手順を追って説明します。

【1】まず、地図をトレースします。この時、パスポイントはクリックのみで作成してください。最終点は閉じなくても構いません。ベジエ曲線で描いてもパスポイントのみ変換されるため意味がありません。また、キャンバス(画像)の端を作成したパスの端にあわせます。つまり、余計な部分は削除してください。これは緯度、経度とキャンバスの幅を対応させるようになっているためです。
トレースが終了したら、変換したいパスがあるレイヤーをアクティブ(レイヤーパレットで選択)にします。




【2】ファイルメニューからスクリプト>参照...を選択します。




【3】変換ツール(スクリプトファイル)を選択します。




【4】上側の緯度を入力します。




【5】上側の緯度を入力します。




【6】左側の経度を入力します。




【7】左側の経度を入力します。




【8】しばらくすると変換が終了します。保存ダイアログが表示されるので名前を入力します。拡張子はkmlにします。




【9】終了したとのメッセージが表示され変換が終了します。




【10】変換されたKMLを確認します。テキストエディタで直接開いて編集することもできます。下図で赤線が引いてありますが、これは塗りつぶされた時の色と、塗りつぶすかどうかのフラグです。




【11】グーグルアースを入れてあれば、kmlファイルをダブルクリックするだけで確認することができます。




サンプルプログラム [ダウンロード/Download]

// デフォルトの色など
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("ファイルが作成できませんでした");
}
}
})();

[戻る]