This adds a parser (read/write) for GML v2 and v3. GML v3 is limited to the simple features profile of GML 3.1.1, just like OpenLayers 2 was. This will be the basis for the WFS parser, but it only makes sense to continue this work once feature modification (insert, update, delete) is in place in ol3. So the WFS parser will be another pull request.
348 lines
16 KiB
JavaScript
348 lines
16 KiB
JavaScript
goog.provide('ol.test.parser.gml_v3');
|
|
|
|
describe('ol.parser.gml_v3', function() {
|
|
|
|
var parser = new ol.parser.ogc.GML_v3();
|
|
|
|
describe('Test GML v3 parser', function() {
|
|
it('Envelope read correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/envelope.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
expect(obj.bounds).to.eql([1, 3, 2, 4]);
|
|
});
|
|
});
|
|
it('LinearRing read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/linearring.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
var geom = parser.createGeometry_({geometry: obj.geometry});
|
|
parser.srsName = 'foo';
|
|
var node = parser.featureNSWiters_['_geometry'].apply(parser,
|
|
[geom]).firstChild;
|
|
delete parser.srsName;
|
|
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
|
|
expect(obj.geometry.type).to.eql('linearring');
|
|
expect(obj.geometry.coordinates).to.eql([[1, 2], [3, 4], [5, 6],
|
|
[1, 2]]);
|
|
});
|
|
});
|
|
it('Linestring read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/linestring.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
var geom = parser.createGeometry_({geometry: obj.geometry});
|
|
parser.srsName = 'foo';
|
|
var node = parser.featureNSWiters_['_geometry'].apply(parser,
|
|
[geom]).firstChild;
|
|
delete parser.srsName;
|
|
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
|
|
expect(obj.geometry.type).to.eql('linestring');
|
|
expect(obj.geometry.coordinates).to.eql([[1, 2], [3, 4]]);
|
|
});
|
|
});
|
|
it('Linestring 3D read correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/linestring3d.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
// no write test since simple features only does 2D
|
|
expect(obj.geometry.type).to.eql('linestring');
|
|
expect(obj.geometry.coordinates).to.eql([[1, 2, 3], [4, 5, 6]]);
|
|
});
|
|
});
|
|
it('Curve read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/curve.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var p = new ol.parser.ogc.GML_v3({curve: true, srsName: 'foo'});
|
|
var obj = p.read(xml);
|
|
var geom = p.createGeometry_({geometry: obj.geometry});
|
|
var node = p.featureNSWiters_['_geometry'].apply(p,
|
|
[geom]).firstChild;
|
|
expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml);
|
|
expect(obj.geometry.type).to.eql('linestring');
|
|
expect(obj.geometry.coordinates).to.eql([[1, 2], [3, 4]]);
|
|
});
|
|
});
|
|
it('MultiLineString plural read correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/multilinestring-plural.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
// no write test for plural, we only write singular
|
|
var obj = parser.read(xml);
|
|
expect(obj.geometry.type).to.eql('multilinestring');
|
|
expect(obj.geometry.parts.length).to.eql(2);
|
|
expect(obj.geometry.parts[0].type).to.eql('linestring');
|
|
});
|
|
});
|
|
it('MultiLineString singular read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/multilinestring-singular.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var p = new ol.parser.ogc.GML_v3({multiCurve: false, srsName: 'foo'});
|
|
var obj = p.read(xml);
|
|
var geom = p.createGeometry_({geometry: obj.geometry});
|
|
var node = p.featureNSWiters_['_geometry'].apply(p,
|
|
[geom]).firstChild;
|
|
expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml);
|
|
expect(obj.geometry.type).to.eql('multilinestring');
|
|
expect(obj.geometry.parts.length).to.eql(2);
|
|
expect(obj.geometry.parts[0].type).to.eql('linestring');
|
|
});
|
|
});
|
|
it('MultiCurve singular read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/multicurve-singular.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
parser.srsName = 'foo';
|
|
var geom = parser.createGeometry_({geometry: obj.geometry});
|
|
var node = parser.featureNSWiters_['_geometry'].apply(parser,
|
|
[geom]).firstChild;
|
|
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
|
|
delete parser.srsName;
|
|
expect(obj.geometry.type).to.eql('multilinestring');
|
|
expect(obj.geometry.parts.length).to.eql(2);
|
|
expect(obj.geometry.parts[0].type).to.eql('linestring');
|
|
expect(obj.geometry.parts[0].coordinates).to.eql([[1, 2], [2, 3]]);
|
|
});
|
|
});
|
|
it('MultiCurve curve read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/multicurve-curve.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var p = new ol.parser.ogc.GML_v3({curve: true, srsName: 'foo'});
|
|
var obj = p.read(xml);
|
|
var geom = p.createGeometry_({geometry: obj.geometry});
|
|
var node = p.featureNSWiters_['_geometry'].apply(p,
|
|
[geom]).firstChild;
|
|
expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml);
|
|
expect(obj.geometry.type).to.eql('multilinestring');
|
|
expect(obj.geometry.parts.length).to.eql(2);
|
|
expect(obj.geometry.parts[0].type).to.eql('linestring');
|
|
expect(obj.geometry.parts[0].coordinates).to.eql([[1, 2], [2, 3]]);
|
|
});
|
|
});
|
|
it('MultiPoint plural read correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/multipoint-plural.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
expect(obj.geometry.type).to.eql('multipoint');
|
|
expect(obj.geometry.parts.length).to.eql(3);
|
|
expect(obj.geometry.parts[0].type).to.eql('point');
|
|
expect(obj.geometry.parts[0].coordinates).to.eql([1, 2]);
|
|
});
|
|
});
|
|
it('MultiPoint singular read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/multipoint-singular.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
parser.srsName = 'foo';
|
|
var geom = parser.createGeometry_({geometry: obj.geometry});
|
|
var node = parser.featureNSWiters_['_geometry'].apply(parser,
|
|
[geom]).firstChild;
|
|
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
|
|
delete parser.srsName;
|
|
expect(obj.geometry.type).to.eql('multipoint');
|
|
expect(obj.geometry.parts.length).to.eql(3);
|
|
expect(obj.geometry.parts[0].type).to.eql('point');
|
|
expect(obj.geometry.parts[0].coordinates).to.eql([1, 2]);
|
|
});
|
|
});
|
|
it('MultiPolygon plural read correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/multipolygon-plural.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
expect(obj.geometry.type).to.eql('multipolygon');
|
|
expect(obj.geometry.parts.length).to.eql(2);
|
|
expect(obj.geometry.parts[0].type).to.eql('polygon');
|
|
});
|
|
});
|
|
it('MultiPolygon singular read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/multipolygon-singular.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var p = new ol.parser.ogc.GML_v3({multiSurface: false, srsName: 'foo'});
|
|
var obj = p.read(xml);
|
|
var geom = p.createGeometry_({geometry: obj.geometry});
|
|
var node = p.featureNSWiters_['_geometry'].apply(p,
|
|
[geom]).firstChild;
|
|
expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml);
|
|
expect(obj.geometry.type).to.eql('multipolygon');
|
|
expect(obj.geometry.parts.length).to.eql(2);
|
|
expect(obj.geometry.parts[0].type).to.eql('polygon');
|
|
});
|
|
});
|
|
it('MultiSurface plural read correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/multisurface-plural.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
expect(obj.geometry.type).to.eql('multipolygon');
|
|
expect(obj.geometry.parts.length).to.eql(2);
|
|
expect(obj.geometry.parts[0].type).to.eql('polygon');
|
|
});
|
|
});
|
|
it('MultiSurface singular read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/multisurface-singular.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
parser.srsName = 'foo';
|
|
var geom = parser.createGeometry_({geometry: obj.geometry});
|
|
var node = parser.featureNSWiters_['_geometry'].apply(parser,
|
|
[geom]).firstChild;
|
|
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
|
|
delete parser.srsName;
|
|
expect(obj.geometry.type).to.eql('multipolygon');
|
|
expect(obj.geometry.parts.length).to.eql(2);
|
|
expect(obj.geometry.parts[0].type).to.eql('polygon');
|
|
});
|
|
});
|
|
it('MultiSurface surface read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/multisurface-surface.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var p = new ol.parser.ogc.GML_v3({surface: true, srsName: 'foo'});
|
|
var obj = p.read(xml);
|
|
var geom = p.createGeometry_({geometry: obj.geometry});
|
|
var node = p.featureNSWiters_['_geometry'].apply(p,
|
|
[geom]).firstChild;
|
|
expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml);
|
|
expect(obj.geometry.type).to.eql('multipolygon');
|
|
expect(obj.geometry.parts.length).to.eql(2);
|
|
expect(obj.geometry.parts[0].type).to.eql('polygon');
|
|
});
|
|
});
|
|
it('Point read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/point.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
var geom = parser.createGeometry_({geometry: obj.geometry});
|
|
parser.srsName = 'foo';
|
|
var node = parser.featureNSWiters_['_geometry'].apply(parser,
|
|
[geom]).firstChild;
|
|
delete parser.srsName;
|
|
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
|
|
expect(obj.geometry.type).to.eql('point');
|
|
expect(obj.geometry.coordinates).to.eql([1, 2]);
|
|
});
|
|
});
|
|
it('Polygon read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/polygon.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
var geom = parser.createGeometry_({geometry: obj.geometry});
|
|
parser.srsName = 'foo';
|
|
var node = parser.featureNSWiters_['_geometry'].apply(parser,
|
|
[geom]).firstChild;
|
|
delete parser.srsName;
|
|
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
|
|
expect(obj.geometry.type).to.eql('polygon');
|
|
expect(obj.geometry.coordinates.length).to.eql(3);
|
|
expect(obj.geometry.coordinates[0].length).to.eql(4);
|
|
expect(obj.geometry.coordinates[0]).to.eql([[1, 2], [3, 4],
|
|
[5, 6], [1, 2]]);
|
|
expect(obj.geometry.coordinates[1]).to.eql([[2, 3], [4, 5],
|
|
[6, 7], [2, 3]]);
|
|
expect(obj.geometry.coordinates[2]).to.eql([[3, 4], [5, 6],
|
|
[7, 8], [3, 4]]);
|
|
});
|
|
});
|
|
it('Surface read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/surface.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var p = new ol.parser.ogc.GML_v3({surface: true, srsName: 'foo'});
|
|
var obj = p.read(xml);
|
|
var geom = p.createGeometry_({geometry: obj.geometry});
|
|
var node = p.featureNSWiters_['_geometry'].apply(p,
|
|
[geom]).firstChild;
|
|
expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml);
|
|
expect(obj.geometry.type).to.eql('polygon');
|
|
expect(obj.geometry.coordinates.length).to.eql(3);
|
|
expect(obj.geometry.coordinates[0].length).to.eql(4);
|
|
expect(obj.geometry.coordinates[0]).to.eql([[1, 2], [3, 4],
|
|
[5, 6], [1, 2]]);
|
|
expect(obj.geometry.coordinates[1]).to.eql([[2, 3], [4, 5],
|
|
[6, 7], [2, 3]]);
|
|
expect(obj.geometry.coordinates[2]).to.eql([[3, 4], [5, 6],
|
|
[7, 8], [3, 4]]);
|
|
});
|
|
});
|
|
it('FeatureCollection from GML read / written correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/topp-states-gml.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var srsName = 'urn:x-ogc:def:crs:EPSG:4326';
|
|
var schemaLoc = 'http://www.openplans.org/topp ' +
|
|
'http://demo.opengeo.org/geoserver/wfs?service=WFS&version=' +
|
|
'1.1.0&request=DescribeFeatureType&typeName=topp:states ' +
|
|
'http://www.opengis.net/gml ' +
|
|
'http://schemas.opengis.net/gml/3.2.1/gml.xsd';
|
|
var p = new ol.parser.ogc.GML_v3({srsName: srsName,
|
|
schemaLocation: schemaLoc});
|
|
var obj = p.read(xml);
|
|
var output = p.write(obj);
|
|
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
|
|
expect(p.geometryName).to.eql('the_geom');
|
|
expect(obj.features.length).to.eql(10);
|
|
var feature = obj.features[0];
|
|
expect(feature.getGeometry() instanceof
|
|
ol.geom.MultiPolygon).to.be.ok();
|
|
var attributes = feature.getAttributes();
|
|
// TODO test for fid
|
|
expect(attributes['STATE_NAME']).to.eql('Illinois');
|
|
expect(attributes['STATE_FIPS']).to.eql('17');
|
|
expect(attributes['SUB_REGION']).to.eql('E N Cen');
|
|
expect(attributes['STATE_ABBR']).to.eql('IL');
|
|
expect(attributes['LAND_KM']).to.eql('143986.61');
|
|
});
|
|
});
|
|
it('FeatureCollection from WFS read correctly', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/topp-states-wfs.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
expect(obj.features.length).to.eql(3);
|
|
var feature = obj.features[0];
|
|
expect(feature.getGeometry() instanceof
|
|
ol.geom.MultiPolygon).to.be.ok();
|
|
var attributes = feature.getAttributes();
|
|
// TODO test for fid
|
|
expect(attributes['STATE_NAME']).to.eql('Illinois');
|
|
expect(attributes['STATE_FIPS']).to.eql('17');
|
|
expect(attributes['SUB_REGION']).to.eql('E N Cen');
|
|
expect(attributes['STATE_ABBR']).to.eql('IL');
|
|
expect(attributes['LAND_KM']).to.eql('143986.61');
|
|
});
|
|
});
|
|
it('Read autoConfig', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/topp-states-wfs.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
var features = obj.features;
|
|
expect(parser.featureType).to.eql('states');
|
|
expect(parser.featureNS).to.eql('http://www.openplans.org/topp');
|
|
expect(parser.autoConfig === true).to.be.ok();
|
|
parser.autoConfig = false;
|
|
parser.read(xml);
|
|
expect(parser.autoConfig === false).to.be.ok();
|
|
parser.autoConfig = true;
|
|
});
|
|
});
|
|
it('Empty attribute', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/empty-attribute.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
expect(obj.features.length).to.eql(1);
|
|
var attr = obj.features[0].getAttributes();
|
|
expect(attr['name']).to.eql('Aflu');
|
|
expect(attr['foo']).to.eql(undefined);
|
|
expect(attr['empty']).to.eql('');
|
|
});
|
|
});
|
|
it('Repeated name', function() {
|
|
var url = 'spec/ol/parser/ogc/xml/gml_v3/repeated-name.xml';
|
|
afterLoadXml(url, function(xml) {
|
|
var obj = parser.read(xml);
|
|
expect(obj.features.length).to.eql(1);
|
|
var atts = obj.features[0].getAttributes();
|
|
expect(atts['zoning']).to.eql('I-L');
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
goog.require('goog.dom.xml');
|
|
goog.require('ol.geom.MultiPolygon');
|
|
goog.require('ol.parser.ogc.GML_v3');
|