zoukankan      html  css  js  c++  java
  • Openlayers 3计算长度和面积

    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求绝对值。

  • 相关阅读:
    「codeforces
    「sdoi2019
    「ABC 218」解集
    「hdu
    「atcoder
    「tricks」平凡二分幻术
    并查集
    Bellman-Ford算法 & SPFA & SPFA_DFS
    最近公共祖先(LCA)
    题解 P5751 【[NOI1999]01串】
  • 原文地址:https://www.cnblogs.com/w-wanglei/p/6538054.html
Copyright © 2011-2022 走看看