根据经纬度计算多边形面积_one.dream的博客-程序员秘密

技术标签: 业务代码  

<!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,测试)

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44472722/article/details/107047923

智能推荐

阿里云OCR身份证信息识别_、凉兮的博客-程序员秘密

阿里云OCR身份证信息识别这里使用的是base64public JSONObject getCard(MultipartFile file) { String host = "https://ccic.market.alicloudapi.com"; String path = "/discern/idcard"; String method =...

自监督、半监督、无监督学习,傻傻分不清楚?最新综述来帮你!_我爱计算机视觉的博客-程序员秘密

点击我爱计算机视觉标星,更快获取CVML新技术推荐给大家一篇昨天arXiv新出的论文 :A survey on Semi-, Self- and Unsupervised Techniq...

java中的枚举类型学习_weixin_34293902的博客-程序员秘密

枚举,在java中看似很小的一部分,却帮我们解决了很多大问题。为什么使用枚举我们知道生活中的很多地方都可以使用枚举,但是很多人在实际编程的时候却很少使用枚举类型,是因为枚举类型不好用吗?我认为不是的,而是他们并不了解枚举。这也是我之前的状态。不使用枚举,对status(状态)等一些数目有限的对象,我们通常会使用静态常量的形式来表示,...

URLRequest 的一个实例_国wei 778的博客-程序员秘密

URLRequest 的一个实例[html] view plaincopy// Create the request.  //所构建的NSURLRequest具有一个依赖于缓存响应的特定策略,cachePolicy取得策略,timeoutInterval取得超时值  NSURLRequest *theRequest=[NSURLReq

SDL游戏开发之二-配置开发环境_sdl2tth库怎么配置环境_小牛_牛sky的博客-程序员秘密

一般情况下,在任何一个计算机语言中要使用第三方功能时,都需要配置环境,SDL同样如此。在我一开始学习的时候对环境配置是深恶痛绝的,稍微出错都会影响学习积极性。但不得不承认,环境的配置一般都是第一件要做的事。一.为什么要进行环境配置?以c/c++为例,所谓的环境配置就是配置头文件和库文件的目录。因为我们在自己的代码中要使用第三方所提供的API(简单地说,API就是各种函数,比如c/c++...

Flash AS3 常见编程错误 中文解释+举例【转】_熊若宫的博客-程序员秘密

1000对 _ 的引用不明确。引用可能指向多项。例如,下面使用了 rss 和 xml 命名空间。每个命名空间为 hello() 函数定义了不同的值。trace(hello()) 语句返回此错误,因为它无法确定使用哪个命名空间。private namespace rss; private namespace xml;    public function ErrorExample

随便推点

(4.5.6)Android 代码覆盖率工具使用_fei20121106的博客-程序员秘密

前言Android 开发统计代码覆盖率,在之前的老版本中,需要借助第三方工具,在现在的新版本中,只要使用JaCoCo插件,就可以完成简单覆盖率测试。与 Espresso 框架结合,进行覆盖率测试Android SDK 现在已经内置了对 Emma Test Coverage框架的支持,可以在官方文档中进行查阅。 具体由 JaCoCo 工具进行覆盖率相关内容。 1.1

【English】 April English_Lucky-肥仔的博客-程序员秘密

在四月的季节了,我又开始了英语的学习,相比较以前,从心态上我似乎更加的重视了英语。也许不同时期,每一个人的心态也会不一样吧。看到了十期的师哥师姐都如此如火如荼的学习着英语,自己从内心中更不想落下。           四月的这几天,自己慢慢的熟悉着AJ材料,重新听了AJ老师的七个原则,这些原则都是听AJ材料的指导思想,米老师经常说:你相信他,又不按照他说的做。这就是我常常犯的毛病。所以我们

MoveFileEx 的MOVEFILE_DELAY_UNTIL_REBOOT 标志的用法!_lbird的博客-程序员秘密

该标志一般由安装程序使用,比如你想安装新的驱动程序时,由于旧的驱动程序仍被系统使用而无法删除或覆盖它。在这种情况下,安装程序可以把新的驱动程序拷贝到一个临时的目录中,然后用MOVEFILE_DELAY_UNTIL_REBOOT标志调用MoveFileEx,。当系统重启后,系统就在启动之前用新的驱动程序代替旧的驱动程序。因为该标志可以用来在重启后覆盖一个文件。        它还可以在重启后

yii报错及bug修复:Yii与vue交互 No 'Access-Control-Allow-Origin' header is present on...._猿学的博客-程序员秘密

在后端该controller里申明public function behaviors(){ return ArrayHelper::merge([ [ 'class' =&amp;gt; Cors::className(), 'cors' =&amp;gt; [ ...

selenium 之Ran 0 tests in 0.000s_weixin_30437481的博客-程序员秘密

from selenium import webdriverfrom time import ctime,sleepimport unittestclass TestLogin(unittest.TestCase): def setUp(self): self.driver = webdriver.Ie() # driver.implicitly_wait(10)...

推荐文章

热门文章

相关标签