在项目中经常会遇到这样一个问题:在不规则多边形的中心点加一个图标。
之前的设计是,计算不规则多边形范围矩形bounds的中心点。这个比较简单,对于一些圆,矩形,凸多边形都比较适合。但是遇到凹多边形就会出现问题,比如一个月牙型的不规则多边形,bounds的中心点,就落到月牙外了。就有点难以接受了。
这个问题之前困扰我很久,今天突然看到一个名词:”重心“
问题瞬间迎刃而解!!特此记录一下
首先获得多边形的所有rings (无数个点)
1、求中心:
arcgis js 方法:
xx.geometry.getExtent().getCenter();
2、求重心:
var points =xx.geometry.rings[0];
var point =getPolygonAreaCenter(points );
function getPolygonAreaCenter(points) { var sum_x = 0; var sum_y = 0; var sum_area = 0; var p1 = points[1]; for (var i = 2; i < points.length; i++) { p2 = points[i]; area = Area(points[0], p1, p2); sum_area += area; sum_x += (points[0][0] + p1[0] + p2[0]) * area; sum_y += (points[0][1] + p1[1] + p2[1]) * area; p1 = p2; } var xx = sum_x / sum_area / 3; var yy = sum_y / sum_area / 3; return new Point(xx, yy,new SpatialReference({wkid:4326})); } function Area(p0,p1,p2) { var area = 0.0 ; area = p0[0] * p1[1] + p1[0] * p2[1] + p2[0] * p0[1] - p1[0] * p0[1] - p2[0] * p1[1] - p0[0] * p2[1]; return area / 2 ; }