diff --git a/src/ol/format/gml2.js b/src/ol/format/gml2.js index 4c536301a4..56be48e6f2 100644 --- a/src/ol/format/gml2.js +++ b/src/ol/format/gml2.js @@ -2,8 +2,10 @@ goog.provide('ol.format.GML2'); goog.require('ol'); goog.require('ol.extent'); +goog.require('ol.format.Feature'); goog.require('ol.format.GMLBase'); goog.require('ol.format.XSD'); +goog.require('ol.obj'); goog.require('ol.proj'); goog.require('ol.xml'); @@ -204,3 +206,235 @@ ol.format.GML2.prototype.GEOMETRY_PARSERS_ = { 'Box': ol.xml.makeReplacer(ol.format.GML2.prototype.readBox_) } }; + + +/** + * @const + * @param {*} value Value. + * @param {Array.<*>} objectStack Object stack. + * @param {string=} opt_nodeName Node name. + * @return {Node|undefined} Node. + * @private + */ +ol.format.GML2.prototype.GEOMETRY_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) { + var context = objectStack[objectStack.length - 1]; + var multiSurface = context['multiSurface']; + var surface = context['surface']; + var curve = context['curve']; + var multiCurve = context['multiCurve']; + var nodeName; + if (!Array.isArray(value)) { + nodeName = /** @type {ol.geom.Geometry} */ (value).getType(); + if (nodeName === 'MultiPolygon' && multiSurface === true) { + nodeName = 'MultiSurface'; + } else if (nodeName === 'Polygon' && surface === true) { + nodeName = 'Surface'; + } else if (nodeName === 'LineString' && curve === true) { + nodeName = 'Curve'; + } else if (nodeName === 'MultiLineString' && multiCurve === true) { + nodeName = 'MultiCurve'; + } + } else { + nodeName = 'Envelope'; + } + return ol.xml.createElementNS('http://www.opengis.net/gml', + nodeName); +}; + + +/** + * @param {Node} node Node. + * @param {ol.Feature} feature Feature. + * @param {Array.<*>} objectStack Node stack. + */ +ol.format.GML2.prototype.writeFeatureElement = function(node, feature, objectStack) { + var fid = feature.getId(); + if (fid) { + node.setAttribute('fid', fid); + } + var context = /** @type {Object} */ (objectStack[objectStack.length - 1]); + var featureNS = context['featureNS']; + var geometryName = feature.getGeometryName(); + if (!context.serializers) { + context.serializers = {}; + context.serializers[featureNS] = {}; + } + var properties = feature.getProperties(); + var keys = [], values = []; + for (var key in properties) { + var value = properties[key]; + if (value !== null) { + keys.push(key); + values.push(value); + if (key == geometryName || value instanceof ol.geom.Geometry) { + if (!(key in context.serializers[featureNS])) { + context.serializers[featureNS][key] = ol.xml.makeChildAppender( + this.writeGeometryElement, this); + } + } else { + if (!(key in context.serializers[featureNS])) { + context.serializers[featureNS][key] = ol.xml.makeChildAppender( + ol.format.XSD.writeStringTextNode); + } + } + } + } + var item = ol.obj.assign({}, context); + item.node = node; + ol.xml.pushSerializeAndPop(/** @type {ol.XmlNodeStackItem} */ + (item), context.serializers, + ol.xml.makeSimpleNodeFactory(undefined, featureNS), + values, + objectStack, keys); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.Geometry|ol.Extent} geometry Geometry. + * @param {Array.<*>} objectStack Node stack. + */ +ol.format.GML2.prototype.writeGeometryElement = function(node, geometry, objectStack) { + var context = /** @type {olx.format.WriteOptions} */ (objectStack[objectStack.length - 1]); + var item = ol.obj.assign({}, context); + item.node = node; + var value; + if (Array.isArray(geometry)) { + if (context.dataProjection) { + value = ol.proj.transformExtent( + geometry, context.featureProjection, context.dataProjection); + } else { + value = geometry; + } + } else { + value = + ol.format.Feature.transformWithOptions(/** @type {ol.geom.Geometry} */ (geometry), true, context); + } + ol.xml.pushSerializeAndPop(/** @type {ol.XmlNodeStackItem} */ + (item), ol.format.GML2.GEOMETRY_SERIALIZERS_, + this.GEOMETRY_NODE_FACTORY_, [value], + objectStack, undefined, this); +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.LineString} geometry LineString geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML2.prototype.writeCurveOrLineString_ = function(node, geometry, objectStack) { +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.MultiLineString} geometry MultiLineString geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML2.prototype.writeMultiCurveOrLineString_ = function(node, geometry, objectStack) { +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.Point} geometry Point geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML2.prototype.writePoint_ = function(node, geometry, objectStack) { +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.MultiPoint} geometry MultiPoint geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML2.prototype.writeMultiPoint_ = function(node, geometry, objectStack) { +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.LineString} line LineString geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML2.prototype.writeLineStringOrCurveMember_ = function(node, line, objectStack) { +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.LinearRing} geometry LinearRing geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML2.prototype.writeLinearRing_ = function(node, geometry, objectStack) { +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.Polygon} geometry Polygon geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML2.prototype.writeSurfaceOrPolygon_ = function(node, geometry, objectStack) { +}; + + +/** + * @param {Node} node Node. + * @param {ol.geom.MultiPolygon} geometry MultiPolygon geometry. + * @param {Array.<*>} objectStack Node stack. + * @private + */ +ol.format.GML2.prototype.writeMultiSurfaceOrPolygon_ = function(node, geometry, objectStack) { +}; + + +/** + * @param {Node} node Node. + * @param {ol.Extent} extent Extent. + * @param {Array.<*>} objectStack Node stack. + */ +ol.format.GML2.prototype.writeEnvelope = function(node, extent, objectStack) { +}; + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GML2.GEOMETRY_SERIALIZERS_ = { + 'http://www.opengis.net/gml': { + 'Curve': ol.xml.makeChildAppender( + ol.format.GML2.prototype.writeCurveOrLineString_), + 'MultiCurve': ol.xml.makeChildAppender( + ol.format.GML2.prototype.writeMultiCurveOrLineString_), + 'Point': ol.xml.makeChildAppender(ol.format.GML2.prototype.writePoint_), + 'MultiPoint': ol.xml.makeChildAppender( + ol.format.GML2.prototype.writeMultiPoint_), + 'LineString': ol.xml.makeChildAppender( + ol.format.GML2.prototype.writeCurveOrLineString_), + 'MultiLineString': ol.xml.makeChildAppender( + ol.format.GML2.prototype.writeMultiCurveOrLineString_), + 'LinearRing': ol.xml.makeChildAppender( + ol.format.GML2.prototype.writeLinearRing_), + 'Polygon': ol.xml.makeChildAppender( + ol.format.GML2.prototype.writeSurfaceOrPolygon_), + 'MultiPolygon': ol.xml.makeChildAppender( + ol.format.GML2.prototype.writeMultiSurfaceOrPolygon_), + 'Surface': ol.xml.makeChildAppender( + ol.format.GML2.prototype.writeSurfaceOrPolygon_), + 'MultiSurface': ol.xml.makeChildAppender( + ol.format.GML2.prototype.writeMultiSurfaceOrPolygon_), + 'Envelope': ol.xml.makeChildAppender( + ol.format.GML2.prototype.writeEnvelope) + } +};