首页 > 其他分享 >百度地图JSAPI:电子围栏工具的开发和使用

百度地图JSAPI:电子围栏工具的开发和使用

时间:2024-12-03 10:34:15浏览次数:7  
标签:map const JSAPI coordinates 围栏 var path 百度

在这里插入图片描述
在这里插入图片描述

引言

在现代地理信息系统(GIS)中,电子围栏作为一种重要的空间数据管理工具,广泛应用于各类应用场景,如区域监控、安防管理、物流管理等。本文旨在介绍如何利用百度地图JavaScript API(JSAPI)开发一款电子围栏工具,帮助用户轻松地在地图上绘制和管理电子围栏。

一、准备工作
注册百度开发者账号:首先,你需要在百度开发者平台注册一个账号,并创建一个应用以获取API Key。
引入百度地图JSAPI:在你的HTML文件中引入百度地图JSAPI和绘图工具库。

引入百度地图JS库

    <!--百度地图开源库-->
    <script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=qKTp***"></script>
    <script type="text/javascript"
            src="//api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script>
    <link rel="stylesheet" href="//api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css"/>

构建DOM容器

为了提供良好的用户体验,需要设计合理的界面布局。这里采用了一个包含地图渲染区和操作面板的基本HTML结构。

<div class="mainbox">
    <!--地图渲染区-->
    <div id="map" style="float:left;height: 100vh;width: 70%;"></div>
    <!--操作面板-->
    <div style="float:left;width: 28%;padding: 1%;">
        <form class="layui-form layui-form-pane">
            <div class="layui-card">
                <div class="layui-card-header layui-font-18 layui-font-red">操作说明</div>
                <div class="layui-card-body" style="height: auto;">
                    <p>1.单击选择地图上左侧画多边形工具;</p>
                    <p>2.地图上单击拾取坐标,大于等于3个坐标点时,双击即可完成电子围栏的拾取;</p>
                    <p class="layui-font-red">3.编辑时,请单击“清除围栏”,重新拾取坐标;</p>
                </div>
            </div>
            <div class="layui-card">
                <div class="layui-form-item">
                    <label class="layui-form-label">围栏名称</label>
                    <div class="layui-input-inline" style="width: 60%;">
                        <input type="text" placeholder="围栏名称" id="town_name" name="town_name" lay-verify="required" class="layui-input" value="红星乡">
                    </div>
                </div>

                <div class="layui-form-item">
                    <label class="layui-form-label">经度坐标</label>
                    <div class="layui-input-inline" style="width: 60%;">
                        <input type="text" placeholder="经度坐标" id="poi_longitude" name="poi_longitude" class="layui-input" value="130.97030688845558" lay-verify="required">
                    </div>
                </div>

                <div class="layui-form-item">
                    <label class="layui-form-label">纬度坐标</label>
                    <div class="layui-input-inline" style="width: 60%;">
                        <input type="text" placeholder="纬度坐标" id="poi_latitude" name="poi_latitude" class="layui-input" value="45.28260821161705" lay-verify="required">
                    </div>
                </div>

                <div class="layui-form-item">
                    <label class="layui-form-label">电子围栏</label>
                    <div class="layui-input-inline" style="width: 60%;">
                        <textarea id="town_fence" name="town_fence" class="layui-textarea" placeholder="坐标集" lay-verify="required"></textarea>
                    </div>
                </div>

                <div class="layui-form-item" style="text-align: center;">
                    <input type="hidden" id="town_id" name="town_id" value="8">
                    <input class="layui-btn layui-btn-danger" type="button" value="清除围栏" onclick="clearAll()">
                    <button class="layui-btn" lay-filter="add" lay-submit="" type="submit">确定提交</button>
                </div>
            </div>
        </form>
    </div>
</div>

封装函数

清除边界

当用户需要重新绘制围栏时,可通过调用清除函数来移除现有围栏并清空相关数据输入框。

    /*清除边界*/
    function clearAll() {
        map.clearOverlays();
        $("#town_fence").val(''); //清除表单;
    }

返回多边形中心点

