应为业务需要,需要紧急做一个计算面积的功能。
写了一个简单的demo,然后一测试,崩溃了。
计算多边形大量负数/天文数字面积我也忍了。毕竟多边形难计算。
可是我画个直角三角形,再多个点补充为矩形面积会变小是什么意思?
好吧,我忍,可我画个三角形,面积会是负数,我无语了啊。我哭了啊。
相关的测试代码大概是这样的
map.centerAndZoom(point, 22);
map.addEventListener('click',function(e){
var point=new BMap.Point(e.point.lng,e.point.lat);
points.push(point);
polygon.setPath(points);
area=BMapLib.GeoUtils.getPolygonArea(points);
$('#area').html(area.toFixed(0)+'平方米')
})
好吧,继续找有没有算面积的代码,谁叫我算法差呢。
1
Septembers 2015-04-19 01:13:30 +08:00 via Android
百度已经有很多API和文档对不上了
|
2
sumhat 2015-04-19 02:48:27 +08:00
从算法来说,算出来负数应该是向量方向搞错了,你在添加顶点的时候按顺序来,可能可以避免这类问题。不过多边形面积是向量类的基础算法了,能写错也真是丢脸。
|
3
xiaofami 2015-04-19 06:14:29 +08:00 via Android
QGIS是开源的,可以参考一下面积算法。
|
4
laoyuan 2015-04-19 08:07:48 +08:00
关键就是按顺序来,按逆时针顺序应该就可以了
|
5
jarlyyn OP |
6
dingyaguang117 2015-04-19 14:24:24 +08:00
多边形面积先顶点排序,然后分割三角形算一下加起来就是了吧
|
7
jarlyyn OP 精度问题是因为纬度和米的换算的误差造成的。
具体可以使用 http://tech.meituan.com/lucene-distance.html 中4.2的方法。 以地一个点为原点,把每个点换算一下,再计算面积。 大概是这样的js var convertPoint=function(point,point0) { var result={} var dx=point.lng-point0.lng; var dy=point.lat-point0.lat; b=(point.lat+point0.lat)/2; result.lat=degreeToRad(dy); result.lng=degreeToRad(dx)*Math.cos(degreeToRad(b)); return result; } |