根据经纬度计算多边形面积

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <script src="data.js"></script>
    <title>Document</title>
</head>
<body>

</body>
<script>
  var s = "112.523197631836,37.868892669677734;112.5170669555664,37.8605842590332;112.52099609375,37.849857330322266;112.54137420654297,37.8512732521875;112.5351180302734,37.858699798583984";
  console.log(computeSignedArea(cvpath(s)))
  function cvpath(s) {
    let path = s.split(';').map(item => {
      return {
        lng: item.split(',')[0]/1,
        lat: item.split(',')[1]/1
      }
    })
    return path
  }
  function computeSignedArea(path) {
    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 in path) {
      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))
  }
</script>
</html>
<script>
  var earthRadiusMeters = 6371000.0;
  var metersPerDegree = 2.0 * Math.PI * earthRadiusMeters / 360.0;
  var radiansPerDegree = Math.PI / 180.0;
  var degreesPerRadian = 180.0 / Math.PI;
  var pointArr=[]
let d=data
  console.log(d)
  b(data)
  function calculateArea(points) {
    if (points.length > 2) {
      var areaMeters2 = PlanarPolygonAreaMeters2(points);
      // if (areaMeters2 > 1000000.0) {
        areaMeters2 = SphericalPolygonAreaMeters2(points);
        alert("面积为" + areaMeters2 + "平方米");
      // }
    }
  }
  function b() {
     var s = "112.523197631836,37.868892669677734;112.5170669555664,37.8605842590332;112.52099609375,37.849857330322266;112.54137420654297,37.8512732521875;112.5351180302734,37.858699798583984";
    //  let s=data
    var s1 = new Array()
    s1 = s.split(";");
    for (var i = 0; i < s1.length; i++) {
      var ss = s1[i];
      var temp = ss.split(",");
      var point = new Array();
      point.push(Number(temp[0]), Number(temp[1]));
      pointArr.push(point);
    }
    calculateArea(pointArr);
  }
  /*球面多边形面积计算*/
  function SphericalPolygonAreaMeters2(points) {
    var totalAngle = 0;
    for (var i = 0; i < points.length; i++) {
      var j = (i + 1) % points.length;
      var k = (i + 2) % points.length;
      totalAngle += Angle(points[i], points[j], points[k]);
    }
    var planarTotalAngle = (points.length - 2) * 180.0;
    var sphericalExcess = totalAngle - planarTotalAngle;
    if (sphericalExcess > 420.0) {
      totalAngle = points.length * 360.0 - totalAngle;
      sphericalExcess = totalAngle - planarTotalAngle;
    } else if (sphericalExcess > 300.0 && sphericalExcess < 420.0) {
      sphericalExcess = Math.abs(360.0 - sphericalExcess);
    }
    return sphericalExcess * radiansPerDegree * earthRadiusMeters * earthRadiusMeters;
  }

  /*角度*/
  function Angle(p1, p2, p3) {
    var bearing21 = Bearing(p2, p1);
    var bearing23 = Bearing(p2, p3);
    var angle = bearing21 - bearing23;
    if (angle < 0) {
      angle += 360;
    }
    return angle;
  }


  /*方向*/
  function Bearing(from, to) {
    var lat1 = from[1] * radiansPerDegree;
    var lon1 = from[0] * radiansPerDegree;
    var lat2 = to[1] * radiansPerDegree;
    var lon2 = to[0] * radiansPerDegree;
    var angle = -Math.atan2(Math.sin(lon1 - lon2) * Math.cos(lat2), Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2));
    if (angle < 0) {
      angle += Math.PI * 2.0;
    }
    angle = angle * degreesPerRadian;
    return angle;
  }

  /*平面多边形面积*/
  function PlanarPolygonAreaMeters2(points) {
    var a = 0;
    for (var i = 0; i < points.length; ++i) {
      var j = (i + 1) % points.length;
      var xi = points[i][0] * metersPerDegree * Math.cos(points[i][1] * radiansPerDegree);
      var yi = points[i][1] * metersPerDegree;
      var xj = points[j][0] * metersPerDegree * Math.cos(points[j][1] * radiansPerDegree);
      var yj = points[j][1] * metersPerDegree;
      a += xi * yj - xj * yi;
    }
    return Math.abs(a / 2);
  }



</script>

有想换工作的同学可以找我内推哦不低于15k(前端,java,测试)

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值