高德地图使用鼠标工具(mouseTool)画覆盖物折线(mouseTool.polyline),光标使用十字架(crosshair)类型,不断出现closehand小手图标干扰

今天在使用高德地图的时候,使用鼠标工具进行地图范围折线标注,但是发现鼠标在画第二个点,鼠标落下的时候会自动请求这个URL http://webapi.amap.com/theme/v1.3/closedhand.cur,如图:请求返回的是鼠标悬浮的小手(.cur光标文件),如下图:

然后介绍一下这个小手什么时候它会显示:经过我的测试,发现它在我的鼠标在移到我绘制的线和正在绘制的线上面的时候显示为小手,如下图:

这个也许是高德地图对热点移动到覆盖物上时自动请求这个图标回来,正常情况下也没什么影响,但是现在我在绘线过程中它会一直与十字架光标交替闪烁出现,这是客户不能接受的,我也不能接受,希望的是在绘画过程中一直保持十字架光标用以区分绘线和退出的状态。

因为它的热点就是光标的热点,而这就直接导致我在后续的绘线过程中,鼠标的热点一直在我的线上,这样就一直闪烁的显示小手和十字架光标,因为在移动的时候(快速移动==>),热点下面还没有线的显示,那段时间是不会显示小手,但是只要慢了,光标下面就会有线,导致小手图标与十字架图标一直不停换着显示,这种情况会在strokeWeight(线宽)的值越大的时候越严重。

我阅读了高德官方的开发者文档,但是并没有找到能解决的办法(如果有朋友有官方的解决办法请留言告诉我,谢谢了)。

最后我的解决办法是给地图的容器div设置鼠标样式,如下图:

现在无论我怎么画线,光标都能一直保持十字架crosshair光标,当然我这里只是大概讲了一下思路,后续功能的完善就不细讲了,你可以把这个样式用两个class来定义,通过点击事件控制某个参数,在行内使用三元表达式来控制鼠标的样式,以此实现开始绘线和停止绘线的状态。

下面是我自己的例子:

<div id="containes" style="width:100%; height:100%" :class="[cursor ? 'cursorCrosshair' : 'cursorPointer']" />

这下面是测试用的简单例子:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.4&key=78bfb693a2a4c44c028a8be7c2e0f1b7&plugin=AMap.PolyEdito"></script>
  <script src="https://webapi.amap.com/maps?v=1.4.15&key=78bfb693a2a4c44c028a8be7c2e0f1b7&plugin=AMap.MouseTool"></script>
  <script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.4&key=78bfb693a2a4c44c028a8be7c2e0f1b7&plugin=AMap.PolyEdito,AMap.MouseTool,AMap.Autocomplete,AMap.PlaceSearch"></script>
  <script type="text/javascript" src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
  <script type="text/javascript" src="https://webapi.amap.com/demos/js/liteToolbar.js"></script>
  <title>Title</title>
</head>
<body>
<div id="container" style="width:100%; height: 100%;"></div>
<div style="position: absolute;top: 30px;left: 500px">
  <input id="tipinput" />
  <button id="polyline">开始绘图</button><button id="clear">取消绘图</button>
</div>
<style type="text/css">
  html,body{
    width: 100%;
    height: 100%;
    margin: 0px;
  }
</style>
<script>
  //新建地图
    var map = new AMap.Map('container',{
        center: [106.535499, 29.546464],
        resizeEnable: true,
        zoom: 18
    });
    var overlays = [];

    //新建鼠标工具
    var mouseTool = new AMap.MouseTool(map);

    //搜索位置
    var autoOptions = {
        input: 'tipinput',
        city: '重庆'
    }
    var auto = new AMap.Autocomplete(autoOptions)
    var placeSearch = new AMap.PlaceSearch({
        map: map,
        zoom: 12
    }) 
    // 构造地点查询类
    AMap.event.addListener(auto, 'select', select)// 注册监听,当选中某条记录时会触发
    function select(e) {
        placeSearch.setCity(e.poi.adcode)
        placeSearch.search(e.poi.name) // 关键字查询查询
    }
    //鼠标连线监听时间
    mouseTool.on('draw', (type, obj) => {
        var map_m = type.obj.getPath()
        console.log('AAA',map_m)
    })
    //开始绘图事件
    document.getElementById('polyline').onclick = function(){
        // map.setDefaultCursor("crosshair")
        mouseTool.polyline({
            strokeColor:'red',
            strokeWeight: 6,
            //同Polyline的Option设置
        });

    }
    //清楚绘图事件
    document.getElementById('clear').onclick = function(){
        // map.setDefaultCursor("pointer")
        map.remove(overlays)
        overlays = [];
        mouseTool.close(true)
    }
</script>
<style>
  #container {
    cursor : crosshair !important;
  }
</style>
</body>
</html>

若有小伙伴有更好的高德官方解决方案请留言给我,谢谢 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用高德地图 JavaScript API 中提供的绘制工具库来实现这些功能。以下是简单的封装实现: 1. 引入高德地图 JavaScript API 和绘制工具库: ```html <script src="https://webapi.amap.com/maps?v=1.4.15&key=YOUR_KEY"></script> <script src="https://webapi.amap.com/ui/1.0/main.js"></script> ``` 2. 定义绘制工具类: ```javascript class AMapDrawTool { constructor(map) { this.map = map; this.tool = new AMap.MouseTool(map); this.listeners = []; } addListener(eventType, handler) { this.listeners.push({ eventType, handler }); this.tool.on(eventType, handler); } removeListeners() { this.listeners.forEach(({ eventType, handler }) => { this.tool.off(eventType, handler); }); this.listeners = []; } drawRectangle() { this.tool.rectangle(); } drawCircle() { this.tool.circle(); } drawPolygon() { this.tool.polygon(); } drawMarker() { this.tool.marker(); } drawPolyline() { this.tool.polyline(); } } ``` 3. 创建地图实例和绘制工具实例: ```javascript const map = new AMap.Map('map-container', { center: [116.397428, 39.90923], zoom: 13, }); const drawTool = new AMapDrawTool(map); ``` 4. 添加绘制完成事件监听器并处理绘制结果: ```javascript drawTool.addListener('draw', (e) => { const overlay = e.obj; console.log('绘制完成', overlay); // 处理绘制结果 }); // 移除事件监听器 drawTool.removeListeners(); ``` 5. 调用绘制方法开始绘制: ```javascript drawTool.drawRectangle(); drawTool.drawCircle(); drawTool.drawPolygon(); drawTool.drawMarker(); drawTool.drawPolyline(); ``` 以上是一个简单的封装实现,你可以根据自己的需求进行修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值