diff --git a/lib/OpenLayers/Geometry/LinearRing.js b/lib/OpenLayers/Geometry/LinearRing.js index 4c5450e82d..0a717aabe6 100644 --- a/lib/OpenLayers/Geometry/LinearRing.js +++ b/lib/OpenLayers/Geometry/LinearRing.js @@ -191,21 +191,26 @@ OpenLayers.Geometry.LinearRing = OpenLayers.Class( * {} The centroid of the collection */ getCentroid: function() { - if (this.components && (this.components.length > 2)) { - var sumX = 0.0; - var sumY = 0.0; - for (var i = 0; i < this.components.length - 1; i++) { - var b = this.components[i]; - var c = this.components[i+1]; - sumX += (b.x + c.x) * (b.x * c.y - c.x * b.y); - sumY += (b.y + c.y) * (b.x * c.y - c.x * b.y); + if (this.components) { + var len = this.components.length; + if (len > 0 && len <= 2) { + return this.components[0].clone(); + } else if (len > 2) { + var sumX = 0.0; + var sumY = 0.0; + for (var i = 0; i < this.components.length - 1; i++) { + var b = this.components[i]; + var c = this.components[i+1]; + sumX += (b.x + c.x) * (b.x * c.y - c.x * b.y); + sumY += (b.y + c.y) * (b.x * c.y - c.x * b.y); + } + var area = -1 * this.getArea(); + var x = sumX / (6 * area); + var y = sumY / (6 * area); + return new OpenLayers.Geometry.Point(x, y); + } else { + return null; } - var area = -1 * this.getArea(); - var x = sumX / (6 * area); - var y = sumY / (6 * area); - return new OpenLayers.Geometry.Point(x, y); - } else { - return null; } }, diff --git a/tests/Geometry/Polygon.html b/tests/Geometry/Polygon.html index 9f5cd95358..e28484d36e 100644 --- a/tests/Geometry/Polygon.html +++ b/tests/Geometry/Polygon.html @@ -385,6 +385,20 @@ t.ok(geodesicErr < planarErr, "geodesic measure is better (" + geodesicErr.toFixed(3) + " vs. " + planarErr.toFixed(3) + ")"); } + + function testGetCentroid(t) { + t.plan(4); + var bounds = new OpenLayers.Bounds(5, 10, 5, 10); + var geometry = bounds.toGeometry(); + var centroid = geometry.getCentroid(); + t.eq(geometry.components[0].components.length, 2, "only two vertices since the box has left=right and bottom=top"); + t.ok(centroid && centroid.x === 5 && centroid.y === 10, "getCentroid returns a point geometry even if the ring of the polygon has only 2 vertices"); + bounds = new OpenLayers.Bounds(0, 0, 10, 10); + geometry = bounds.toGeometry(); + centroid = geometry.getCentroid(); + t.eq(geometry.components[0].components.length, 5, "five vertices expected"); + t.ok(centroid && centroid.x === 5 && centroid.y === 5, "getCentroid returns the correct point geometry"); + }