diff --git a/lib/OpenLayers/Geometry/LinearRing.js b/lib/OpenLayers/Geometry/LinearRing.js index 0a717aabe6..d94448ca6c 100644 --- a/lib/OpenLayers/Geometry/LinearRing.js +++ b/lib/OpenLayers/Geometry/LinearRing.js @@ -198,15 +198,23 @@ OpenLayers.Geometry.LinearRing = OpenLayers.Class( } else if (len > 2) { var sumX = 0.0; var sumY = 0.0; - for (var i = 0; i < this.components.length - 1; i++) { + var averX = 0.0; + var averY = 0.0; + for (var i = 0; i < len; i++) { + averX += this.components[i].x; + averY += this.components[i].y; + } + averX = averX / len; + averY = averY / len; + for (var i = 0; i < len - 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); + sumX += (b.x + c.x - 2 * averX) * ((b.x - averX) * (c.y - averY) - (c.x - averX) * (b.y - averY)); + sumY += (b.y + c.y - 2 * averY) * ((b.x - averX) * (c.y - averY) - (c.x - averX) * (b.y - averY)); } var area = -1 * this.getArea(); - var x = sumX / (6 * area); - var y = sumY / (6 * area); + var x = averX + sumX / (6 * area); + var y = averY + sumY / (6 * area); return new OpenLayers.Geometry.Point(x, y); } else { return null;