• 0
  • 0

计算多个经纬度点包围的封闭多边形面积

2022-02-18 402 0 admin 所属分类:经验分享

1.高德JSAPI实现

引入高德接口

<script type="text/javascript" src="/uploads/20220218/bb002f7374bba0c91cea62377af96560.png"></script>

初始化坐标点数组 格式如

var pos = [[lng1,lat1],[lng2,lat2],[lng3,lat3]]
//返回单位为平方米 转化为平方公里需要初以1000000
var area = AMap.GeometryUtil.ringArea(pos);
var range = parseInt(area/1000000)+'平方公里';

2.调用网上大佬的实现函数

https://blog.csdn.net/wennjie1/article/details/73481308

function computeSignedArea(path) {
        //传入path:{[{lat:,lng:}],[{lat:,lng:}],[{lat:,lng:}]}
        let radius= 6371009
        let len = path.length;
        if (len < 3) return 0; 
        let total = 0;
        let  prev = path[len - 1];
        let prevTanLat = Math.tan(((Math.PI / 2 - prev.lat/180*Math.PI) / 2));
        let prevLng = (prev.lng)/180*Math.PI;
        for (let i=0;i< len;i++) {
            let tanLat = Math.tan((Math.PI / 2 -
                (path[i].lat)/180*Math.PI) / 2);
            let lng = (path[i].lng)/180*Math.PI;
            total += polarTriangleArea(tanLat, lng, prevTanLat, prevLng);
            prevTanLat = tanLat;
            prevLng = lng;
        }
        return Math.abs(total * (radius * radius));
    }
    function polarTriangleArea(tan1,lng1,tan2,lng2) {
            let deltaLng = lng1 - lng2;
            let t = tan1 * tan2;
            return 2 * Math.atan2(t * Math.sin(deltaLng), 1 + t * Math.cos(deltaLng));
    }
console.log('网上函数计算结果:'+(computeSignedArea(pos) / 1000000))

php 实现

function computeSignedArea($path)
{
    //传入path:{[{lat:,lng:}],[{lat:,lng:}],[{lat:,lng:}]}
    $radius = 6371009;
    $len = count($path);
    if ($len < 3) return 0;
    $total = 0;
    $prev = $path[$len - 1];
    $prevTanLat = tan(((M_PI / 2 - $prev['lat'] / 180 * M_PI) / 2));
    $prevLng = ($prev['lng']) / 180 * M_PI;
    for ($i = 0; $i < $len; $i++) {
        $tanLat = tan((M_PI / 2 - ($path[$i]['lat']) / 180 * M_PI) / 2);
        $lng = ($path[$i]['lng']) / 180 * M_PI;
        $total += polarTriangleArea($tanLat, $lng, $prevTanLat, $prevLng);
        $prevTanLat = $tanLat;
        $prevLng = $lng;
    }
    return abs($total * ($radius * $radius));
}
function polarTriangleArea($tan1, $lng1, $tan2, $lng2)
{
    $deltaLng = $lng1 - $lng2;
    $t = $tan1 * $tan2;
    return 2 * atan2($t * sin($deltaLng), 1 + $t * cos($deltaLng));
}
dd(computeSignedArea($path) / 1000000);


返回顶部