Add write support for gml:MultiCurve
This commit is contained in:
@@ -315,6 +315,12 @@
|
|||||||
* @property {boolean|undefined} curve Write gml:Curve instead of
|
* @property {boolean|undefined} curve Write gml:Curve instead of
|
||||||
* gml:LineString elements. This also affects the elements in multi-part
|
* gml:LineString elements. This also affects the elements in multi-part
|
||||||
* geometries. Default is `false´.
|
* geometries. Default is `false´.
|
||||||
|
* @property {boolean|undefined} multiCurve Write gml:MultiCurve instead of
|
||||||
|
* gml:MultiLineString. Since the latter is deprecated in GML 3, the
|
||||||
|
* default is `true´.
|
||||||
|
* @property {boolean|undefined} multiSurface Write gml:multiSurface instead
|
||||||
|
* of gml:MultiPolygon. Since the latter is deprecated in GML 3, the
|
||||||
|
* default is `true´.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+55
-11
@@ -66,6 +66,20 @@ ol.format.GML = function(opt_options) {
|
|||||||
this.curve_ = goog.isDef(options.curve) ?
|
this.curve_ = goog.isDef(options.curve) ?
|
||||||
options.curve : false;
|
options.curve : false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {boolean}
|
||||||
|
*/
|
||||||
|
this.multiCurve_ = goog.isDef(options.multiCurve) ?
|
||||||
|
options.multiCurve : true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {boolean}
|
||||||
|
*/
|
||||||
|
this.multiSurface_ = goog.isDef(options.multiSurface) ?
|
||||||
|
options.multiSurface : true;
|
||||||
|
|
||||||
goog.base(this);
|
goog.base(this);
|
||||||
};
|
};
|
||||||
goog.inherits(ol.format.GML, ol.format.XMLFeature);
|
goog.inherits(ol.format.GML, ol.format.XMLFeature);
|
||||||
@@ -1310,13 +1324,36 @@ ol.format.GML.writeMultiLineString_ = function(node, geometry,
|
|||||||
var lines = geometry.getLineStrings();
|
var lines = geometry.getLineStrings();
|
||||||
for (var i = 0, ii = lines.length; i < ii; ++i) {
|
for (var i = 0, ii = lines.length; i < ii; ++i) {
|
||||||
ol.xml.pushSerializeAndPop({node: node, srsName: srsName},
|
ol.xml.pushSerializeAndPop({node: node, srsName: srsName},
|
||||||
ol.format.GML.LINESTRINGMEMBER_SERIALIZERS_,
|
ol.format.GML.LINESTRINGORCURVEMEMBER_SERIALIZERS_,
|
||||||
ol.xml.makeSimpleNodeFactory('lineStringMember'), [lines[i]],
|
ol.xml.makeSimpleNodeFactory('lineStringMember'), [lines[i]],
|
||||||
objectStack);
|
objectStack);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Node} node Node.
|
||||||
|
* @param {ol.geom.MultiLineString} geometry MultiLineString geometry.
|
||||||
|
* @param {Array.<*>} objectStack Node stack.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
ol.format.GML.writeMultiCurve_ = 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);
|
||||||
|
}
|
||||||
|
var lines = geometry.getLineStrings();
|
||||||
|
for (var i = 0, ii = lines.length; i < ii; ++i) {
|
||||||
|
ol.xml.pushSerializeAndPop({node: node, srsName: srsName},
|
||||||
|
ol.format.GML.LINESTRINGORCURVEMEMBER_SERIALIZERS_,
|
||||||
|
ol.xml.makeSimpleNodeFactory('curveMember'), [lines[i]],
|
||||||
|
objectStack);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Node} node Node.
|
* @param {Node} node Node.
|
||||||
* @param {ol.geom.LinearRing} ring LinearRing geometry.
|
* @param {ol.geom.LinearRing} ring LinearRing geometry.
|
||||||
@@ -1376,7 +1413,8 @@ ol.format.GML.writePointMember_ = function(node, point, objectStack) {
|
|||||||
* @param {Array.<*>} objectStack Node stack.
|
* @param {Array.<*>} objectStack Node stack.
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
ol.format.GML.writeLineStringMember_ = function(node, line, objectStack) {
|
ol.format.GML.writeLineStringOrCurveMember_ = function(node, line,
|
||||||
|
objectStack) {
|
||||||
var context = objectStack[objectStack.length - 1];
|
var context = objectStack[objectStack.length - 1];
|
||||||
goog.asserts.assert(goog.isObject(context));
|
goog.asserts.assert(goog.isObject(context));
|
||||||
var srsName = goog.object.get(context, 'srsName');
|
var srsName = goog.object.get(context, 'srsName');
|
||||||
@@ -1427,7 +1465,7 @@ ol.format.GML.writeCurveSegments_ = function(node, line, objectStack) {
|
|||||||
*/
|
*/
|
||||||
ol.format.GML.SURFACEORPOLYGONMEMBER_SERIALIZERS_ = {
|
ol.format.GML.SURFACEORPOLYGONMEMBER_SERIALIZERS_ = {
|
||||||
'http://www.opengis.net/gml': {
|
'http://www.opengis.net/gml': {
|
||||||
'SURFACEORsurfaceMember': ol.xml.makeChildAppender(
|
'surfaceMember': ol.xml.makeChildAppender(
|
||||||
ol.format.GML.writeSurfaceOrPolygonMember_),
|
ol.format.GML.writeSurfaceOrPolygonMember_),
|
||||||
'polygonMember': ol.xml.makeChildAppender(
|
'polygonMember': ol.xml.makeChildAppender(
|
||||||
ol.format.GML.writeSurfaceOrPolygonMember_)
|
ol.format.GML.writeSurfaceOrPolygonMember_)
|
||||||
@@ -1450,10 +1488,12 @@ ol.format.GML.POINTMEMBER_SERIALIZERS_ = {
|
|||||||
* @type {Object.<string, Object.<string, ol.xml.Serializer>>}
|
* @type {Object.<string, Object.<string, ol.xml.Serializer>>}
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
ol.format.GML.LINESTRINGMEMBER_SERIALIZERS_ = {
|
ol.format.GML.LINESTRINGORCURVEMEMBER_SERIALIZERS_ = {
|
||||||
'http://www.opengis.net/gml': {
|
'http://www.opengis.net/gml': {
|
||||||
'lineStringMember': ol.xml.makeChildAppender(
|
'lineStringMember': ol.xml.makeChildAppender(
|
||||||
ol.format.GML.writeLineStringMember_)
|
ol.format.GML.writeLineStringOrCurveMember_),
|
||||||
|
'curveMember': ol.xml.makeChildAppender(
|
||||||
|
ol.format.GML.writeLineStringOrCurveMember_)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1522,6 +1562,7 @@ ol.format.GML.CURVE_SERIALIZERS_ = {
|
|||||||
ol.format.GML.GEOMETRY_SERIALIZERS_ = {
|
ol.format.GML.GEOMETRY_SERIALIZERS_ = {
|
||||||
'http://www.opengis.net/gml': {
|
'http://www.opengis.net/gml': {
|
||||||
'Curve': ol.xml.makeChildAppender(ol.format.GML.writeCurve_),
|
'Curve': ol.xml.makeChildAppender(ol.format.GML.writeCurve_),
|
||||||
|
'MultiCurve': ol.xml.makeChildAppender(ol.format.GML.writeMultiCurve_),
|
||||||
'Point': ol.xml.makeChildAppender(ol.format.GML.writePoint_),
|
'Point': ol.xml.makeChildAppender(ol.format.GML.writePoint_),
|
||||||
'MultiPoint': ol.xml.makeChildAppender(ol.format.GML.writeMultiPoint_),
|
'MultiPoint': ol.xml.makeChildAppender(ol.format.GML.writeMultiPoint_),
|
||||||
'LineString': ol.xml.makeChildAppender(ol.format.GML.writeLineString_),
|
'LineString': ol.xml.makeChildAppender(ol.format.GML.writeLineString_),
|
||||||
@@ -1548,20 +1589,22 @@ ol.format.GML.GEOMETRY_NODE_FACTORY_ = function(value, objectStack,
|
|||||||
opt_nodeName) {
|
opt_nodeName) {
|
||||||
var context = objectStack[objectStack.length - 1];
|
var context = objectStack[objectStack.length - 1];
|
||||||
goog.asserts.assert(goog.isObject(context));
|
goog.asserts.assert(goog.isObject(context));
|
||||||
|
var multiSurface = goog.object.get(context, 'multiSurface');
|
||||||
var surface = goog.object.get(context, 'surface');
|
var surface = goog.object.get(context, 'surface');
|
||||||
var curve = goog.object.get(context, 'curve');
|
var curve = goog.object.get(context, 'curve');
|
||||||
|
var multiCurve = goog.object.get(context, 'multiCurve');
|
||||||
goog.asserts.assertInstanceof(value, ol.geom.Geometry);
|
goog.asserts.assertInstanceof(value, ol.geom.Geometry);
|
||||||
var parentNode = objectStack[objectStack.length - 1].node;
|
var parentNode = objectStack[objectStack.length - 1].node;
|
||||||
goog.asserts.assert(ol.xml.isNode(parentNode));
|
goog.asserts.assert(ol.xml.isNode(parentNode));
|
||||||
var nodeName = value.getType();
|
var nodeName = value.getType();
|
||||||
if (nodeName === 'MultiPolygon' && surface === true) {
|
if (nodeName === 'MultiPolygon' && multiSurface === true) {
|
||||||
nodeName = 'MultiSurface';
|
nodeName = 'MultiSurface';
|
||||||
}
|
} else if (nodeName === 'Polygon' && surface === true) {
|
||||||
if (nodeName === 'Polygon' && surface === true) {
|
|
||||||
nodeName = 'Surface';
|
nodeName = 'Surface';
|
||||||
}
|
} else if (nodeName === 'LineString' && curve === true) {
|
||||||
if (nodeName === 'LineString' && curve === true) {
|
|
||||||
nodeName = 'Curve';
|
nodeName = 'Curve';
|
||||||
|
} else if (nodeName === 'MultiLineString' && multiCurve === true) {
|
||||||
|
nodeName = 'MultiCurve';
|
||||||
}
|
}
|
||||||
return ol.xml.createElementNS(parentNode.namespaceURI,
|
return ol.xml.createElementNS(parentNode.namespaceURI,
|
||||||
nodeName);
|
nodeName);
|
||||||
@@ -1574,7 +1617,8 @@ ol.format.GML.GEOMETRY_NODE_FACTORY_ = function(value, objectStack,
|
|||||||
ol.format.GML.prototype.writeGeometryNode = function(geometry) {
|
ol.format.GML.prototype.writeGeometryNode = function(geometry) {
|
||||||
var geom = ol.xml.createElementNS('http://www.opengis.net/gml', 'geom');
|
var geom = ol.xml.createElementNS('http://www.opengis.net/gml', 'geom');
|
||||||
var context = {node: geom, srsName: this.srsName_,
|
var context = {node: geom, srsName: this.srsName_,
|
||||||
curve: this.curve_, surface: this.surface_};
|
curve: this.curve_, surface: this.surface_,
|
||||||
|
multiSurface: this.multiSurface_, multiCurve: this.multiCurve_};
|
||||||
ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */
|
ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */
|
||||||
(context), ol.format.GML.GEOMETRY_SERIALIZERS_,
|
(context), ol.format.GML.GEOMETRY_SERIALIZERS_,
|
||||||
ol.format.GML.GEOMETRY_NODE_FACTORY_, [geometry], []);
|
ol.format.GML.GEOMETRY_NODE_FACTORY_, [geometry], []);
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ describe('ol.format.GML', function() {
|
|||||||
expect(serialized.firstElementChild).to.xmleql(ol.xml.load(text));
|
expect(serialized.firstElementChild).to.xmleql(ol.xml.load(text));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('can read a surface geometry with right axis order',
|
it('can read and write a surface geometry with right axis order',
|
||||||
function() {
|
function() {
|
||||||
var text =
|
var text =
|
||||||
'<gml:MultiSurface xmlns:gml="http://www.opengis.net/gml" ' +
|
'<gml:MultiSurface xmlns:gml="http://www.opengis.net/gml" ' +
|
||||||
@@ -105,6 +105,10 @@ describe('ol.format.GML', function() {
|
|||||||
var g = readGeometry(format, text);
|
var g = readGeometry(format, text);
|
||||||
expect(g.getCoordinates()[0][0][0][0]).to.equal(-77.0081);
|
expect(g.getCoordinates()[0][0][0][0]).to.equal(-77.0081);
|
||||||
expect(g.getCoordinates()[0][0][0][1]).to.equal(38.9661);
|
expect(g.getCoordinates()[0][0][0][1]).to.equal(38.9661);
|
||||||
|
format = new ol.format.GML({srsName: 'urn:x-ogc:def:crs:EPSG:4326',
|
||||||
|
surface: false});
|
||||||
|
var serialized = format.writeGeometry(g);
|
||||||
|
expect(serialized.firstElementChild).to.xmleql(ol.xml.load(text));
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
@@ -323,6 +327,7 @@ describe('ol.format.GML', function() {
|
|||||||
expect(g).to.be.an(ol.geom.MultiLineString);
|
expect(g).to.be.an(ol.geom.MultiLineString);
|
||||||
expect(g.getCoordinates()).to.eql(
|
expect(g.getCoordinates()).to.eql(
|
||||||
[[[1, 2, 0], [2, 3, 0]], [[3, 4, 0], [4, 5, 0]]]);
|
[[[1, 2, 0], [2, 3, 0]], [[3, 4, 0], [4, 5, 0]]]);
|
||||||
|
format = new ol.format.GML({srsName: 'CRS:84', multiCurve: false});
|
||||||
var serialized = format.writeGeometry(g);
|
var serialized = format.writeGeometry(g);
|
||||||
expect(serialized.firstElementChild).to.xmleql(ol.xml.load(text));
|
expect(serialized.firstElementChild).to.xmleql(ol.xml.load(text));
|
||||||
});
|
});
|
||||||
@@ -390,6 +395,7 @@ describe('ol.format.GML', function() {
|
|||||||
[1, 2, 0]], [[2, 3, 0], [2, 5, 0], [4, 5, 0], [2, 3, 0]],
|
[1, 2, 0]], [[2, 3, 0], [2, 5, 0], [4, 5, 0], [2, 3, 0]],
|
||||||
[[3, 4, 0], [3, 6, 0], [5, 6, 0], [3, 4, 0]]],
|
[[3, 4, 0], [3, 6, 0], [5, 6, 0], [3, 4, 0]]],
|
||||||
[[[1, 2, 0], [3, 2, 0], [3, 4, 0], [1, 2, 0]]]]);
|
[[[1, 2, 0], [3, 2, 0], [3, 4, 0], [1, 2, 0]]]]);
|
||||||
|
format = new ol.format.GML({srsName: 'CRS:84', multiSurface: false});
|
||||||
var serialized = format.writeGeometry(g);
|
var serialized = format.writeGeometry(g);
|
||||||
expect(serialized.firstElementChild).to.xmleql(ol.xml.load(text));
|
expect(serialized.firstElementChild).to.xmleql(ol.xml.load(text));
|
||||||
});
|
});
|
||||||
@@ -438,26 +444,29 @@ describe('ol.format.GML', function() {
|
|||||||
|
|
||||||
describe('multicurve', function() {
|
describe('multicurve', function() {
|
||||||
|
|
||||||
it('can read a singular multicurve-linestring geometry', function() {
|
it('can read and write a singular multicurve-linestring geometry',
|
||||||
var text =
|
function() {
|
||||||
'<gml:MultiCurve xmlns:gml="http://www.opengis.net/gml" ' +
|
var text =
|
||||||
' srsName="CRS:84">' +
|
'<gml:MultiCurve xmlns:gml="http://www.opengis.net/gml" ' +
|
||||||
' <gml:curveMember>' +
|
' srsName="CRS:84">' +
|
||||||
' <gml:LineString>' +
|
' <gml:curveMember>' +
|
||||||
' <gml:posList>1 2 2 3</gml:posList>' +
|
' <gml:LineString>' +
|
||||||
' </gml:LineString>' +
|
' <gml:posList>1 2 2 3</gml:posList>' +
|
||||||
' </gml:curveMember>' +
|
' </gml:LineString>' +
|
||||||
' <gml:curveMember>' +
|
' </gml:curveMember>' +
|
||||||
' <gml:LineString>' +
|
' <gml:curveMember>' +
|
||||||
' <gml:posList>3 4 4 5</gml:posList>' +
|
' <gml:LineString>' +
|
||||||
' </gml:LineString>' +
|
' <gml:posList>3 4 4 5</gml:posList>' +
|
||||||
' </gml:curveMember>' +
|
' </gml:LineString>' +
|
||||||
'</gml:MultiCurve>';
|
' </gml:curveMember>' +
|
||||||
var g = readGeometry(format, text);
|
'</gml:MultiCurve>';
|
||||||
expect(g).to.be.an(ol.geom.MultiLineString);
|
var g = readGeometry(format, text);
|
||||||
expect(g.getCoordinates()).to.eql(
|
expect(g).to.be.an(ol.geom.MultiLineString);
|
||||||
[[[1, 2, 0], [2, 3, 0]], [[3, 4, 0], [4, 5, 0]]]);
|
expect(g.getCoordinates()).to.eql(
|
||||||
});
|
[[[1, 2, 0], [2, 3, 0]], [[3, 4, 0], [4, 5, 0]]]);
|
||||||
|
var serialized = format.writeGeometry(g);
|
||||||
|
expect(serialized.firstElementChild).to.xmleql(ol.xml.load(text));
|
||||||
|
});
|
||||||
|
|
||||||
it('can read a singular multicurve-curve geometry', function() {
|
it('can read a singular multicurve-curve geometry', function() {
|
||||||
var text =
|
var text =
|
||||||
|
|||||||
Reference in New Issue
Block a user