f8g

簡単に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使ってる。