其实你很棒 2023-06-24 17:35 采纳率: 71.4%
浏览 116
已结题

天地图API鼠标右键菜单的问题

我想在地图API中实现如下功能,当鼠标位于绘制的图形中,鼠标右键菜单1;当鼠标位于绘制的图形外,鼠标右键弹出菜单2。
目前不知道如何判断鼠标的位置,请指点迷津。

img


鼠标菜单1

img


鼠标菜单2
以下是鼠标菜单事件:

     
     var control;
     var zoom = 12;
     var map;
     var handler_M;  //绘制点
     var leTool,pyTool,reTool,ceTool;  //线、多边形、矩形、圆

        function onLoad() {
            map = new T.Map('mapDiv',{
                 minZoom:3,
                 maxZoom:18
                      });
            map.centerAndZoom(new T.LngLat(116.40769, 39.89945), zoom);
            //创建缩放平移控件对象
            control = new T.Control.Zoom();
            //添加缩放平移控件
            map.addControl(control);
            //允许鼠标滚轮缩放地图
            map.enableScrollWheelZoom();
            //创建比例尺控件对象
            var scale = new T.Control.Scale();
            //添加比例尺控件
            map.addControl(scale);
            //禁用鼠标双击放大地图
            map.disableDoubleClickZoom()
            //创建地图类型对象
            var ctrl = new T.Control.MapType();
          
            //添加控件
            map.addControl(ctrl);
            var config_py= {
                showLabel: true,
                color: "#FF00FF", weight: 3, opacity: 1.0, fillColor: "#00FF00", fillOpacity: 0.4
              };
            var config_L= {
                showLabel: true,
                color: "#FF00FF", weight: 3, opacity: 1.0, fillColor: "#F5FFFA", fillOpacity: 0.4
              };
            var config_p= {
                showLabel: true,
                color: "#FF00FF", weight: 3, opacity: 1.0, fillColor: "#ADFF2F", fillOpacity: 0.4
              };
            var config_c= {
                showLabel: true,
                color: "#FF00FF", weight: 3, opacity: 1.0, fillColor: "#00BFFF", fillOpacity: 0.4
              };


           
            //创建多边形工具对象
            pyTool = new T.PolygonTool(map, config_py);
            //创建直线工具对象
            leTool =new T.PolylineTool(map, config_L);
            //创建矩形工具对象
            reTool = new T.RectangleTool(map,config_p);
            //创建圆形工具对象
            ceTool = new T.CircleTool(map,config_c);
         

            //创建图形外的右键菜单
            var menu_out = new T.ContextMenu({
                width: 100
            });
            var txtMenuItem_out = [
               {
                    text: '设为标记点',
                    callback: function () {
                        map.zoomIn()
                    }
                },
                {
                    text: '放大地图',
                    callback: function () {
                        map.zoomIn()
                    }
                },
                {
                    text: '缩小地图',
                    callback: function () {
                        map.zoomOut()
                    }
                },
                {
                    text: '显示最大地图',
                    callback: function () {
                        map.setZoom(18)
                    }
                },

            ];

            for (var i = 0; i < txtMenuItem_out.length; i++) {
                   //添加菜单项
                   var menuItem_out = new T.MenuItem(txtMenuItem_out[i].text, txtMenuItem_out[i].callback);
                   menu_out.addItem(menuItem_out);
                   menu_out.addSeparator();

               };
              

             //创建图形内的右键菜单
            var menu_in = new T.ContextMenu({
                width: 100
            });
            var txtMenuItem_in = [
               {
                    text: '编辑对象',
                    callback: function () {
                        map.zoomIn()
                    }
                },
                {
                    text: '移动对象',
                    callback: function () {
                        map.zoomIn()
                    }
                },
                {
                    text: '显示信息',
                    callback: function () {
                        map.zoomOut()
                    }
                },
                {
                    text: '更改颜色',
                    callback: function () {
                        map.setZoom(18)
                    }
                },
                {
                    text: '删除对象',
                    callback: function () {
                        map.setZoom(18)
                    }
                },
            ];

            for (var i = 0; i < txtMenuItem_in.length; i++) {
                   //添加菜单项
                   var menuItem_in = new T.MenuItem(txtMenuItem_in[i].text, txtMenuItem_in[i].callback);
                   menu_in.addItem(menuItem_in);
                   menu_in.addSeparator();
               }

                //添加右键菜单
                //map.addContextMenu(menu_in); 
          
                //添加图形外的右键菜单
               // map.addContextMenu(menu_out); 
 
          };
            //鼠标监听事件
            function addMapMousemove()
            {
               removeMapMousemove();
               map.addEventListener("mousemove",MapMousemove);
            }
          //移除鼠标监听事件  
            function removeMapMousemove()
            {
               map.removeEventListener("mousemove",MapMousemove);
            }

           //绘制多边形
            function openPolygonTool() {
              if (pyTool) pyTool.close();  
              //大致相当于 if (handler<>nil) then  handler.close(),如果handler存在,就执行handler.close
              pyTool = new T.PolygonTool(map, {follow: true});
              pyTool.open();
              // 监听双击绘制完成事件,调用drawFinish方法 
                             
           }

         //绘制直线

           function openPolylineTool() {
              if (leTool ) leTool .close();
              leTool  = new T.PolylineTool(map);
              //map.addOverLay(handler_L);
              leTool.open();
          }

         //绘制一个点

           function openMarkerTool() {
              if (handler_M) handler_M.close();
              handler_M = new T.MarkTool(map, {follow: true});
              handler_M.open();
          }

          //绘制矩形
           function openRectangleTool() {
              if (reTool) reTool.close();
              reTool = new T.RectangleTool(map, {follow: true});
              reTool.open();
          }

          //绘制圆形
           function openCircleTool() {
              if (ceTool) ceTool.close();
              ceTool = new T.CircleTool(map, {follow: true});
              ceTool.open();
          }

         //计算图层数量 
           function getLayerCount() {
              return map.getOverlays().length; 
          }

           function drawFinish(){
             isEditable=true;
              
          }
  • 写回答

