百度地图鼠标绘制获取坐标点并传递给后端

本文参考了另一位博主的文章《百度地图鼠标绘制获取坐标点》,

链接:https://blog.csdn.net/qq_30807431/article/details/102942006

百度地图API提供了drawManage类来实现鼠标绘制点,线,面,但是我们怎么获取对应的点坐标呢?

通过查阅百度地图的文档,我发现可以通过事件监听来获取对应的坐标。

但是这个坐标,是在前端var变量里,我该怎么把var变量的值传给后端呢?或者说,我该怎么把script里的变量回传给后端?

查阅CSDN的大佬们的解决方案,一般是在Script里直接通过axios来拼接url实现传参。但是我是在thymeleaf模板下做的项目,再添加axios太过繁琐,所以我用document类里的getElementById来找到我body部分里form表单的input,然后setAttribute给input赋值,通过表单传递给后端。

这个时候,又出现了新的bug,因为我们在事件监听里获取到的是一个JSONarray数组(以折线绘制为例),我们需要先通过JSON.stringify()来传递json串,然后通过toString转化为input可以接收的String字符串,这样,我们就把script里的变量值回传给了form表单,接着通过表单上传就可以把数据传递到后端了。

在后端里我们还需要对数据重新处理,重新转化回array数组,这个比较简单,就不罗嗦了。

下面是完整的前端代码(代码没核对,应该能跑,关键步骤已经通过注释写明白了,大家自取)

<!DOCTYPE html>
<html lang="en" xmlns:th=“http://www.thymeleaf.org”>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
  
    <script type="text/javascript" src="//api.map.baidu.com/api?v=3.0&ak=tNHf57ZrqRiuyh6WVlAirN6OHYQzRt5Z"></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" />
    <title>鼠标绘制选点工具</title>
</head>

<body>

<div id="allmap" style="overflow:hidden;zoom:1;position:relative;">
    <div id="map" style="height:90%;-webkit-transition: all 0.5s ease-in-out;transition: all 0.5s ease-in-out;">
    </div>
</div>
<div id="result" style="overflow: hidden;position: absolute;z-index: 100;top:85%;">

    <form method="post" th:action="@{/user/testPage}">          
        <input  type="hidden" name="pn" id="position"  >
        <button type="submit"onclick="getpoints()" >上传</button>
    </form>

</div>
<script type="text/javascript" th:inline="javascript">

    // 百度地图API功能
    var map = new  BMap.Map('map', { enableMapClick: false });
    map.centerAndZoom(new BMap.Point(120.575588, 31.275412), 15);  // 初始化地图,设置中心点坐标和地图级别
    //map.addControl(new BMap.MapTypeControl());   //添加地图类型控件
    map.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放
    map.enableContinuousZoom(true);    //启用地图惯性拖拽,默认禁用

    map.addControl(new BMap.NavigationControl());  //添加默认缩放平移控件
    map.addControl(new BMap.ScaleControl({ anchor: BMAP_ANCHOR_BOTTOM_LEFT })); //向地图中添加比例尺控件
   
    var overlays = [];
    var overlaycomplete = function (e) {
        var overlay = e.overlay;//总事件结束监听里,将坐标信息传给变量overlay
        overlays.push(overlay);
    };
        var polygoncomplete = function (e, overlay) {
            position=overlay.getPath();
        };

        var markercomplete = function (e, overlay) {
             position=overlay.getPosition();//在点绘制事件监听里是通过getPosition()函数获取点对象(object)
        };
    var polylinecomplete = function (e, overlay) {
        position=overlay.getPath();
//在折线绘制事件监听里,通过getPath()函数获取折线的点数组

    };

    var styleOptions = {
        strokeColor: "red",    //边线颜色。
        fillColor: "red",      //填充颜色。当参数为空时,圆形将没有填充效果。
        strokeWeight: 3,       //边线的宽度,以像素为单位。
        strokeOpacity: 0.8,	   //边线透明度,取值范围0 - 1。
        fillOpacity: 0.6,      //填充的透明度,取值范围0 - 1。
        strokeStyle: 'solid' //边线的样式,solid或dashed。
    }
    //实例化鼠标绘制工具
    var drawingManager = new BMapLib.DrawingManager(map, {
        isOpen: false, //是否开启绘制模式
        enableDrawingTool: true, //是否显示工具栏
        drawingToolOptions: {
            anchor: BMAP_ANCHOR_TOP_RIGHT, //位置
            offset: new BMap.Size(5, 5), //偏离值
        },
        circleOptions: styleOptions, //圆的样式
        polylineOptions: styleOptions, //线的样式
        polygonOptions: styleOptions, //多边形的样式
        rectangleOptions: styleOptions //矩形的样式
    });
    //添加鼠标绘制工具监听事件,用于获取绘制结果
    drawingManager.addEventListener('overlaycomplete', overlaycomplete);
    drawingManager.addEventListener('polylinecomplete', polylinecomplete);
    drawingManager.addEventListener('polygoncomplete', polygoncomplete);
    drawingManager.addEventListener('markercomplete', markercomplete);

//关键操作:通过document.getElementById函数来对body里的input赋值。先通过id找到form表单里的input组件,
//然后setAttribute("属性名",”属性值“)赋值。需要注意的是,input组件接受的是String类型的数据。
//但是我们监听事件返回的是Jsonarray数组(点绘制返回object对象),需要先通过JSON.stringify函数来传递JSON串,
//然后通过toString函数转化为String对象,赋值给input.这样就实现了将var变量的值传递给thymeleaf组件,
//之后就按正常表单提交操作就好,后端获取数据后再转化为Array数组重新处理。

    function getpoints() {
        console.dir(position);
                document.getElementById('position').setAttribute("value",JSON.stringify(position).toString());
       
    }

    var size = new BMap.Size(80, 20);
    map.addControl(new BMap.CityListControl({
        anchor: BMAP_ANCHOR_TOP_LEFT,
        offset: size,
    }));


</script>
</body>

</html>
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
百度地图提供了一个鼠标绘制工具库,可以通过该工具库在地图上快速绘制、线、面等几何图形。以下是基本的鼠标绘制步骤: 1. 引入百度地图JS API和鼠标绘制工具库: ```html <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=your_app_key"></script> <script type="text/javascript" src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script> ``` 2. 创建地图实例,并在地图上添加鼠标绘制工具: ```javascript var map = new BMap.Map("container"); var point = new BMap.Point(116.404, 39.915); map.centerAndZoom(point, 15); var drawingManager = new BMapLib.DrawingManager(map, { isOpen: false, // 是否开启绘制模式 enableDrawingTool: true, // 是否显示工具栏 drawingToolOptions: { anchor: BMAP_ANCHOR_TOP_RIGHT, // 工具栏位置 offset: new BMap.Size(5, 5), // 工具栏偏移量 }, circleOptions: { strokeWeight: 2, // 圆形边线宽度 fillColor: "#ffffff", // 圆形填充颜色 strokeColor: "#ff0000", // 圆形边线颜色 strokeOpacity: 0.8, // 圆形边线透明度 fillOpacity: 0.6, // 圆形填充透明度 strokeStyle: "solid", // 圆形边线样式 }, }); ``` 3. 在绘制工具栏中选择绘制的几何图形类型,开始绘制: ```javascript drawingManager.addEventListener("overlaycomplete", function(e) { var type = e.drawingMode; var overlay = e.overlay; // 处理绘制完成后的逻辑 }); ``` 4. 处理绘制完成后的逻辑,例如获取绘制出的几何图形的坐标等信息。 以上是一个简单的百度地图鼠标绘制的示例,你可以根据自己的需要进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值