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