Implement setPolygons on ol.geom.MultiPolygon
This commit is contained in:
@@ -777,10 +777,6 @@ ol.format.KML.readMultiGeometry_ = function(node, objectStack) {
|
|||||||
var layout;
|
var layout;
|
||||||
/** @type {Array.<number>} */
|
/** @type {Array.<number>} */
|
||||||
var flatCoordinates;
|
var flatCoordinates;
|
||||||
/** @type {Array.<number>} */
|
|
||||||
var ends;
|
|
||||||
/** @type {Array.<Array.<number>>} */
|
|
||||||
var endss;
|
|
||||||
if (type == ol.geom.GeometryType.POINT) {
|
if (type == ol.geom.GeometryType.POINT) {
|
||||||
var point = geometries[0];
|
var point = geometries[0];
|
||||||
goog.asserts.assertInstanceof(point, ol.geom.Point);
|
goog.asserts.assertInstanceof(point, ol.geom.Point);
|
||||||
@@ -796,42 +792,12 @@ ol.format.KML.readMultiGeometry_ = function(node, objectStack) {
|
|||||||
multiPoint.setFlatCoordinates(layout, flatCoordinates);
|
multiPoint.setFlatCoordinates(layout, flatCoordinates);
|
||||||
return multiPoint;
|
return multiPoint;
|
||||||
} else if (type == ol.geom.GeometryType.LINE_STRING) {
|
} 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);
|
var multiLineString = new ol.geom.MultiLineString(null);
|
||||||
multiLineString.setFlatCoordinates(layout, flatCoordinates, ends);
|
multiLineString.setLineStrings(geometries);
|
||||||
return multiLineString;
|
return multiLineString;
|
||||||
} else if (type == ol.geom.GeometryType.POLYGON) {
|
} 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);
|
var multiPolygon = new ol.geom.MultiPolygon(null);
|
||||||
multiPolygon.setFlatCoordinates(layout, flatCoordinates, endss);
|
multiPolygon.setPolygons(geometries);
|
||||||
return multiPolygon;
|
return multiPolygon;
|
||||||
} else if (type == ol.geom.GeometryType.GEOMETRY_COLLECTION) {
|
} else if (type == ol.geom.GeometryType.GEOMETRY_COLLECTION) {
|
||||||
return new ol.geom.GeometryCollection(geometries);
|
return new ol.geom.GeometryCollection(geometries);
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
goog.provide('ol.geom.MultiPolygon');
|
goog.provide('ol.geom.MultiPolygon');
|
||||||
|
|
||||||
|
goog.require('goog.array');
|
||||||
|
goog.require('goog.asserts');
|
||||||
goog.require('ol.extent');
|
goog.require('ol.extent');
|
||||||
goog.require('ol.geom.GeometryType');
|
goog.require('ol.geom.GeometryType');
|
||||||
goog.require('ol.geom.Polygon');
|
goog.require('ol.geom.Polygon');
|
||||||
@@ -258,3 +260,33 @@ ol.geom.MultiPolygon.prototype.setFlatCoordinates =
|
|||||||
this.endss_ = endss;
|
this.endss_ = endss;
|
||||||
this.dispatchChangeEvent();
|
this.dispatchChangeEvent();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Array.<ol.geom.Polygon>} 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);
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user