天地图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;
              
          }

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

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;  
  }  
});
#如有帮助,恭请采纳

来自GPT的回答:


要实现在地图API中判断鼠标位置并触发相应的右键菜单,你可以利用鼠标事件和地图对象提供的功能。

首先,你需要注册鼠标移动事件,以便在鼠标位置发生变化时进行处理。具体的事件名称和注册方法可能因你所使用的地图API而异,你可以查阅相关文档来了解具体的接口和用法。

在鼠标移动事件的回调函数中,你可以通过以下步骤来判断鼠标位置是否在绘制的图形内部:

获取鼠标当前的经纬度坐标。
判断鼠标位置是否在绘制的图形内部。这取决于你绘制图形的方式和所使用的地图API提供的方法。例如,如果你使用多边形来表示图形,可以使用多边形的包含点算法来判断鼠标坐标是否在多边形内部。
根据判断结果,执行相应的操作。如果鼠标在图形内部,触发右键菜单1;如果在图形外部,触发右键菜单2。
以下是伪代码示例,展示了如何实现上述功能:

javascript
Copy code
map.on('mousemove', function(event) {
  var mouseLatLng = event.latlng; // 获取鼠标当前的经纬度坐标

  if (isInsidePolygon(mouseLatLng, drawnPolygon)) {
    map.showContextMenu(menu_in); // 显示鼠标右键菜单1
  } else {
    map.showContextMenu(menu_out); // 显示鼠标右键菜单2
  }
});

function isInsidePolygon(point, polygon) {
  // 实现判断点是否在多边形内部的算法
  // 返回 true 或 false
  // 可以根据你所使用的地图API提供的方法来实现该算法
}
在上述示例中,map 表示地图对象,menu_in 和 menu_out 分别表示鼠标右键菜单1和菜单2,drawnPolygon 表示绘制的图形,isInsidePolygon 是判断点是否在多边形内部的函数。

你可以用 mousemove 事件来跟踪鼠标在地图上的位置,然后用 containsLocation 函数来判断鼠标是否在绘制的图形内。如果是,就显示菜单1,否则显示菜单2。

下面是一个示例代码:

//添加右键菜单

map.addContextMenu(menu_in);

//添加图形外的右键菜单

map.addContextMenu(menu_out);

//添加鼠标移动事件

map.onmousemove = function (e) {

//获取鼠标的经纬度

var latlng = e.latLng;

//判断鼠标是否在图形内

var inside = google.maps.geometry.poly.containsLocation(latlng, polygon);

//如果在图形内,显示菜单1,否则显示菜单2

if (inside) {

menu_in.show();

menu_out.hide();

} else {

menu_in.hide();

menu_out.show();

}

};

在天地图 API 中,可以通过判断鼠标右击的位置是否处于绘制图形的范围中来判断是否处于绘制图形的状态。具体来说,可以通过获取当前绘制图形的几何对象,然后调用其 containsPoint 方法来判断鼠标右击位置是否在范围内。

以下是一个判断鼠标右击是否处于绘制图形范围中的示例代码:

// 获取当前绘制的几何对象
var geometry = map.currentTool.getGeometry();

// 判断鼠标右击位置是否在范围内
if (geometry.containsPoint(e.point)) {
  // 如果鼠标右击位置在范围内,处理相应操作
  console.log('鼠标右击在绘制图形范围内');
} else {
  // 否则执行其他操作
  console.log('鼠标右击不在绘制图形范围内');
}

在这个示例中,我们首先通过 map.currentTool 属性获取当前的绘图工具,然后调用其 getGeometry 方法获取当前绘制的几何对象。然后我们在鼠标右击事件中获取右击位置,调用几何对象的 containsPoint 方法判断右击位置是否在范围内。如果鼠标右击位置在范围内,我们输出一条消息,否则输出另一条消息。

需要注意的是,在使用 containsPoint 方法之前,需要确保几何对象已经被渲染在地图上。如果没有渲染,可以手动调用 geometry.changed() 方法来触发变化事件,并更新几何对象的状态。另外,由于 containsPoint 方法的计算需要一些时间,建议将其放在异步调用中,以避免阻塞主线程。

判断鼠标和绘制图形的坐标

谢谢楼上的热心指点,我还是没办法调出来,我把JS 代码发出来,看看是哪里的问题。

     
     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;
              
          }


百度地图JavaScript API的详情使用
可以参考下,非常详细
https://blog.csdn.net/weixin_41677621/article/details/119305618