2012-01-12 91 views

回答

23

这是当前一项突出的功能请求(由Google确认),issue 3760

这是我的解决方案:http://jsbin.com/ajimur/10。它使用一个函数,将删除按钮添加到传入的多边形中(撤消按钮下方)。


另外,有人建议这种做法:right-click to delete closest vertex,它工作正常,但在UI技巧有点欠缺。我使用链接代码构建,以检查点击是否位于节点内部(或1像素内) - 在JSBin中:http://jsbin.com/ajimur/

编辑:正如Amr Bekhit指出的那样 - 这种方法当前被打破,因为事件需要附加到多边形。

+0

您的演示页面适用于FF,IE和Chrome浏览器,但在Opera中似乎无视rightclick事件。但是Thx。 – mtom 2012-03-16 09:03:42

+0

右键 - Opera在默认情况下允许脚本执行的操作可能有点意思。这是否有帮助:http://groups.google.com/a/googleproductforums.com/forum/#!category-topic/maps/navigation-and-directions/4dy2iYzRKgk – 2012-03-16 15:22:00

+2

听起来不像expertsexchange或任何东西,但+1我如果它有帮助! :) – 2012-03-16 15:27:49

34

Google地图现在对由多边形或多段线触发的事件提供“PolyMouseEvent”回调对象。

要建立在其建议涉及右击解决其他的答案,所有你需要做的是在V3 API的最新版本如下:

// this assumes `my_poly` is an normal google.maps.Polygon or Polyline 
var deleteNode = function(mev) { 
    if (mev.vertex != null) { 
    my_poly.getPath().removeAt(mev.vertex); 
    } 
} 
google.maps.event.addListener(my_poly, 'rightclick', deleteNode); 

你会发现,任何因为Google Maps API现在告诉我们我们点击了哪个顶点,因此有关我们是否接近点的复杂计算不再需要。

注意:这只会在多段线/多边形处于编辑模式时起作用。(这是您可能想删除的顶点是可见的。)

作为最终的想法,您可以考虑使用单击或双击事件。 “点击”足够智能,不会触发拖动,尽管使用单击触发器仍然可能会让一些用户感到惊讶。

+1

你可以在'this这个回调中切换'my_poly' '。我用'确认'对话框保护'click' ...我不认为用户会猜测右键单击(上下文菜单)或双击(缩放),但点击是自然的。谢谢! – 2012-08-08 13:50:48

+0

对于具有多条路径的多边形(例如甜甜圈),这不起作用。查看我的答案,了解正确处理多个路径的代码。 – 2013-12-17 22:44:38

15

我发现肖恩的代码非常简单和有帮助。当用户只剩下3个节点时,我只添加了一个限制器来停止删除。没有它,用户可以踏踏实实地只是一个节点,不能再编辑:

my_poly.addListener('rightclick', function(mev){ 
    if (mev.vertex != null && this.getPath().getLength() > 3) { 
     this.getPath().removeAt(mev.vertex); 
    } 
}); 
+1

剩下2个节点仍然可以,因为它们之间有淡化的节点来创建一个新的节点。但是,谢谢你的提示,我用它。 – Oliver 2013-04-25 13:33:41

2

只是觉得,因为我一直在寻找一个解决方案过于我会做出贡献,这是我实现:

if (m_event.hasOwnProperty('edge') && m_event.edge >= 0 && 
GeofenceService.polygon.getPath().getLength() > 3) { 
    GeofenceService.polygon.getPath().removeAt(m_event.edge); 
    return; 
} 

if (m_event.hasOwnProperty('vertex') && m_event.vertex >= 0 && 
GeofenceService.polygon.getPath().getLength() > 3) { 
    GeofenceService.polygon.getPath().removeAt(m_event.vertex); 
    return; 
} 

这允许用于处理顶点节点和边缘节点的删除,并通过检查路径长度> 3.

+0

这很好,所以你可以删除中点。谢谢。 – KeyOfJ 2016-02-24 17:51:14

8

我跑进情况下我需要删除维持最小时刻的三角形形成的多边形的来自包含多个路径的多边形的节点。这里是肖恩和邪恶的代码修改:

shape.addListener('rightclick', function(event){ 
    if(event.path != null && event.vertex != null){ 
    var path = this.getPaths().getAt(event.path); 
    if(path.getLength() > 3){ 
     path.removeAt(event.vertex); 
    } 
    } 
}); 
+0

今天需要!绝对做得很好! +1 – LokiSinclair 2014-02-11 12:50:15

+0

谢谢!这是一个救生员(: – 2015-10-23 17:51:35