Add write support for gml:Point
This commit is contained in:
@@ -308,6 +308,7 @@
|
|||||||
* @typedef {Object} olx.format.GMLOptions
|
* @typedef {Object} olx.format.GMLOptions
|
||||||
* @property {string} featureNS Feature namespace.
|
* @property {string} featureNS Feature namespace.
|
||||||
* @property {string} featureType Feature type to parse.
|
* @property {string} featureType Feature type to parse.
|
||||||
|
* @property {string} srsName srsName to use when writing geometries.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ goog.require('goog.string');
|
|||||||
goog.require('ol.Feature');
|
goog.require('ol.Feature');
|
||||||
goog.require('ol.extent');
|
goog.require('ol.extent');
|
||||||
goog.require('ol.format.XMLFeature');
|
goog.require('ol.format.XMLFeature');
|
||||||
|
goog.require('ol.format.XSD');
|
||||||
|
goog.require('ol.geom.Geometry');
|
||||||
goog.require('ol.geom.LineString');
|
goog.require('ol.geom.LineString');
|
||||||
goog.require('ol.geom.MultiLineString');
|
goog.require('ol.geom.MultiLineString');
|
||||||
goog.require('ol.geom.MultiPoint');
|
goog.require('ol.geom.MultiPoint');
|
||||||
@@ -43,6 +45,12 @@ ol.format.GML = function(opt_options) {
|
|||||||
*/
|
*/
|
||||||
this.featureNS_ = options.featureNS;
|
this.featureNS_ = options.featureNS;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {string}
|
||||||
|
*/
|
||||||
|
this.srsName_ = options.srsName;
|
||||||
|
|
||||||
goog.base(this);
|
goog.base(this);
|
||||||
};
|
};
|
||||||
goog.inherits(ol.format.GML, ol.format.XMLFeature);
|
goog.inherits(ol.format.GML, ol.format.XMLFeature);
|
||||||
@@ -973,3 +981,100 @@ ol.format.GML.prototype.readFeaturesFromNode = function(node) {
|
|||||||
}];
|
}];
|
||||||
return ol.format.GML.readFeatures_(node, objectStack);
|
return ol.format.GML.readFeatures_(node, objectStack);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Node} node Node.
|
||||||
|
* @param {ol.geom.Point} value Point geometry.
|
||||||
|
* @param {Array.<*>} objectStack Node stack.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
ol.format.GML.writePos_ = function(node, value, objectStack) {
|
||||||
|
var layout = value.getLayout();
|
||||||
|
node.setAttribute('srsDimension',
|
||||||
|
(layout == ol.geom.GeometryLayout.XYZ) ? '3' : '2');
|
||||||
|
ol.format.XSD.writeStringTextNode(node, value.getCoordinates().join(' '));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @const
|
||||||
|
* @param {*} value Value.
|
||||||
|
* @param {Array.<*>} objectStack Object stack.
|
||||||
|
* @param {string=} opt_nodeName Node name.
|
||||||
|
* @return {Node|undefined} Node.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
ol.format.GML.POS_NODE_FACTORY_ = ol.xml.makeSimpleNodeFactory('pos');
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Object.<string, Object.<string, ol.xml.Serializer>>}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
ol.format.GML.POS_SERIALIZERS_ = {
|
||||||
|
'http://www.opengis.net/gml': {
|
||||||
|
'pos': ol.xml.makeChildAppender(ol.format.GML.writePos_),
|
||||||
|
'pos_': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Node} node Node.
|
||||||
|
* @param {ol.geom.Point} geometry Point geometry.
|
||||||
|
* @param {Array.<*>} objectStack Node stack.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
ol.format.GML.writePoint_ = function(node, geometry, objectStack) {
|
||||||
|
var context = objectStack[objectStack.length - 1];
|
||||||
|
goog.asserts.assert(goog.isObject(context));
|
||||||
|
var srsName = goog.object.get(context, 'srsName');
|
||||||
|
if (goog.isDefAndNotNull(srsName)) {
|
||||||
|
node.setAttribute('srsName', srsName);
|
||||||
|
}
|
||||||
|
ol.xml.pushSerializeAndPop({node: node}, ol.format.GML.POS_SERIALIZERS_,
|
||||||
|
ol.format.GML.POS_NODE_FACTORY_, [geometry], []);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Object.<string, Object.<string, ol.xml.Serializer>>}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
ol.format.GML.GEOMETRY_SERIALIZERS_ = {
|
||||||
|
'http://www.opengis.net/gml': {
|
||||||
|
'Point': ol.xml.makeChildAppender(ol.format.GML.writePoint_)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @const
|
||||||
|
* @param {*} value Value.
|
||||||
|
* @param {Array.<*>} objectStack Object stack.
|
||||||
|
* @param {string=} opt_nodeName Node name.
|
||||||
|
* @return {Node|undefined} Node.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
ol.format.GML.GEOMETRY_NODE_FACTORY_ = function(value, objectStack,
|
||||||
|
opt_nodeName) {
|
||||||
|
goog.asserts.assertInstanceof(value, ol.geom.Geometry);
|
||||||
|
var parentNode = objectStack[objectStack.length - 1].node;
|
||||||
|
goog.asserts.assert(ol.xml.isNode(parentNode));
|
||||||
|
return ol.xml.createElementNS(parentNode.namespaceURI,
|
||||||
|
value.getType());
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
ol.format.GML.prototype.writeGeometryNode = function(geometry) {
|
||||||
|
var geom = ol.xml.createElementNS('http://www.opengis.net/gml', 'geom');
|
||||||
|
var context = {node: geom, srsName: this.srsName_};
|
||||||
|
ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */
|
||||||
|
(context), ol.format.GML.GEOMETRY_SERIALIZERS_,
|
||||||
|
ol.format.GML.GEOMETRY_NODE_FACTORY_, [geometry], []);
|
||||||
|
return geom;
|
||||||
|
};
|
||||||
|
|||||||
@@ -12,22 +12,24 @@ describe('ol.format.GML', function() {
|
|||||||
|
|
||||||
var format;
|
var format;
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
format = new ol.format.GML();
|
format = new ol.format.GML({srsName: 'CRS:84'});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#readGeometry', function() {
|
describe('#readGeometry', function() {
|
||||||
|
|
||||||
describe('point', function() {
|
describe('point', function() {
|
||||||
|
|
||||||
it('can read a point geometry', function() {
|
it('can read and write a point geometry', function() {
|
||||||
var text =
|
var text =
|
||||||
'<gml:Point xmlns:gml="http://www.opengis.net/gml" ' +
|
'<gml:Point xmlns:gml="http://www.opengis.net/gml" ' +
|
||||||
' srsName="CRS:84">' +
|
' srsName="CRS:84">' +
|
||||||
' <gml:pos>1 2</gml:pos>' +
|
' <gml:pos srsDimension="3">1 2 0</gml:pos>' +
|
||||||
'</gml:Point>';
|
'</gml:Point>';
|
||||||
var g = readGeometry(format, text);
|
var g = readGeometry(format, text);
|
||||||
expect(g).to.be.an(ol.geom.Point);
|
expect(g).to.be.an(ol.geom.Point);
|
||||||
expect(g.getCoordinates()).to.eql([1, 2, 0]);
|
expect(g.getCoordinates()).to.eql([1, 2, 0]);
|
||||||
|
var serialized = format.writeGeometry(g);
|
||||||
|
expect(serialized.firstElementChild).to.xmleql(ol.xml.load(text));
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user