天地图如何获取多边形面积

目录

一、初始化地图

二、创建polygonTool

 三、多边形获取面积

​四、完整代码(包括添加点、添加面、编辑面、获取面积)


项目中提出在地图上绘制面并获取面积,如何实现?

在天地图官网的JavaScript API 中,链接如下:

天地图JavaScript API

能看到Polygon并没有提供测量面的工具,这里需要使用polygonTool类。

一、初始化地图

map = new T.Map('mapDiv',);

// var lnglat = new T.LngLat(jshjData[0].lng,jshjData[0].lat)
var lnglat = new T.LngLat(115.79251,28.93511)
// var lnglat = new T.LngLat(80.41150304634095,80.44935513895808)

map.centerAndZoom(lnglat,17);



//隐藏天地图Logo
document.getElementsByClassName("tdt-control-copyright tdt-control")[0].style.display = 'none';

二、创建polygonTool

        //开始绘制
        function startDraw(isToolArea) {
            if (handler){
                handler.close();
            }
            if (isToolArea){
                var config = {
                    showLabel: true,
                    color: "blue", weight: 3, opacity: 0.5, fillColor: "#FFFFFF", fillOpacity: 0.5
                };
                //创建标注工具对象
                handler = new T.PolygonTool(map, config);
            }else {
                handler = new T.PolygonTool(map);

            }
            handler.open();

            //长按结束事件
            handler.addEventListener('draw', ()=>{
                dataList = handler.getPolygons()[0].ht[0];
                //绘制完成后获取绘制面的坐标点
                console.log(dataList);
                //获取绘制面的面积
                console.log(handler.getArea(dataList))

            });
        }

运行结果:

双击结束,控制台打印面积:

 三、多边形获取面积

 polygonTool是用鼠标绘制的多边形,用handler.getArea(arrays) ,其中arrays是多边形每个点的经纬度组成的数组,就可以获取到已知经纬度的面积。代码如下:

function addPolygonGetAreaFn(){
            //polyon不能直接测量面积,需要初始化标注工具。
            var config = {
                showLabel: true,
                color: "blue", weight: 3, opacity: 0.5, fillColor: "#FFFFFF", fillOpacity: 0.5
            };
            //创建标注工具对象
            handler = new T.PolygonTool(map, config);


            //添加面
            let array = [
                {lat: 28.93556, lng: 115.79179},
                {lat: 28.93445, lng: 115.79303},
                {lat: 28.93401, lng: 115.79102}
            ];

            var points = [];
            array.forEach((v,k)=>{
                points.push(new T.LngLat(v.lng,v.lat));

            })
            //创建面对象
            polygon = new T.Polygon(points,{
                color: "blue", weight: 3, opacity: 0.5, fillColor: "#FFFFFF", fillOpacity: 0.5
            });
            //向地图上添加面
            map.addOverLay(polygon);

            //获取面积
            console.log(handler.getArea(polygon.getLngLats()[0]))
        }

 四、完整代码(包括添加点、添加面、编辑面、获取面积)

其中jquery.min.js需要引用本地或者线上,如

<script src="https://cdn.jsdelivr.net/npm/jquery"></script>