通过计算多边形各顶点坐标的平均值来确定其中心位置,并更新至相应的表单字段。

    /*
   * path,返回多边型的点数组,Array<Point>
   */
    function getCenterPoint(coordinates) {
        const lnglat = coordinates.split(';');
        const path = lnglat.map(lnglatStr => {
            const [lng, lat] = lnglatStr.split(',');
            return new BMap.Point(parseFloat(lng), parseFloat(lat));
        });

        var x = 0.0;
        var y = 0.0;
        for (var i = 0; i < path.length; i++) {
            x = x + parseFloat(path[i].lng);
            y = y + parseFloat(path[i].lat);
        }
        x = x / path.length;
        y = y / path.length;
        //console.log(x+','+y);
        $("#poi_longitude").val(x);
        $("#poi_latitude").val(y);
    }

加载电子围栏

根据存储的坐标数据加载已定义的电子围栏,并设置地图视图以显示该围栏区域。

 //加载电子围栏
    function getFence(town_fence) {
        if (town_fence) {
            const lnglat = town_fence.split(';');

            // 创建点数组
            const pts = lnglat.map(lnglatStr => {
                const [lng, lat] = lnglatStr.split(',');
                return new BMap.Point(parseFloat(lng), parseFloat(lat));
            });

            // 创建多边形
            const ply = new BMap.Polygon(pts, {
                fillColor: 'blue',
                fillOpacity: 0.3,
                strokeColor: 'blue',
                strokeStyle: "dashed",
                strokeWeight: 1,
                strokeOpacity: 0.5
            });

            // 设置地图中心和缩放级别
            map.centerAndZoom(pts[0], 15);

            // 添加多边形到地图
            map.addOverlay(ply);

            // 启用编辑
            ply.enableEditing();

            // 移除已有的lineupdate事件监听器
            ply.removeEventListener('lineupdate', handleLineUpdate);

            // 添加lineupdate事件监听器
            ply.addEventListener('lineupdate', handleLineUpdate);

            function handleLineUpdate() {
                const points = this.getPath(); // 获取多边形的所有顶点
                const coordinates = points.map(point => `${point.lng},${point.lat}`).join(';'); // 使用分号连接各点
                //console.log(coordinates);
                getCenterPoint(coordinates);//获取中心点
                $("#town_fence").val(coordinates);
            }
        } else {
            console.log('未获取到围栏信息')
        }
    }

绘制模式

配置绘图工具以支持用户直接在地图上绘制多边形,并监听绘制完成事件以处理后续逻辑。

 var overlays = [];
    var overlaycomplete = function (e) {
        overlays.push(e.overlay);
        var res = e.overlay;//e.drawingMode;
        //判断绘制模式;
        var path = res.getPath();//Array<Point> 返回多边型的点数组
        const coordinates = path.map(point => `${point.lng},${point.lat}`).join(';'); // 使用分号连接各点
        //console.log(coordinates);
        getCenterPoint(coordinates);//获取中心点
        $("#town_fence").val(coordinates);
    };

    //鼠标绘制工具
    var drawingManager = new BMapLib.DrawingManager(map, {
        isOpen: false, //是否开启绘制模式
        enableDrawingTool: true, //是否显示工具栏
        drawingMode: BMAP_DRAWING_POLYGON,//绘制模式
        drawingToolOptions: {
            drawingModes: [BMAP_DRAWING_POLYGON],//, BMAP_DRAWING_MARKER, BMAP_DRAWING_POLYLINE
            anchor: BMAP_ANCHOR_TOP_RIGHT, //位置
            offset: new BMap.Size(5, 5), //偏离值
        },
        polygonOptions: {
            strokeColor: "red",    //边线颜色。
            fillColor: "red",      //填充颜色。当参数为空时,圆形将没有填充效果。
            strokeWeight: 3,       //边线的宽度,以像素为单位。
            strokeOpacity: 0.8,	   //边线透明度,取值范围0 - 1。
            fillOpacity: 0.6,      //填充的透明度,取值范围0 - 1。
            strokeStyle: 'solid' //边线的样式,solid或dashed。
        }, //多边形的样式
    });

    //添加鼠标绘制工具监听事件,用于获取绘制结果
    drawingManager.addEventListener('overlaycomplete', overlaycomplete);

