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

You may also like...