openlayer的测量面积公式的改进
目录
问题来源:
首先要注意到Polygon内可能含有内部线性环,所以在计算时需要减去环的面积,同时也会有MultiPolygon的存在。所以对之前的公式进行修改。
公式代码:
formatArea: function(polygon) {
var wgs84Sphere = new ol.Sphere(6362790); //6378137,取该值为了跟sql对应6362789.8747
if(polygon instanceof ol.geom.Polygon){ //单
var coordinates = polygon.getLinearRing(0).getCoordinates();
var area = Math.abs(wgs84Sphere.geodesicArea(coordinates));
var len = polygon.getLinearRingCount();
if(len>1){ //有内部环
for(var i =1;i<len;i++){
var temp = Math.abs(wgs84Sphere.geodesicArea(polygon.getLinearRing(i).getCoordinates()));
area -= temp;
}
}
return (area * 0.0015).toFixed(6) + ' ' + '亩(mu)';
}else{ //多
var polygons =polygon.getPolygons();
var area = 0;
for(var i=0,len=polygons.length;i<len;i++){
var coordinates = polygons[i].getLinearRing(0).getCoordinates();
area+= Math.abs(wgs84Sphere.geodesicArea(coordinates));
var temp = polygons[i].getLinearRingCount();
if(temp>1){ //有内部环
for(var j =1;j<temp;j++){
area -= Math.abs(wgs84Sphere.geodesicArea(polygons[i].getLinearRing(j).getCoordinates()));
}
}
}
return (area * 0.0015).toFixed(6) + ' ' + '亩(mu)';
}
},
补充:
要注意的误区是,有人可能贪方便,直接用getArea来处理,但由于单位为°,所以几何实体的的面积单位也会变成度的平方,这时或许有人想借助每度平均对应的米来生成真实面积,但大家要注意一个问题,每个纬度都不一样,对于精细测量,这个做法由于误差太大而偏差过多,所以只能通过球体解决。
转载自:https://blog.csdn.net/u013323965/article/details/52885143