其二,密钥需要在天地图官网进行申请。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="../../js/jquery.min.js"></script>

    <script type="text/javascript" src="https://api.tianditu.gov.cn/api?v=4.0&tk=您的密钥"></script>
    <style>
        .page{
            width: 100%;
            height: 100vh;
            display: flex;
        }
        .page #mapDiv{
            width: 70%;
            height: 70%;
        }
        .page .buttonCon{
            margin-left: 50px;
        }
        .page .buttonCon .button{
            font-size: 18px;
            padding: 7px 15px;
            border: 1px solid #4bacee;
            border-radius: 10px;
            margin-bottom: 30px;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div class="page">
        <div id="mapDiv"></div>
        <div class="buttonCon">
            <div class="button" onclick="addPolygonGetAreaFn()">添加面</div>
            <div class="button" onclick="startDraw(false)">绘制面(不带面积)</div>
            <div class="button" onclick="startDraw(true)">绘制面(带面积)</div>

            <div class="button editButton" onclick="editPolygonFn()">编辑绘制面</div>
            <div class="button" onclick="getPolygonFn()">获取面的坐标点</div>

            <div class="button addButton" onclick="addMarker()">增加点</div>
            <div class="button editButton" onclick="editMarker()" style="display: none">修改点</div>

        </div>

    </div>
    <script>
        var map;
        var polygon;
        var handler;
        //绘制面的坐标点集合
        var dataList;
        getMap()


        //地图
        function getMap(){
            // map=new T.Map('mapDiv');
            var lay;
          
            //初始化地图对象
            map = new T.Map('mapDiv');


            // var lnglat = new T.LngLat(jshjData[0].lng,jshjData[0].lat)
            var lnglat = new T.LngLat(115.79251,28.93511)
            // var lnglat = new T.LngLat(80.41150304634095,80.44935513895808)

            map.centerAndZoom(lnglat,17);

            document.getElementsByClassName("tdt-control-copyright tdt-control")[0].style.display = 'none';


        }

        //地图点击事件
        map.addEventListener("click",function (e){
            // console.log(e)
        });

        //添加面
        function addPolygonFn(pointsArr){



            // var points = [];
            // pointsArr.forEach((v,k)=>{
            //     points.push(new T.LngLat(v.lng,v.lat));
            //
            // })
            // //创建面对象
            // plygon = new T.Polygon(points,{
            //     color: "blue", weight: 3, opacity: 0.5, fillColor: "#FFFFFF", fillOpacity: 0.5
            // });
            //
            // //向地图上添加面
            // map.addOverLay(polygon);

            var points = [];
            // points.push(new T.LngLat(116.41136, 39.97569));
            // points.push(new T.LngLat(116.411794, 39.9068));
            // points.push(new T.LngLat(116.32969, 39.92940));
            // points.push(new T.LngLat(116.385438, 39.90610));
            pointsArr.forEach((v,k)=>{
                points.push(new T.LngLat(v.lng,v.lat));

            })
            //创建面对象
             polygon = new T.Polygon(points,{
                color: "blue", weight: 3, opacity: 0.5, fillColor: "#FFFFFF", fillOpacity: 0.5
            });
            //向地图上添加面
            map.addOverLay(polygon);
        }

        //添加面并获取面积
        function addPolygonGetAreaFn(){
            //polyon不能直接测量面积,需要初始化标注工具。
            var config = {
                showLabel: true,
                color: "blue", weight: 3, opacity: 0.5, fillColor: "#FFFFFF", fillOpacity: 0.5
            };
            //创建标注工具对象
            handler = new T.PolygonTool(map, config);


            //添加面
            let array = [
                {lat: 28.93556, lng: 115.79179},
                {lat: 28.93445, lng: 115.79303},
                {lat: 28.93401, lng: 115.79102}
            ];

            var points = [];
            array.forEach((v,k)=>{
                points.push(new T.LngLat(v.lng,v.lat));

            })
            //创建面对象
            polygon = new T.Polygon(points,{
                color: "blue", weight: 3, opacity: 0.5, fillColor: "#FFFFFF", fillOpacity: 0.5
            });
            //向地图上添加面
            map.addOverLay(polygon);

            //获取面积
            console.log(handler.getArea(polygon.getLngLats()[0]))
        }



        //编辑面

        let edit = true
        function editPolygonFn(){

            if (edit){
                //编辑面
                polygon.enableEdit();
                $('.editButton').html('完成编辑');
                edit =false;
            }else {
                //禁止编辑
                polygon.disableEdit();
                $('.editButton').html('编辑绘制面');
                edit =true;


                console.log(polygon.getLngLats()[0])

                console.log(handler.getArea(polygon.getLngLats()[0]))



            }
        }


        function getPolygonFn(){
            console.log(polygon.getLngLats()[0]);
        }

        //开始绘制
        function startDraw(isToolArea) {
            if (handler){
                handler.close();
            }
            if (isToolArea){
                var config = {
                    showLabel: true,
                    color: "blue", weight: 3, opacity: 0.5, fillColor: "#FFFFFF", fillOpacity: 0.5
                };
                //创建标注工具对象
                handler = new T.PolygonTool(map, config);
            }else {
                handler = new T.PolygonTool(map);

            }
            handler.open();

            //长按结束事件
            handler.addEventListener('draw', ()=>{
                dataList = handler.getPolygons()[0].ht[0];
                //绘制完成后获取绘制面的坐标点
                console.log(dataList);

                //清空绘制面
                map.clearOverLays();

                //添加面(同绘制面)
                addPolygonFn(dataList);
                console.log(handler.getArea(dataList))

            });
        }


        var marker;
        var markerLng;
        var markerLat;

        //加点
        function addMarker(){

            map.addEventListener("click",MapClick);

        }
        //地图点击事件
        function MapClick(e) {
            markerLng = e.lnglat.getLng();
            markerLat = e.lnglat.getLat();

            //创建标注对象
            marker = new T.Marker(new T.LngLat(markerLng, markerLat));
            //向地图上添加标注
            map.addOverLay(marker);
            //移除点击事件
            map.removeEventListener("click",MapClick);
            $('.addButton').hide();
            $('.editButton').show();
        }



        //修改点
        function editMarker(){
            addMarker();
            map.removeOverLay(marker)
        }



    </script>

</body>
</html>

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/495902.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

午马传动已确定加入2024第13届生物发酵展

参展企业介绍 浙江午马传动有限公司&#xff0c;办公室地址位于中国长寿之乡、中国椪柑之乡、中国竹炭之乡丽水&#xff0c;浙江省丽水市青田县东源镇项村村前路99号四楼1号&#xff0c;我公司主要提供&#xff1a;齿轮及齿轮减、变速箱制造&#xff1b;机械设备销售&#xff1…

MySQL 8 索引原理详细分析

千山万水总是情, 问问索引行不行? 轻舟已过万重山, 有种尽管来发难。 索引是在数据库优化时的重要手段之一,今天 V 哥从索引的角度展开讲一讲索引的各个要点,希望可以通过这篇文章,帮助大家彻底搞透索引的关键点。 1.索引的定义与作用2.索引的类型3.索引原理4.二分查…

C#学生信息成绩管理系统

一、系统功能描述 本系统包括两类用户&#xff1a;学生、管理员。管理员可以通过系统来添加管理员信息、修改管理员信息、添加学生信息、修改学生信息&#xff1b;开设课程、查询课程、录入成绩、统计成绩、修改成绩、修改个人密码等&#xff0c;而学生则可以通过系统来选择课…

实现DevOps需要什么?

实现DevOps需要什么&#xff1f; 硬性要求&#xff1a;工具上的准备 上文提到了工具链的打通&#xff0c;那么工具自然就需要做好准备。现将工具类型及对应的不完全列举整理如下&#xff1a; 代码管理&#xff08;SCM&#xff09;&#xff1a;GitHub、GitLab、BitBucket、SubV…

智过网:考一级建造师证有什么用?可以从事哪些工作?

随着国家基础设施建设的不断推进&#xff0c;建筑行业在中国经济中占据了举足轻重的地位。在这样的背景下&#xff0c;一级建造师证成为了众多建筑从业者的追求目标。那么&#xff0c;考取一级建造师证究竟有哪些用处&#xff1f;又能从事哪些工作呢&#xff1f;本文将对此进行…

什么是通配符SSL证书?

在当前互联网环境中&#xff0c;数据传输安全至关重要&#xff0c;而通配符SSL证书作为保护多个子域名的理想工具&#xff0c;因其灵活、经济高效的特性而备受瞩目。本文将详细介绍通配符SSL证书的定义、主要特性及其价格区间。 通配符SSL证书的核心特性概述如下&#xff1a; …

rtthread studio 基于bsp生成代码stm32l475正点原子潘多拉,以及硬件配置

1、基于bsp生成代码 rtthread studio 很强大的一个功能就是可以根据芯片或者bsp 生成驱动代码&#xff0c;而且rtthread内核 已经集成到了代码中&#xff01;&#xff01;只需要关注于如何使用硬件和设备完成我们想要的功能就可以&#xff1b; 它的官网文档也特别详细&#x…

【3D目标检测】Det3d—SE-SSD模型训练(前篇):KITTI数据集训练

SE-SSD模型训练 1 基于Det3d搭建SE-SSD环境2 自定义数据准备2.1 自定义数据集标注2.2 训练数据生成2.3 数据集分割 3 训练KITTI数据集3.1 数据准备3.2 配置修改3.3 模型训练 1 基于Det3d搭建SE-SSD环境 Det3D环境搭建参考&#xff1a;【3D目标检测】环境搭建&#xff08;OpenP…

伴随供应链数字化转型的B2B电商

制造业的数字化浪潮正迅猛地席卷全球&#xff0c;新冠病毒大流行和地缘政治格局的改变促进了不同国家和地区企业对供应链数字化转型的的步伐。除了企业内部的加快数字化之外。企业的营销也加快电商化步伐。 企业内部管理的数字化转型会给电商带来怎样的转变&#xff1f;电商如何…

CMOS逻辑门电路

按照制造门电路的三极管不同&#xff0c;分为MOS型、双极性和混合型。MOS型集成逻辑门有CMOS、NMOS、PMOS&#xff1b;双极型逻辑门有TTL&#xff1b;混合型有BiCMOS。 CMOS门电路是目前使用最为广泛、占主导地位的集成电路。早期CMOS电路速度慢、功耗低&#xff0c;后来随着制…

基于springboot+vue+Mysql的就业信息管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

2024最值得推荐的10款开源免费文档管理软件

本文将为大家分享9款开源文档管理系统&#xff1a;Bitrix24、Kimios、OpenDocMan、Papermerge、Nuxeo、OpenKM、Teedy、FileRun、SeedDMS。 在现今充满数字化的世界里&#xff0c;不论大小&#xff0c;各种组织都会产出很多文件、图片等数字化内容。好好管理这些信息对于组织的…

信创实力进阶,Smartbi再获华为云鲲鹏技术认证

日前&#xff0c;经华为技术有限公司评测&#xff0c;思迈特商业智能与数据分析软件Smartbi Insight V11与华为技术有限公司Kunpeng 920 Taishan 200完成并通过相互兼容性测试认证&#xff0c;成功再获华为云鲲鹏技术认证书&#xff0c;标志着Smartbi与华为云鲲鹏产业生态合作更…

Linux系统使用Docker搭建Traefik结合内网穿透实现公网访问管理界面

文章目录 一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zotero文献库五、使用永久固定公网地址同步Zotero文献库 Zotero 是一款全能型 文献管理器,可以 存储、管理和引用文献&#xff0c;不但免费&#xff0c;功能还很强大实用。 ​ Zotero 支…

子虔3D培训大师,助力制造业技能培训

对于制造业企业&#xff0c;传统的培训方式常常伴随着沉重的成本负担&#xff0c;包括聘请培训师的费用、租赁培训场地的租金&#xff0c;以及准备培训材料的成本&#xff0c;这些都让企业在财务上面临不小的压力。同时&#xff0c;传统培训模式还受到时间和空间的限制。学员们…

Redis - 5k star! 一款简洁美观的 Redis 客户端工具~

项目简介 Tiny RDM 是一款现代化、轻量级的跨平台 Redis 桌面客户端&#xff0c;可在 Mac、Windows 和 Linux 系统上运行。初次打开 Tiny RDM&#xff0c;你会被它舒适的风格和配色所吸引&#xff0c;界面简约而不简单&#xff0c;功能齐全。 Tiny RDM 有着如下的功能特性 项…

RF-TI1352P2—双频多协议高发射功率无线模块

RF-TI1352P2是一款基于TI CC1352P7为核心的双频&#xff08;Sub-1 GHz 和 2.4 GHz&#xff09;多协议高发射功率&#xff08;20 dBm&#xff09;无线模块&#xff1b;支持IPEX接口和邮票孔两种天线形式&#xff1b;模块除了集成负责应用逻辑的高性能 48 MHz ARM Cortex-M4F 主处…

【C/C++】C++中的四种强制类型转换

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

电商搬家接口 一键复制商品信息Python php jason

随着电商行业的迅猛发展&#xff0c;越来越多的商家开始将目光投向了线上市场。然而&#xff0c;在电商平台上运营店铺并非易事&#xff0c;尤其是在商品信息的管理与营销方面。传统的商品信息录入方式不仅效率低下&#xff0c;而且容易出错&#xff0c;给商家带来了极大的困扰…

TCP协议和UDP协议的区别

TCP 与 UDP 的 区别 有连接与无连接 有链接&#xff1a;像打电话 需要双方建立连接后才能进行通话 比如说&#xff1a;现在我们要打电话给某个朋友。 输入号码&#xff0c;按下手机拨号键。 手机开始发出 嘟嘟嘟 声音&#xff0c;开始等待对方接听&#xff0c;   而且&#…