diff --git a/src/layer/vector/MultiPoly.js b/src/layer/vector/MultiPoly.js index 8e88bc07767..fbcfd50fb27 100644 --- a/src/layer/vector/MultiPoly.js +++ b/src/layer/vector/MultiPoly.js @@ -47,6 +47,22 @@ L.MultiPolyline = createMulti(L.Polyline); L.MultiPolygon = createMulti(L.Polygon); + L.MultiPolygon.prototype.getCenter = function () { + var bestCenter, + minArea = Infinity; + + this.eachLayer(function(layer) { + var center = layer.getCenter(); + + if (center.area < minArea) { + minArea = center.area; + bestCenter = center; + } + }); + + return bestCenter; + }; + L.multiPolyline = function (latlngs, options) { return new L.MultiPolyline(latlngs, options); }; diff --git a/src/layer/vector/Path.Popup.js b/src/layer/vector/Path.Popup.js index b09620252ef..3707769d4c8 100644 --- a/src/layer/vector/Path.Popup.js +++ b/src/layer/vector/Path.Popup.js @@ -42,7 +42,7 @@ L.Path.include({ if (this._popup) { // open the popup from one of the path's points if not specified - latlng = latlng || this._latlng || + latlng = latlng || this._latlng || this.getCenter ? this.getCenter() : this._latlngs[Math.floor(this._latlngs.length / 2)]; this._openPopup({latlng: latlng}); diff --git a/src/layer/vector/Polygon.js b/src/layer/vector/Polygon.js index 5fd5dd40e19..bdea9b965f3 100644 --- a/src/layer/vector/Polygon.js +++ b/src/layer/vector/Polygon.js @@ -63,6 +63,26 @@ L.Polygon = L.Polyline.extend({ } }, + getCenter: function () { + var latlngs = this._latlngs, + len = latlngs.length, + i, j, p1, p2, f, center; + + for (i = 0, j = len - 1, area = 0, lat = 0, lng = 0; i < len; j = i++) { + p1 = latlngs[i]; + p2 = latlngs[j]; + f = p1.lat * p2.lng - p2.lat * p1.lng; + lat += (p1.lat + p2.lat) * f; + lng += (p1.lng + p2.lng) * f; + area += f / 2; + } + + center = area ? new L.LatLng(lat / (6 * area), lng / (6 * area)) : latlngs[0]; + center.area = area; + + return center; + }, + _clipPoints: function () { var points = this._originalPoints, newParts = [];