@漏刻有时

标签:map,const,JSAPI,coordinates,围栏,var,path,百度
From: https://blog.csdn.net/weixin_41290949/article/details/144068488

相关文章

  • 日常Mentor操作整理3(百度上都搜不到的内容)
    16边框以及铜皮倒角17PCB器件显示实心操作18PCB中器件丝印移动操作19丝印丢失恢复20晶振下放置避让区域平面--平面障碍物21符号批量替代操作(鼠标右键)......
  • 百度的面试官,你什么勾八水平,也好意思上车锁门 面试官:说一下C++强制类型转换,C++内存管
    ......
  • 开源低代码平台-Microi吾码-接口引擎实战:微信v3支付JSAPI下单
    Microi吾码-接口引擎实战:微信v3支付JSAPI下单简介预览图业务逻辑接口引擎代码Microi吾码-系列文档接口引擎实战-系列文档简介接口引擎与第三方平台对接无所不能,下一篇介绍对接微信支付回调(含签名验证)预览图业务逻辑参考微信支付官方文档:https://pay.weixin.qq......
  • Java 百度网盘300文件一组 文件批量重命名
     按260个文件一个文件夹publicstaticvoidmain(String[]args){Stringpath="F:\\壁纸爬虫合集\\爬虫文件夹No1";intfileCount=0;List<List<File>>folderList=newArrayList<>();List<File>folder......
  • 百度云申请accesstoken
    importrequestsdefmain():api_key='自己申请的'secret_key='自己申请的'token_url='https://aip.baidubce.com/oauth/2.0/token'url=f"{token_url}?grant_type=client_credentials&client_id={api_key}&client_secre......
  • python实战项目47:Selenium采集百度股市通数据
    python实战项目47:Selenium采集百度股市通数据一、思路分析二、完整代码一、思路分析这里以获取百度股市通股评下的投票数据为例,页面中的其他数据同理。由于此页面数据是js动态加载的,所以采用Selenium获取数据。思路很简单,通过Selenium打开页面,然后定位到“股评”......
  • 百度萝卜快跑 vs 特斯拉FSD,谁才是真正的智能驾驶王者?
    近日,随着特斯拉无人出租车的发布,详情见《太前卫了!特斯拉无人出租车Cybercab登场,方向盘&踏板都没了!》,自动驾驶界的“争霸赛”在国内外掀起了热潮。面对之前已经上路的萝卜快跑,问题来了:百度的“萝卜快跑”和特斯拉的FSD,到底谁才是真正的“王者”?这场科技大对决不仅仅是两个系......
  • 告别繁琐的云平台开发!IoT_CLOUD之【百度云】
    ​众所周知,市面上有很多云平台,阿里云、腾讯云、中移OneNET、华为云、百度云、涂鸦云、Tlink云等等......并且每家云平台都有自己的协议,工程师要移植不同的SDK代码或基于各家的手册文档对接不同的协议,看着都头大!!!为解决繁琐的云平台开发困扰,合宙IoT_CLOUD应运而生,一库打通所有云平......
  • Vue快速嵌入百度地图,避坑提效指南
    Vue快速嵌入百度地图,避坑提效指南在Vue项目中引用百度地图并没有高德地图那么方便,但是项目要用,这里分享下找到的方法,方便使用到的时候能快速接入,避雷避坑!新建bmap.js文件exportdefault{init:function(){constAK="这里是你申请的百度AK";cons......
  • Vue2 - 详细实现安装引入百度地图并查询展示周边交通/教育/医疗/商场/生活/娱乐等POI
    前言Vue3版本,请访问在vue2|nuxt2项目开发中,详解高德地图根据当前定位获取周边附近的商圈,vue2高德地图获取周边商圈并将这些地址位置列出来供用户点击跳转和选择,获取当前位置或指定区域周边的交通出行、学校教育、医院诊所、商场购物、生活娱乐、旅游景点、酒店民宿......