diff --git a/old/examples/wkt.html b/examples/wkt.html similarity index 100% rename from old/examples/wkt.html rename to examples/wkt.html index 5c3f7e15a8..39c97422c5 100644 --- a/old/examples/wkt.html +++ b/examples/wkt.html @@ -43,8 +43,8 @@ - + diff --git a/old/examples/wkt.js b/examples/wkt.js similarity index 64% rename from old/examples/wkt.js rename to examples/wkt.js index 4ea4b41aca..65af30fdb3 100644 --- a/old/examples/wkt.js +++ b/examples/wkt.js @@ -1,11 +1,9 @@ goog.require('ol.Feature'); goog.require('ol.Map'); -goog.require('ol.RendererHint'); -goog.require('ol.View2D'); +goog.require('ol.View'); +goog.require('ol.format.WKT'); goog.require('ol.layer.Tile'); goog.require('ol.layer.Vector'); -goog.require('ol.parser.WKT'); -goog.require('ol.proj'); goog.require('ol.source.OSM'); goog.require('ol.source.Vector'); @@ -13,15 +11,12 @@ var raster = new ol.layer.Tile({ source: new ol.source.OSM() }); -var parser = new ol.parser.WKT(); -var transform = ol.proj.getTransform('EPSG:4326', 'EPSG:3857'); -var geom = parser.read( +var format = new ol.format.WKT(); +var feature = format.readFeature( 'POLYGON((10.689697265625 -25.0927734375, 34.595947265625 ' + '-20.1708984375, 38.814697265625 -35.6396484375, 13.502197265625 ' + '-39.1552734375, 10.689697265625 -25.0927734375))'); -geom.transform(transform); -var feature = new ol.Feature(); -feature.setGeometry(geom); +feature.getGeometry().transform('EPSG:4326', 'EPSG:3857'); var vector = new ol.layer.Vector({ source: new ol.source.Vector({ @@ -31,9 +26,8 @@ var vector = new ol.layer.Vector({ var map = new ol.Map({ layers: [raster, vector], - renderer: ol.RendererHint.CANVAS, target: 'map', - view: new ol.View2D({ + view: new ol.View({ center: [2952104.019976033, -3277504.823700756], zoom: 4 }) diff --git a/externs/olx.js b/externs/olx.js index cc1d32217f..fc284df86a 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -1449,6 +1449,20 @@ olx.format.WFSWriteTransactionOptions.prototype.nativeElements; olx.format.WFSWriteTransactionOptions.prototype.gmlOptions; +/** + * @typedef {{splitCollection: (boolean|undefined)}} + * @todo api + */ +olx.format.WKTOptions; + + +/** + * Whether to split GEOMETRYCOLLECTION's into multiple features. + * @type {boolean|undefined} + */ +olx.format.WKTOptions.prototype.splitCollection; + + /** * Interactions for the map. Default is `true` for all options. * @typedef {{altShiftDragRotate: (boolean|undefined), diff --git a/old/src/ol/parser/featureparser.js b/old/src/ol/parser/featureparser.js deleted file mode 100644 index cd614b4f91..0000000000 --- a/old/src/ol/parser/featureparser.js +++ /dev/null @@ -1,98 +0,0 @@ -goog.provide('ol.parser.AsyncObjectFeatureParser'); -goog.provide('ol.parser.AsyncStringFeatureParser'); -goog.provide('ol.parser.DomFeatureParser'); -goog.provide('ol.parser.ObjectFeatureParser'); -goog.provide('ol.parser.ReadFeaturesResult'); -goog.provide('ol.parser.StringFeatureParser'); - -goog.require('ol.Feature'); - - - -/** - * @interface - */ -ol.parser.DomFeatureParser = function() {}; - - -/** - * @param {Element|Document} node Document or element node. - * @return {ol.parser.ReadFeaturesResult} Features and metadata. - */ -ol.parser.DomFeatureParser.prototype.readFeaturesFromNode = - goog.abstractMethod; - - - -/** - * @interface - */ -ol.parser.ObjectFeatureParser = function() {}; - - -/** - * @param {Object} obj Object representing features. - * @return {ol.parser.ReadFeaturesResult} Features and metadata. - */ -ol.parser.ObjectFeatureParser.prototype.readFeaturesFromObject = - goog.abstractMethod; - - - -/** - * @interface - */ -ol.parser.StringFeatureParser = function() {}; - - -/** - * @param {string} data String data. - * @return {ol.parser.ReadFeaturesResult} Features and metadata. - */ -ol.parser.StringFeatureParser.prototype.readFeaturesFromString = - goog.abstractMethod; - - - -/** - * @interface - */ -ol.parser.AsyncStringFeatureParser = function() {}; - - -/** - * @param {string} data String data. - * @param {function(ol.parser.ReadFeaturesResult)} callback Callback which is - * called after parsing. - */ -ol.parser.AsyncStringFeatureParser.prototype.readFeaturesFromStringAsync = - goog.abstractMethod; - - - -/** - * @interface - */ -ol.parser.AsyncObjectFeatureParser = function() {}; - - -/** - * @param {Object} obj Object representing features. - * @param {function(ol.parser.ReadFeaturesResult)} callback Callback which is - * called after parsing. - */ -ol.parser.AsyncObjectFeatureParser.prototype.readFeaturesFromObjectAsync = - goog.abstractMethod; - - -/** - * @typedef {{projection: ol.proj.ProjectionLike}} - */ -ol.parser.ReadFeaturesMetadata; - - -/** - * @typedef {{features: Array., - * metadata: ol.parser.ReadFeaturesMetadata}} - */ -ol.parser.ReadFeaturesResult; diff --git a/old/test/spec/ol/parser/wkt.test.js b/old/test/spec/ol/parser/wkt.test.js deleted file mode 100644 index b2e1d06aac..0000000000 --- a/old/test/spec/ol/parser/wkt.test.js +++ /dev/null @@ -1,180 +0,0 @@ -goog.provide('ol.test.parser.WKT'); - -describe('ol.parser.WKT', function() { - - var parser = new ol.parser.WKT(); - - it('Point read / written correctly', function() { - var wkt = 'POINT(30 10)'; - var geom = parser.read(wkt); - expect(geom.getCoordinates()).to.eql([30, 10]); - expect(parser.write(geom)).to.eql(wkt); - // test whitespace when reading - wkt = 'POINT (30 10)'; - geom = parser.read(wkt); - expect(geom.getCoordinates()).to.eql([30, 10]); - }); - - it('MultiPoint read / written correctly', function() { - // there are two forms to test - var wkt = 'MULTIPOINT((10 40),(40 30),(20 20),(30 10))'; - var geom = parser.read(wkt); - var components = geom.getComponents(); - expect(components.length).to.eql(4); - expect(components[0].getCoordinates()).to.eql([10, 40]); - expect(components[1].getCoordinates()).to.eql([40, 30]); - expect(components[2].getCoordinates()).to.eql([20, 20]); - expect(components[3].getCoordinates()).to.eql([30, 10]); - expect(parser.write(geom)).to.eql(wkt); - // this has whitespace - wkt = 'MULTIPOINT (10 40, 40 30, 20 20, 30 10)'; - geom = parser.read(wkt); - components = geom.getComponents(); - expect(components.length).to.eql(4); - expect(components[0].getCoordinates()).to.eql([10, 40]); - expect(components[1].getCoordinates()).to.eql([40, 30]); - expect(components[2].getCoordinates()).to.eql([20, 20]); - expect(components[3].getCoordinates()).to.eql([30, 10]); - }); - - it('LineString read / written correctly', function() { - var wkt = 'LINESTRING(30 10,10 30,40 40)'; - var geom = parser.read(wkt); - expect(geom.getType()).to.eql(ol.geom.GeometryType.LINE_STRING); - expect(geom.getCoordinates()).to.eql([[30, 10], [10, 30], [40, 40]]); - expect(parser.write(geom)).to.eql(wkt); - // test whitespace when reading - wkt = 'LINESTRING (30 10, 10 30, 40 40)'; - geom = parser.read(wkt); - expect(geom.getType()).to.eql(ol.geom.GeometryType.LINE_STRING); - expect(geom.getCoordinates()).to.eql([[30, 10], [10, 30], [40, 40]]); - }); - - it('MultiLineString read / written correctly', function() { - var wkt = 'MULTILINESTRING((10 10,20 20,10 40),' + - '(40 40,30 30,40 20,30 10))'; - var geom = parser.read(wkt); - expect(geom.getType()).to.eql(ol.geom.GeometryType.MULTI_LINE_STRING); - var components = geom.getComponents(); - expect(components.length).to.eql(2); - expect(components[0].getType()).to.eql(ol.geom.GeometryType.LINE_STRING); - expect(components[0].getCoordinates()).to.eql( - [[10, 10], [20, 20], [10, 40]]); - expect(parser.write(geom)).to.eql(wkt); - // test whitespace when reading - wkt = 'MULTILINESTRING ( (10 10, 20 20, 10 40), ' + - '(40 40, 30 30, 40 20, 30 10) )'; - geom = parser.read(wkt); - expect(geom.getType()).to.eql(ol.geom.GeometryType.MULTI_LINE_STRING); - components = geom.getComponents(); - expect(components.length).to.eql(2); - expect(components[0].getType()).to.eql( - ol.geom.GeometryType.LINE_STRING); - expect(components[0].getCoordinates()).to.eql( - [[10, 10], [20, 20], [10, 40]]); - }); - - it('Polygon read / written correctly', function() { - var wkt = 'POLYGON((30 10,10 20,20 40,40 40,30 10))'; - var geom = parser.read(wkt); - expect(geom.getType()).to.eql(ol.geom.GeometryType.POLYGON); - var rings = geom.getRings(); - expect(rings.length).to.eql(1); - expect(rings[0].getType()).to.eql(ol.geom.GeometryType.LINEAR_RING); - expect(rings[0].getCoordinates()).to.eql( - [[30, 10], [10, 20], [20, 40], [40, 40], [30, 10]]); - expect(parser.write(geom)).to.eql(wkt); - - // note that WKT doesn't care about winding order, we do - wkt = 'POLYGON((35 10,10 20,15 40,45 45,35 10),(20 30,30 20,35 35,20 30))'; - geom = parser.read(wkt); - expect(geom.getType()).to.eql(ol.geom.GeometryType.POLYGON); - var rings = geom.getRings(); - expect(rings.length).to.eql(2); - expect(rings[0].getType()).to.eql(ol.geom.GeometryType.LINEAR_RING); - expect(rings[1].getType()).to.eql(ol.geom.GeometryType.LINEAR_RING); - expect(rings[0].getCoordinates()).to.eql( - [[35, 10], [10, 20], [15, 40], [45, 45], [35, 10]]); - expect(rings[1].getCoordinates()).to.eql( - [[20, 30], [30, 20], [35, 35], [20, 30]]); - expect(parser.write(geom)).to.eql(wkt); - - // test whitespace when reading - wkt = 'POLYGON ( (30 10, 10 20, 20 40, 40 40, 30 10) )'; - geom = parser.read(wkt); - expect(geom.getType()).to.eql(ol.geom.GeometryType.POLYGON); - var rings = geom.getRings(); - expect(rings.length).to.eql(1); - expect(rings[0].getType()).to.eql(ol.geom.GeometryType.LINEAR_RING); - expect(rings[0].getCoordinates()).to.eql( - [[30, 10], [10, 20], [20, 40], [40, 40], [30, 10]]); - }); - - it('MultiPolygon read / written correctly', function() { - // note that WKT doesn't care about winding order, we do - var wkt = 'MULTIPOLYGON(((40 40,45 30,20 45,40 40)),' + - '((20 35,45 20,30 5,10 10,10 30,20 35),(30 20,20 25,20 15,30 20)))'; - var geom = parser.read(wkt); - expect(geom.getType()).to.eql(ol.geom.GeometryType.MULTI_POLYGON); - var components = geom.getComponents(); - expect(components.length).to.eql(2); - expect(components[0].getType()).to.eql(ol.geom.GeometryType.POLYGON); - expect(components[1].getType()).to.eql(ol.geom.GeometryType.POLYGON); - expect(components[0].getRings().length).to.eql(1); - expect(components[1].getRings().length).to.eql(2); - expect(components[0].getRings()[0].getCoordinates()).to.eql( - [[40, 40], [45, 30], [20, 45], [40, 40]]); - expect(components[1].getRings()[0].getCoordinates()).to.eql( - [[20, 35], [45, 20], [30, 5], [10, 10], [10, 30], [20, 35]]); - expect(components[1].getRings()[1].getCoordinates()).to.eql( - [[30, 20], [20, 25], [20, 15], [30, 20]]); - expect(parser.write(geom)).to.eql(wkt); - - // test whitespace when reading - wkt = 'MULTIPOLYGON( ( ( 40 40,45 30, 20 45 ,40 40 )) ,' + - '( (20 35, 45 20,30 5,10 10,10 30,20 35), ' + - '( 30 20, 20 25,20 15 ,30 20 ) ))'; - geom = parser.read(wkt); - expect(geom.getType()).to.eql(ol.geom.GeometryType.MULTI_POLYGON); - var components = geom.getComponents(); - expect(components.length).to.eql(2); - expect(components[0].getType()).to.eql(ol.geom.GeometryType.POLYGON); - expect(components[1].getType()).to.eql(ol.geom.GeometryType.POLYGON); - expect(components[0].getRings().length).to.eql(1); - expect(components[1].getRings().length).to.eql(2); - expect(components[0].getRings()[0].getCoordinates()).to.eql( - [[40, 40], [45, 30], [20, 45], [40, 40]]); - expect(components[1].getRings()[0].getCoordinates()).to.eql( - [[20, 35], [45, 20], [30, 5], [10, 10], [10, 30], [20, 35]]); - expect(components[1].getRings()[1].getCoordinates()).to.eql( - [[30, 20], [20, 25], [20, 15], [30, 20]]); - }); - - it('GeometryCollection read / written correctly', function() { - var wkt = 'GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))'; - var geom = parser.read(wkt); - var components = geom.getComponents(); - expect(components.length).to.eql(2); - expect(geom.getType()).to.eql(ol.geom.GeometryType.GEOMETRY_COLLECTION); - expect(components[0].getType()).to.eql(ol.geom.GeometryType.POINT); - expect(components[1].getType()).to.eql(ol.geom.GeometryType.LINE_STRING); - expect(components[0].getCoordinates()).to.eql([4, 6]); - expect(components[1].getCoordinates()).to.eql([[4, 6], [7, 10]]); - expect(parser.write(geom)).to.eql(wkt); - // test whitespace when reading - wkt = 'GEOMETRYCOLLECTION ( POINT (4 6), LINESTRING (4 6, 7 10) )'; - geom = parser.read(wkt); - components = geom.getComponents(); - expect(components.length).to.eql(2); - expect(geom.getType()).to.eql(ol.geom.GeometryType.GEOMETRY_COLLECTION); - expect(components[0].getType()).to.eql(ol.geom.GeometryType.POINT); - expect(components[1].getType()).to.eql( - ol.geom.GeometryType.LINE_STRING); - expect(components[0].getCoordinates()).to.eql([4, 6]); - expect(components[1].getCoordinates()).to.eql([[4, 6], [7, 10]]); - }); - -}); - -goog.require('ol.geom.GeometryType'); -goog.require('ol.parser.WKT'); diff --git a/old/src/ol/parser/wktparser.js b/src/ol/format/wktformat.js similarity index 53% rename from old/src/ol/parser/wktparser.js rename to src/ol/format/wktformat.js index 6a5838e558..e724bc22e4 100644 --- a/old/src/ol/parser/wktparser.js +++ b/src/ol/format/wktformat.js @@ -1,38 +1,51 @@ -goog.provide('ol.parser.WKT'); +goog.provide('ol.format.WKT'); goog.require('goog.array'); goog.require('goog.string'); goog.require('ol.Feature'); +goog.require('ol.format.TextFeature'); goog.require('ol.geom.Geometry'); goog.require('ol.geom.GeometryCollection'); +goog.require('ol.geom.GeometryType'); goog.require('ol.geom.LineString'); goog.require('ol.geom.MultiLineString'); goog.require('ol.geom.MultiPoint'); goog.require('ol.geom.MultiPolygon'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); -goog.require('ol.parser.Parser'); -goog.require('ol.parser.StringFeatureParser'); /** * @constructor - * @extends {ol.parser.Parser} - * @implements {ol.parser.StringFeatureParser} + * @extends {ol.format.TextFeature} + * @param {olx.format.WKTOptions=} opt_options Options. * @todo stability experimental + * @todo api */ -ol.parser.WKT = function() { +ol.format.WKT = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + + goog.base(this); + + /** + * Split GEOMETRYCOLLECTION into multiple features. + * @type {boolean} + * @private + */ + this.splitCollection_ = goog.isDef(options.splitCollection) ? + options.splitCollection : false; + }; -goog.inherits(ol.parser.WKT, ol.parser.Parser); -goog.addSingletonGetter(ol.parser.WKT); +goog.inherits(ol.format.WKT, ol.format.TextFeature); /** * Constants for regExes. * @enum {RegExp} */ -ol.parser.WKT.regExes = { +ol.format.WKT.regExes = { typeStr: /^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/, spaces: /\s+/, parenComma: /\)\s*,\s*\(/, @@ -48,8 +61,8 @@ ol.parser.WKT.regExes = { * @return {ol.geom.Point} Parsed point. * @private */ -ol.parser.WKT.prototype.parsePoint_ = function(str) { - var coords = goog.string.trim(str).split(ol.parser.WKT.regExes.spaces); +ol.format.WKT.prototype.parsePoint_ = function(str) { + var coords = goog.string.trim(str).split(ol.format.WKT.regExes.spaces); return new ol.geom.Point(goog.array.map(coords, parseFloat)); }; @@ -59,7 +72,7 @@ ol.parser.WKT.prototype.parsePoint_ = function(str) { * @return {ol.geom.LineString} Parsed linestring. * @private */ -ol.parser.WKT.prototype.parseLineString_ = function(str) { +ol.format.WKT.prototype.parseLineString_ = function(str) { var points = goog.string.trim(str).split(','); var coordinates = []; for (var i = 0, ii = points.length; i < ii; ++i) { @@ -75,15 +88,15 @@ ol.parser.WKT.prototype.parseLineString_ = function(str) { * @return {ol.geom.MultiPoint} Parsed multipoint. * @private */ -ol.parser.WKT.prototype.parseMultiPoint_ = function(str) { +ol.format.WKT.prototype.parseMultiPoint_ = function(str) { var point; var points = goog.string.trim(str).split(','); - var parts = []; + var geom = new ol.geom.MultiPoint(null); for (var i = 0, ii = points.length; i < ii; ++i) { - point = points[i].replace(ol.parser.WKT.regExes.trimParens, '$1'); - parts.push(this.parsePoint_.apply(this, [point])); + point = points[i].replace(ol.format.WKT.regExes.trimParens, '$1'); + geom.appendPoint(this.parsePoint_.apply(this, [point])); } - return ol.geom.MultiPoint.fromParts(parts); + return geom; }; @@ -92,15 +105,15 @@ ol.parser.WKT.prototype.parseMultiPoint_ = function(str) { * @return {ol.geom.MultiLineString} Parsed multilinestring. * @private */ -ol.parser.WKT.prototype.parseMultiLineString_ = function(str) { +ol.format.WKT.prototype.parseMultiLineString_ = function(str) { var line; - var lines = goog.string.trim(str).split(ol.parser.WKT.regExes.parenComma); - var parts = []; + var lines = goog.string.trim(str).split(ol.format.WKT.regExes.parenComma); + var geom = new ol.geom.MultiLineString(null); for (var i = 0, ii = lines.length; i < ii; ++i) { - line = lines[i].replace(ol.parser.WKT.regExes.trimParens, '$1'); - parts.push(this.parseLineString_.apply(this, [line])); + line = lines[i].replace(ol.format.WKT.regExes.trimParens, '$1'); + geom.appendLineString(this.parseLineString_.apply(this, [line])); } - return ol.geom.MultiLineString.fromParts(parts); + return geom; }; @@ -109,12 +122,12 @@ ol.parser.WKT.prototype.parseMultiLineString_ = function(str) { * @return {ol.geom.Polygon} Parsed polygon. * @private */ -ol.parser.WKT.prototype.parsePolygon_ = function(str) { +ol.format.WKT.prototype.parsePolygon_ = function(str) { var ring, linestring, linearring; - var rings = goog.string.trim(str).split(ol.parser.WKT.regExes.parenComma); + var rings = goog.string.trim(str).split(ol.format.WKT.regExes.parenComma); var coordinates = []; for (var i = 0, ii = rings.length; i < ii; ++i) { - ring = rings[i].replace(ol.parser.WKT.regExes.trimParens, '$1'); + ring = rings[i].replace(ol.format.WKT.regExes.trimParens, '$1'); linestring = this.parseLineString_.apply(this, [ring]).getCoordinates(); coordinates.push(linestring); } @@ -127,16 +140,16 @@ ol.parser.WKT.prototype.parsePolygon_ = function(str) { * @return {ol.geom.MultiPolygon} Parsed multipolygon. * @private */ -ol.parser.WKT.prototype.parseMultiPolygon_ = function(str) { +ol.format.WKT.prototype.parseMultiPolygon_ = function(str) { var polygon; var polygons = goog.string.trim(str).split( - ol.parser.WKT.regExes.doubleParenComma); - var parts = []; + ol.format.WKT.regExes.doubleParenComma); + var geom = new ol.geom.MultiPolygon(null); for (var i = 0, ii = polygons.length; i < ii; ++i) { - polygon = polygons[i].replace(ol.parser.WKT.regExes.trimParens, '$1'); - parts.push(this.parsePolygon_.apply(this, [polygon])); + polygon = polygons[i].replace(ol.format.WKT.regExes.trimParens, '$1'); + geom.appendPolygon(this.parsePolygon_.apply(this, [polygon])); } - return ol.geom.MultiPolygon.fromParts(parts); + return geom; }; @@ -145,15 +158,15 @@ ol.parser.WKT.prototype.parseMultiPolygon_ = function(str) { * @return {ol.geom.GeometryCollection} Parsed geometrycollection. * @private */ -ol.parser.WKT.prototype.parseGeometryCollection_ = function(str) { +ol.format.WKT.prototype.parseGeometryCollection_ = function(str) { // separate components of the collection with | - str = str.replace(ol.parser.WKT.regExes.geomCollection, '|$1'); + str = str.replace(ol.format.WKT.regExes.geomCollection, '|$1'); var wktArray = goog.string.trim(str).split('|'); - var components = []; + var geoms = []; for (var i = 0, ii = wktArray.length; i < ii; ++i) { - components.push(this.parse_.apply(this, [wktArray[i]])); + geoms.push(this.parse_.apply(this, [wktArray[i]])); } - return new ol.geom.GeometryCollection(components); + return new ol.geom.GeometryCollection(geoms); }; @@ -162,7 +175,7 @@ ol.parser.WKT.prototype.parseGeometryCollection_ = function(str) { * @return {string} Coordinates part of Point as WKT. * @private */ -ol.parser.WKT.prototype.encodePoint_ = function(geom) { +ol.format.WKT.prototype.encodePoint_ = function(geom) { var coordinates = geom.getCoordinates(); return coordinates[0] + ' ' + coordinates[1]; }; @@ -173,9 +186,9 @@ ol.parser.WKT.prototype.encodePoint_ = function(geom) { * @return {string} Coordinates part of MultiPoint as WKT. * @private */ -ol.parser.WKT.prototype.encodeMultiPoint_ = function(geom) { +ol.format.WKT.prototype.encodeMultiPoint_ = function(geom) { var array = []; - var components = geom.getComponents(); + var components = geom.getPoints(); for (var i = 0, ii = components.length; i < ii; ++i) { array.push('(' + this.encodePoint_.apply(this, [components[i]]) + ')'); } @@ -188,11 +201,11 @@ ol.parser.WKT.prototype.encodeMultiPoint_ = function(geom) { * @return {string} Coordinates part of GeometryCollection as WKT. * @private */ -ol.parser.WKT.prototype.encodeGeometryCollection_ = function(geom) { +ol.format.WKT.prototype.encodeGeometryCollection_ = function(geom) { var array = []; - var components = geom.getComponents(); - for (var i = 0, ii = components.length; i < ii; ++i) { - array.push(this.encode_.apply(this, [components[i]])); + var geoms = geom.getGeometries(); + for (var i = 0, ii = geoms.length; i < ii; ++i) { + array.push(this.encode_.apply(this, [geoms[i]])); } return array.join(','); }; @@ -203,7 +216,7 @@ ol.parser.WKT.prototype.encodeGeometryCollection_ = function(geom) { * @return {string} Coordinates part of LineString as WKT. * @private */ -ol.parser.WKT.prototype.encodeLineString_ = function(geom) { +ol.format.WKT.prototype.encodeLineString_ = function(geom) { var coordinates = geom.getCoordinates(); var array = []; for (var i = 0, ii = coordinates.length; i < ii; ++i) { @@ -218,9 +231,9 @@ ol.parser.WKT.prototype.encodeLineString_ = function(geom) { * @return {string} Coordinates part of MultiLineString as WKT. * @private */ -ol.parser.WKT.prototype.encodeMultiLineString_ = function(geom) { +ol.format.WKT.prototype.encodeMultiLineString_ = function(geom) { var array = []; - var components = geom.getComponents(); + var components = geom.getLineStrings(); for (var i = 0, ii = components.length; i < ii; ++i) { array.push('(' + this.encodeLineString_.apply(this, [components[i]]) + ')'); @@ -234,9 +247,9 @@ ol.parser.WKT.prototype.encodeMultiLineString_ = function(geom) { * @return {string} Coordinates part of Polygon as WKT. * @private */ -ol.parser.WKT.prototype.encodePolygon_ = function(geom) { +ol.format.WKT.prototype.encodePolygon_ = function(geom) { var array = []; - var rings = geom.getRings(); + var rings = geom.getLinearRings(); for (var i = 0, ii = rings.length; i < ii; ++i) { array.push('(' + this.encodeLineString_.apply(this, [rings[i]]) + ')'); @@ -250,9 +263,9 @@ ol.parser.WKT.prototype.encodePolygon_ = function(geom) { * @return {string} Coordinates part of MultiPolygon as WKT. * @private */ -ol.parser.WKT.prototype.encodeMultiPolygon_ = function(geom) { +ol.format.WKT.prototype.encodeMultiPolygon_ = function(geom) { var array = []; - var components = geom.getComponents(); + var components = geom.getPolygons(); for (var i = 0, ii = components.length; i < ii; ++i) { array.push('(' + this.encodePolygon_.apply(this, [components[i]]) + ')'); } @@ -267,9 +280,9 @@ ol.parser.WKT.prototype.encodeMultiPolygon_ = function(geom) { * The geometry created. * @private */ -ol.parser.WKT.prototype.parse_ = function(wkt) { - wkt = wkt.replace(ol.parser.WKT.regExes.removeNewLine, ' '); - var matches = ol.parser.WKT.regExes.typeStr.exec(wkt); +ol.format.WKT.prototype.parse_ = function(wkt) { + wkt = wkt.replace(ol.format.WKT.regExes.removeNewLine, ' '); + var matches = ol.format.WKT.regExes.typeStr.exec(wkt); var geometry; if (matches) { var type = matches[1].toLowerCase(); @@ -310,7 +323,7 @@ ol.parser.WKT.prototype.parse_ = function(wkt) { * @return {string} WKT string for the geometry. * @private */ -ol.parser.WKT.prototype.encode_ = function(geom) { +ol.format.WKT.prototype.encode_ = function(geom) { var type = geom.getType(); var result = type.toUpperCase() + '('; if (geom instanceof ol.geom.Point) { @@ -335,58 +348,149 @@ ol.parser.WKT.prototype.encode_ = function(geom) { /** - * Parse a WKT string. - * @param {string} str WKT string. - * @return {ol.geom.Geometry|undefined} Parsed geometry. + * Read a feature from a WKT source. + * + * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @return {ol.Feature} Feature. + * @todo api */ -ol.parser.WKT.prototype.read = function(str) { - return this.parse_(str); -}; +ol.format.WKT.prototype.readFeature; /** - * Parse a WKT document provided as a string. - * @param {string} str WKT document. - * @return {ol.parser.ReadFeaturesResult} Features and metadata. + * @inheritDoc */ -ol.parser.WKT.prototype.readFeaturesFromString = function(str) { - var geom = this.read(str); - var obj = /** @type {ol.parser.ReadFeaturesResult} */ - ({}); +ol.format.WKT.prototype.readFeatureFromText = function(text) { + var geom = this.readGeometryFromText(text); if (goog.isDef(geom)) { var feature = new ol.Feature(); feature.setGeometry(geom); - obj.features = [feature]; + return feature; } - return obj; + return null; }; /** - * Write out a geometry as a WKT string. - * @param {ol.geom.Geometry} geom The geometry to encode. - * @return {string} WKT for the geometry. + * Read all features from a WKT source. + * + * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @return {Array.} Features. + * @todo api */ -ol.parser.WKT.prototype.write = function(geom) { - return this.encode_(geom); +ol.format.WKT.prototype.readFeatures; + + +/** + * @inheritDoc + */ +ol.format.WKT.prototype.readFeaturesFromText = function(text) { + var geometries = []; + var geometry = this.readGeometryFromText(text); + if (this.splitCollection_ && + geometry.getType() == ol.geom.GeometryType.GEOMETRY_COLLECTION) { + geometries = (/** @type {ol.geom.GeometryCollection} */ (geometry)) + .getGeometriesArray(); + } else { + geometries = [geometry]; + } + var feature, features = []; + for (var i = 0, ii = geometries.length; i < ii; ++i) { + feature = new ol.Feature(); + feature.setGeometry(geometries[i]); + features.push(feature); + } + return features; }; /** - * Parse a WKT string. - * @param {string} str WKT string. - * @return {ol.geom.Geometry|undefined} Parsed geometry. + * Read a single geometry from a WKT source. + * + * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @return {ol.geom.Geometry} Geometry. + * @todo api */ -ol.parser.WKT.read = function(str) { - return ol.parser.WKT.getInstance().read(str); +ol.format.WKT.prototype.readGeometry; + + +/** + * @inheritDoc + */ +ol.format.WKT.prototype.readGeometryFromText = function(text) { + return this.parse_(text) || null; }; /** - * Write out a geometry as a WKT string. - * @param {ol.geom.Geometry} geom The geometry to encode. - * @return {string} WKT for the geometry. + * @inheritDoc */ -ol.parser.WKT.write = function(geom) { - return ol.parser.WKT.getInstance().write(geom); +ol.format.WKT.prototype.readProjectionFromText = function(text) { + return null; +}; + + +/** + * Encode a feature as a WKT string. + * + * @param {ol.Feature} feature Feature. + * @return {ArrayBuffer|Node|Object|string} Result. + * @todo api + */ +ol.format.WKT.prototype.writeFeature; + + +/** + * @inheritDoc + */ +ol.format.WKT.prototype.writeFeatureText = function(feature) { + var geometry = feature.getGeometry(); + if (goog.isDef(geometry)) { + return this.writeGeometryText(geometry); + } + return ''; +}; + + +/** + * Encode an array of features as a WKT string. + * + * @param {Array.} features Features. + * @return {ArrayBuffer|Node|Object|string} Result. + * @todo api + */ +ol.format.WKT.prototype.writeFeatures; + + +/** + * @inheritDoc + */ +ol.format.WKT.prototype.writeFeaturesText = function(features) { + if (features.length == 1) { + return this.writeFeatureText(features[0]); + } + var geometries = []; + for (var i = 0, ii = features.length; i < ii; ++i) { + geometries.push(features[i].getGeometry()); + } + var collection = new ol.geom.GeometryCollection(geometries); + return this.writeGeometryText(collection); +}; + + +/** + * Write a single geometry as a WKT string. + * + * @param {ol.geom.Geometry} geometry Geometry. + * @return {ArrayBuffer|Node|Object|string} Node. + * @todo api + */ +ol.format.WKT.prototype.writeGeometry; + + +/** + * @inheritDoc + */ +ol.format.WKT.prototype.writeGeometryText = function(geometry) { + return this.encode_(geometry); }; diff --git a/test/spec/ol/format/wktformat.test.js b/test/spec/ol/format/wktformat.test.js new file mode 100644 index 0000000000..559138e7e4 --- /dev/null +++ b/test/spec/ol/format/wktformat.test.js @@ -0,0 +1,192 @@ +goog.provide('ol.test.format.WKT'); + +describe('ol.format.WKT', function() { + + var format = new ol.format.WKT(); + + it('Point read / written correctly', function() { + var wkt = 'POINT(30 10)'; + var geom = format.readGeometry(wkt); + expect(geom.getCoordinates()).to.eql([30, 10]); + expect(format.writeGeometry(geom)).to.eql(wkt); + // test whitespace when reading + wkt = 'POINT (30 10)'; + geom = format.readGeometry(wkt); + expect(geom.getCoordinates()).to.eql([30, 10]); + }); + + it('MultiPoint read / written correctly', function() { + // there are two forms to test + var wkt = 'MULTIPOINT((10 40),(40 30),(20 20),(30 10))'; + var geom = format.readGeometry(wkt); + var points = geom.getPoints(); + expect(points.length).to.eql(4); + expect(points[0].getCoordinates()).to.eql([10, 40]); + expect(points[1].getCoordinates()).to.eql([40, 30]); + expect(points[2].getCoordinates()).to.eql([20, 20]); + expect(points[3].getCoordinates()).to.eql([30, 10]); + expect(format.writeGeometry(geom)).to.eql(wkt); + // this has whitespace + wkt = 'MULTIPOINT (10 40, 40 30, 20 20, 30 10)'; + geom = format.readGeometry(wkt); + points = geom.getPoints(); + expect(points.length).to.eql(4); + expect(points[0].getCoordinates()).to.eql([10, 40]); + expect(points[1].getCoordinates()).to.eql([40, 30]); + expect(points[2].getCoordinates()).to.eql([20, 20]); + expect(points[3].getCoordinates()).to.eql([30, 10]); + }); + + it('LineString read / written correctly', function() { + var wkt = 'LINESTRING(30 10,10 30,40 40)'; + var geom = format.readGeometry(wkt); + expect(geom.getType()).to.eql(ol.geom.GeometryType.LINE_STRING); + expect(geom.getCoordinates()).to.eql([[30, 10], [10, 30], [40, 40]]); + expect(format.writeGeometry(geom)).to.eql(wkt); + // test whitespace when reading + wkt = 'LINESTRING (30 10, 10 30, 40 40)'; + geom = format.readGeometry(wkt); + expect(geom.getType()).to.eql(ol.geom.GeometryType.LINE_STRING); + expect(geom.getCoordinates()).to.eql([[30, 10], [10, 30], [40, 40]]); + }); + + it('MultiLineString read / written correctly', function() { + var wkt = 'MULTILINESTRING((10 10,20 20,10 40),' + + '(40 40,30 30,40 20,30 10))'; + var geom = format.readGeometry(wkt); + expect(geom.getType()).to.eql(ol.geom.GeometryType.MULTI_LINE_STRING); + var linestrings = geom.getLineStrings(); + expect(linestrings.length).to.eql(2); + expect(linestrings[0].getType()).to.eql(ol.geom.GeometryType.LINE_STRING); + expect(linestrings[0].getCoordinates()).to.eql( + [[10, 10], [20, 20], [10, 40]]); + expect(format.writeGeometry(geom)).to.eql(wkt); + // test whitespace when reading + wkt = 'MULTILINESTRING ( (10 10, 20 20, 10 40), ' + + '(40 40, 30 30, 40 20, 30 10) )'; + geom = format.readGeometry(wkt); + expect(geom.getType()).to.eql(ol.geom.GeometryType.MULTI_LINE_STRING); + linestrings = geom.getLineStrings(); + expect(linestrings.length).to.eql(2); + expect(linestrings[0].getType()).to.eql( + ol.geom.GeometryType.LINE_STRING); + expect(linestrings[0].getCoordinates()).to.eql( + [[10, 10], [20, 20], [10, 40]]); + }); + + it('Polygon read / written correctly', function() { + var wkt = 'POLYGON((30 10,10 20,20 40,40 40,30 10))'; + var geom = format.readGeometry(wkt); + expect(geom.getType()).to.eql(ol.geom.GeometryType.POLYGON); + var rings = geom.getLinearRings(); + expect(rings.length).to.eql(1); + expect(rings[0].getType()).to.eql(ol.geom.GeometryType.LINEAR_RING); + expect(rings[0].getCoordinates()).to.eql( + [[30, 10], [10, 20], [20, 40], [40, 40], [30, 10]]); + expect(format.writeGeometry(geom)).to.eql(wkt); + + // note that WKT doesn't care about winding order, we do + wkt = 'POLYGON((35 10,10 20,15 40,45 45,35 10),(20 30,30 20,35 35,20 30))'; + geom = format.readGeometry(wkt); + expect(geom.getType()).to.eql(ol.geom.GeometryType.POLYGON); + rings = geom.getLinearRings(); + expect(rings.length).to.eql(2); + expect(rings[0].getType()).to.eql(ol.geom.GeometryType.LINEAR_RING); + expect(rings[1].getType()).to.eql(ol.geom.GeometryType.LINEAR_RING); + expect(rings[0].getCoordinates()).to.eql( + [[35, 10], [10, 20], [15, 40], [45, 45], [35, 10]]); + expect(rings[1].getCoordinates()).to.eql( + [[20, 30], [30, 20], [35, 35], [20, 30]]); + expect(format.writeGeometry(geom)).to.eql(wkt); + + // test whitespace when reading + wkt = 'POLYGON ( (30 10, 10 20, 20 40, 40 40, 30 10) )'; + geom = format.readGeometry(wkt); + expect(geom.getType()).to.eql(ol.geom.GeometryType.POLYGON); + rings = geom.getLinearRings(); + expect(rings.length).to.eql(1); + expect(rings[0].getType()).to.eql(ol.geom.GeometryType.LINEAR_RING); + expect(rings[0].getCoordinates()).to.eql( + [[30, 10], [10, 20], [20, 40], [40, 40], [30, 10]]); + }); + + it('MultiPolygon read / written correctly', function() { + // note that WKT doesn't care about winding order, we do + var wkt = 'MULTIPOLYGON(((40 40,45 30,20 45,40 40)),' + + '((20 35,45 20,30 5,10 10,10 30,20 35),(30 20,20 25,20 15,30 20)))'; + var geom = format.readGeometry(wkt); + expect(geom.getType()).to.eql(ol.geom.GeometryType.MULTI_POLYGON); + var polygons = geom.getPolygons(); + expect(polygons.length).to.eql(2); + expect(polygons[0].getType()).to.eql(ol.geom.GeometryType.POLYGON); + expect(polygons[1].getType()).to.eql(ol.geom.GeometryType.POLYGON); + expect(polygons[0].getLinearRings().length).to.eql(1); + expect(polygons[1].getLinearRings().length).to.eql(2); + expect(polygons[0].getLinearRings()[0].getCoordinates()).to.eql( + [[40, 40], [45, 30], [20, 45], [40, 40]]); + expect(polygons[1].getLinearRings()[0].getCoordinates()).to.eql( + [[20, 35], [45, 20], [30, 5], [10, 10], [10, 30], [20, 35]]); + expect(polygons[1].getLinearRings()[1].getCoordinates()).to.eql( + [[30, 20], [20, 25], [20, 15], [30, 20]]); + expect(format.writeGeometry(geom)).to.eql(wkt); + + // test whitespace when reading + wkt = 'MULTIPOLYGON( ( ( 40 40,45 30, 20 45 ,40 40 )) ,' + + '( (20 35, 45 20,30 5,10 10,10 30,20 35), ' + + '( 30 20, 20 25,20 15 ,30 20 ) ))'; + geom = format.readGeometry(wkt); + expect(geom.getType()).to.eql(ol.geom.GeometryType.MULTI_POLYGON); + polygons = geom.getPolygons(); + expect(polygons.length).to.eql(2); + expect(polygons[0].getType()).to.eql(ol.geom.GeometryType.POLYGON); + expect(polygons[1].getType()).to.eql(ol.geom.GeometryType.POLYGON); + expect(polygons[0].getLinearRings().length).to.eql(1); + expect(polygons[1].getLinearRings().length).to.eql(2); + expect(polygons[0].getLinearRings()[0].getCoordinates()).to.eql( + [[40, 40], [45, 30], [20, 45], [40, 40]]); + expect(polygons[1].getLinearRings()[0].getCoordinates()).to.eql( + [[20, 35], [45, 20], [30, 5], [10, 10], [10, 30], [20, 35]]); + expect(polygons[1].getLinearRings()[1].getCoordinates()).to.eql( + [[30, 20], [20, 25], [20, 15], [30, 20]]); + }); + + it('GeometryCollection read / written correctly', function() { + var wkt = 'GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))'; + var geom = format.readGeometry(wkt); + var geoms = geom.getGeometries(); + expect(geoms.length).to.eql(2); + expect(geom.getType()).to.eql(ol.geom.GeometryType.GEOMETRY_COLLECTION); + expect(geoms[0].getType()).to.eql(ol.geom.GeometryType.POINT); + expect(geoms[1].getType()).to.eql(ol.geom.GeometryType.LINE_STRING); + expect(geoms[0].getCoordinates()).to.eql([4, 6]); + expect(geoms[1].getCoordinates()).to.eql([[4, 6], [7, 10]]); + expect(format.writeGeometry(geom)).to.eql(wkt); + // test whitespace when reading + wkt = 'GEOMETRYCOLLECTION ( POINT (4 6), LINESTRING (4 6, 7 10) )'; + geom = format.readGeometry(wkt); + geoms = geom.getGeometries(); + expect(geoms.length).to.eql(2); + expect(geom.getType()).to.eql(ol.geom.GeometryType.GEOMETRY_COLLECTION); + expect(geoms[0].getType()).to.eql(ol.geom.GeometryType.POINT); + expect(geoms[1].getType()).to.eql(ol.geom.GeometryType.LINE_STRING); + expect(geoms[0].getCoordinates()).to.eql([4, 6]); + expect(geoms[1].getCoordinates()).to.eql([[4, 6], [7, 10]]); + }); + + it('GeometryCollection split / merged correctly', function() { + format = new ol.format.WKT({splitCollection: true}); + var wkt = 'GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))'; + var features = format.readFeatures(wkt); + expect(features.length).to.eql(2); + var geoms = [features[0].getGeometry(), features[1].getGeometry()]; + expect(geoms[0].getType()).to.eql(ol.geom.GeometryType.POINT); + expect(geoms[1].getType()).to.eql(ol.geom.GeometryType.LINE_STRING); + expect(geoms[0].getCoordinates()).to.eql([4, 6]); + expect(geoms[1].getCoordinates()).to.eql([[4, 6], [7, 10]]); + expect(format.writeFeatures(features)).to.eql(wkt); + }); + +}); + +goog.require('ol.geom.GeometryType'); +goog.require('ol.format.WKT');