1.比較粗糙的計算方式
計算長度
var length = lineFeature.getGeometry().getLength(); if (length > 1000) { length = length / 1000; unit = 'km'; } else { unit = 'm'; }
說明:直接使用geom的getLength方法獲取長度,openlayers默認的長度單位是m。所有如果長度大於1000,需要轉換成km。
計算面積
var area = polygonFeature.getGeometry().getArea(); if (area > 1000000) { area = area / 1000000; unit = 'km²'; } else { unit = 'm²'; }
說明:直接使用geom的getArea方法獲取面積,同理如果面積大於1000000,需要轉換為km(2)。
2.精准計算
計算長度
var sphere = new ol.Sphere(6378137);
…
var lonLatLine = lineFeature.getGeometry().transform(mapProjection, 'EPSG:4326'); var lineCoordinates = lonLatLine.getCoordinates(); var length = 0; for (var i = 0; i < lineCoordinates.length - 1; i += 1) { length += sphere.haversineDistance(lineCoordinates[i], lineCoordinates[i + 1]); } if (length > 1000) { length = length / 1000; unit = 'km'; } else { unit = 'm'; }
說明:ol.Sphere是一個地形對象,可提供計算精准長度和面積。通過實際地理形狀計算,需要把坐標轉換為對應坐標系的經緯度,調用geom的transform(projection1, projection2),把投影系1下的坐標轉化為投影系2的坐標,例如把墨卡托投影系EPSG:3857(大地坐標)下的坐標轉換為EPSG:4236投影系下的坐標(經緯度)。使用Sphere對象的haversineDistance函數計算兩個坐標之間的距離。
計算面積
var lonLatPolygon = polygonFeature.getGeometry().transform(mapProjection, 'EPSG:4326'); var area = Math.abs(sphere.geodesicArea(lonLatPolygon.getCoordinates()[0])); if (area > 1000000) { area = area / 1000000; unit = 'km²'; } else { unit = 'm²'; }
說明:其他不用再多介紹了,主要說下geodesicArea函數,它用來計算多邊形的面積,計算出來的面積有正負之分,如果多邊形是沿順時針方向畫,面積為正;否則為負。所以需要使用Math.abs求絕對值。