diff --git a/src/ol/format/kmlformat.js b/src/ol/format/kmlformat.js index e97b39e713..8681ba651e 100644 --- a/src/ol/format/kmlformat.js +++ b/src/ol/format/kmlformat.js @@ -777,10 +777,6 @@ ol.format.KML.readMultiGeometry_ = function(node, objectStack) { var layout; /** @type {Array.} */ var flatCoordinates; - /** @type {Array.} */ - var ends; - /** @type {Array.>} */ - var endss; if (type == ol.geom.GeometryType.POINT) { var point = geometries[0]; goog.asserts.assertInstanceof(point, ol.geom.Point); @@ -796,42 +792,12 @@ ol.format.KML.readMultiGeometry_ = function(node, objectStack) { multiPoint.setFlatCoordinates(layout, flatCoordinates); return multiPoint; } else if (type == ol.geom.GeometryType.LINE_STRING) { - var lineString = geometries[0]; - goog.asserts.assertInstanceof(lineString, ol.geom.LineString); - layout = lineString.getLayout(); - flatCoordinates = lineString.getFlatCoordinates(); - ends = [flatCoordinates.length]; - for (i = 1, ii = geometries.length; i < ii; ++i) { - geometry = geometries[i]; - goog.asserts.assertInstanceof(geometry, ol.geom.LineString); - goog.asserts.assert(geometry.getLayout() == layout); - goog.array.extend(flatCoordinates, geometry.getFlatCoordinates()); - ends.push(flatCoordinates.length); - } var multiLineString = new ol.geom.MultiLineString(null); - multiLineString.setFlatCoordinates(layout, flatCoordinates, ends); + multiLineString.setLineStrings(geometries); return multiLineString; } else if (type == ol.geom.GeometryType.POLYGON) { - var polygon = geometries[0]; - goog.asserts.assertInstanceof(polygon, ol.geom.Polygon); - layout = polygon.getLayout(); - flatCoordinates = polygon.getFlatCoordinates(); - endss = [polygon.getEnds()]; - for (i = 1, ii = geometries.length; i < ii; ++i) { - geometry = geometries[i]; - goog.asserts.assertInstanceof(geometry, ol.geom.Polygon); - goog.asserts.assert(geometry.getLayout() == layout); - var offset = flatCoordinates.length; - ends = geometry.getEnds(); - var j, jj; - for (j = 0, jj = ends.length; j < jj; ++j) { - ends[j] += offset; - } - goog.array.extend(flatCoordinates, geometry.getFlatCoordinates()); - endss.push(ends); - } var multiPolygon = new ol.geom.MultiPolygon(null); - multiPolygon.setFlatCoordinates(layout, flatCoordinates, endss); + multiPolygon.setPolygons(geometries); return multiPolygon; } else if (type == ol.geom.GeometryType.GEOMETRY_COLLECTION) { return new ol.geom.GeometryCollection(geometries); diff --git a/src/ol/geom/multipolygon.js b/src/ol/geom/multipolygon.js index 21d2ce6049..b2be17ca30 100644 --- a/src/ol/geom/multipolygon.js +++ b/src/ol/geom/multipolygon.js @@ -1,5 +1,7 @@ goog.provide('ol.geom.MultiPolygon'); +goog.require('goog.array'); +goog.require('goog.asserts'); goog.require('ol.extent'); goog.require('ol.geom.GeometryType'); goog.require('ol.geom.Polygon'); @@ -258,3 +260,33 @@ ol.geom.MultiPolygon.prototype.setFlatCoordinates = this.endss_ = endss; this.dispatchChangeEvent(); }; + + +/** + * @param {Array.} polygons Polygons. + * @todo stability experimental + */ +ol.geom.MultiPolygon.prototype.setPolygons = function(polygons) { + var layout = ol.geom.GeometryLayout.XY; + var flatCoordinates = []; + var endss = []; + var i, ii, ends; + for (i = 0, ii = polygons.length; i < ii; ++i) { + var polygon = polygons[i]; + if (i === 0) { + layout = polygon.getLayout(); + } else { + // FIXME better handle the case of non-matching layouts + goog.asserts.assert(polygon.getLayout() == layout); + } + var offset = flatCoordinates.length; + ends = polygon.getEnds(); + var j, jj; + for (j = 0, jj = ends.length; j < jj; ++j) { + ends[j] += offset; + } + goog.array.extend(flatCoordinates, polygon.getFlatCoordinates()); + endss.push(ends); + } + this.setFlatCoordinates(layout, flatCoordinates, endss); +};