经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
百度地图 - 基础学习(7): 折线构成闭合图形面积计算
来源:cnblogs  作者:玄戈营第九骑兵队  时间:2021/1/11 9:34:46  对本文有异议

前面  GeoUtils 类可以很好的计算密闭多边形、矩形框出的区域面积,但没有解决折线自相交框出的区域面积计算,这就需要开发人员自己去解决了。

度娘了几篇文章,最终找到了一个计算方法,经实测效果不错,结果也比较精准。

  1. // 计算图形面积
  2. // path:[{lat:,lng:}],[{lat:,lng:}],[{lat:,lng:}] 路劲坐标点数组
  3. computeSignedArea(path) {
  4. let radius = 6370996.81; // 地球平均半径
  5. let len = path.length;
  6. if (len < 3) return 0;
  7. let total = 0;
  8. let prev = path[len - 1];
  9. let prevTanLat = Math.tan((Math.PI / 2 - (prev.lat / 180) * Math.PI) / 2);
  10. let prevLng = (prev.lng / 180) * Math.PI;
  11. for (let i = 0; i < len; i++) {
  12. let tanLat = Math.tan(
  13. (Math.PI / 2 - (path[i].lat / 180) * Math.PI) / 2
  14. );
  15. let lng = (path[i].lng / 180) * Math.PI;
  16. total += this.polarTriangleArea(tanLat, lng, prevTanLat, prevLng);
  17. prevTanLat = tanLat;
  18. prevLng = lng;
  19. }
  20. return Math.abs(total * (radius * radius));
  21. },
  22. // 计算图形面积
  23. polarTriangleArea(tan1, lng1, tan2, lng2) {
  24. let deltaLng = lng1 - lng2;
  25. let t = tan1 * tan2;
  26. return 2 * Math.atan2(t * Math.sin(deltaLng), 1 + t * Math.cos(deltaLng));
  27. }

 

方法使用也比较简单,直接将自相交折线 各个点的坐标组成一个数组,传入 computeSignedArea(path) 就行。

由于方法返回的面积是以平方米作为单位的,所以需要处理下(毕竟地图区域那么大,以平方米计算,数字显得很大,但区域却不见得有多大。故用平方千米作为单位,以此来和我大中国960万平方千米比较,显得你这个区域有多大点)

  1. geoUtilsValue = that.computeSignedArea(overlayList) / 1000000 + "平方千米";

 

参考博文链接:https://blog.csdn.net/qq_38615014/article/details/89207005

原文链接:http://www.cnblogs.com/dihong/p/14242552.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号