8条回答 默认 最新

  • Jackyin0720 2023-06-24 19:24
    关注

    首先,你需要为地图添加一个鼠标事件监听器。例如,使用以下代码可以在地图上添加一个鼠标右键菜单:

    map.on('contextmenu', function(event) {  
      // 创建一个右键菜单  
      var menu = new google.maps.ContextMenu();  
      // 显示菜单  
      menu.setPosition(event.latLng);  
      menu.open(map);  
    });
    

    其次,添加一个鼠标移动事件监听器,以判断鼠标是否在图形中:

    map.on('mousemove', function(event) {  
      console.log(event.latLng);  
    });
    

    使用event.latLng获取鼠标位置的经纬度坐标。可以使用这个信息来判断鼠标是否在图形中。如果鼠标在图形中,显示菜单1;如果鼠标在图形外,显示菜单2
    使用布尔变量mouseInPolygon来判断鼠标是否在图形中。在鼠标移动事件监听器中,使用polygon.contains(point)来判断鼠标是否在图形中。如果鼠标在图形中,将mouseInPolygon设置为true;否则将其设置为false。在右键菜单事件监听器中,根据mouseInPolygon的值来显示不同的菜单。

    map.on('contextmenu', function(event) {  
      // 创建一个右键菜单  
      var menu = new google.maps.ContextMenu();  
      if (mouseInPolygon) {  
        // 显示菜单1  
      } else {  
        // 显示菜单2  
      }  
      menu.setPosition(event.latLng);  
      menu.open(map);  
    });  
      
    map.on('mousemove', function(event) {  
      console.log(event.latLng);  
      // 判断鼠标是否在图形中  
      var point = new google.maps.LatLng(event.latLng.lat(), event.latLng.lng());  
      if (polygon.contains(point)) {  
        mouseInPolygon = true;  
      } else {  
        mouseInPolygon = false;  
      }  
    });
    #如有帮助,恭请采纳
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月28日
  • 已采纳回答 6月28日
  • 赞助了问题酬金15元 6月26日
  • 修改了问题 6月26日
  • 展开全部