簡単にXMLにポリゴンを付け足す
JSGIの話です。昨日の続き(ではない)。
まず、スキーマを理解してないので、XMLサンプルを参考にポリゴンのXML文字列を作る関数を書く。多少面倒なので気合が必要だけど、DOMだけでやるよりは楽。読めるデータさえできればいい適当関数。(ちなみに下のやつはFeatureを継承しているけど、単にでっち上げたFeature#getXMLAttributeを使うためだけ)
function Polygon(data){ Feature.call(this, data); var s = [ "<Surface id=\"", data.id, "\">", "<GM_Surface id=\"", data.id, "\">", "<CRS uuidref=\"JGD2000/(L,B)\" />", "<proxy idref=\"", data.id, "\" />", "<proxy idref=\"_",data.id,"\">", "<GM_OrientableSurface id=\"_", data.id, "\">", "<proxy idref=\"", data.id, "\" />", "<proxy idref=\"_", data.id, "\" />", "<orientation>-</orientation>", "<primitive idref=\"", data.id, "\" />", "</GM_OrientableSurface>", "</proxy>", "<orientation>+</orientation>", "<primitive idref=\"", data.id, "\" />", "<patch>", "<GM_Polygon>", "<interpolation />", "<boundary>", "<exterior id=\"ring", data.id, "\">", "<proxy idref=\"ring", data.id, "\" />", "<proxy idref=\"_ring", data.id, "\">", "<GM_OrientableCurve id=\"_ring", data.id, "\">", "<proxy idref=\"ring", data.id, "\" />", "<proxy idref=\"_ring", data.id, "\" />", "<orientation>-</orientation>", "<primitive idref=\"ring", data.id, "\" />", "</GM_OrientableCurve>", "</proxy>", "<orientation>+</orientation>", "<primitive idref=\"ring", data.id, "\" />", "<generator idref=\"curve", data.id, "\">", "<GM_Curve id=\"curve", data.id, "\">", "<proxy idref=\"curve", data.id, "\" />", "<proxy idref=\"_curve", data.id, "\">", "<GM_OrientableCurve id=\"_curve", data.id, "\">", "<proxy idref=\"curve", data.id, "\" />", "<proxy idref=\"curve", data.id, "\" />", "<orientation>-</orientation>", "<primitive idref=\"curve", data.id, "\" />", "</GM_OrientableCurve>", "</proxy>", "<orientation>+</orientation>", "<primitive idref=\"curve", data.id, "\" />", "<segment>", "<GM_LineString>", "<interpolation>linear</interpolation>", "<controlPoint>" ]; for(var i = 0; i < data.coordinate.length; i++) s.push( "<column>", "<direct>", "<coordinate>", data.coordinate[i].join(" "), "</coordinate>", "</direct>", "</column>" ); s.push( "</controlPoint>", "</GM_LineString>", "</segment>", "</GM_Curve>", "</generator>", "</exterior>", "</boundary>", "</GM_Polygon>", "</patch>", "</GM_Surface>", this.getXMLAttribute(data.attributes), "</Surface>" ); return s.join(""); };
DOMのオブジェクトを二つ用意する。片方は実際に使うJSGIXML、もう片方はポリゴンのXMLを一時的に読ませるやつ。
var domDoc = new ActiveXObject("MSXML2.DOMDocument"); domDoc.load(xmlPath); var polyDom = new ActiveXObject("MSXML2.DOMDocument"); polyDom.loadXML(Polygon({ id : id, name : name, description: description, coordinate : coordinate, attributes : attributes }));
雛形にポリゴンのDOMツリーを付け加えて保存。
domDoc.getElementsByTagName("layer")[0].appendChild(polyDom.documentElement); domDoc.save(xmlPath);
XMLを一から書く場合は全部FileSystemObjectでファイルに書き出しても同じことだけど、あとから付け加える必要があったので、こういう方法でやってみたらちゃんとできた。FSOでもできるだろうけど、Polygon関数がどっちにも使えるし、こっちの方が楽な気がする。
でも、基本的にはFSO使ってる。