Skip to content

Commit

Permalink
add Polygon and MultiPolygon getCenter
Browse files Browse the repository at this point in the history
  • Loading branch information
mourner committed Oct 15, 2013
1 parent 1a3b150 commit 88ad667
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 1 deletion.
16 changes: 16 additions & 0 deletions src/layer/vector/MultiPoly.js
Expand Up @@ -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);
};
Expand Down
2 changes: 1 addition & 1 deletion src/layer/vector/Path.Popup.js
Expand Up @@ -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});
Expand Down
20 changes: 20 additions & 0 deletions src/layer/vector/Polygon.js
Expand Up @@ -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 = [];
Expand Down

0 comments on commit 88ad667

Please sign in to comment.