谷歌地图 V3:如何检查标记是否存在于地图上?

31

在Google Maps V3中,是否有一种方法可以检查标记是否实际存在于地图上?

我有一些会在点击后消失的标记。我想要一些逻辑来检查标记当前的可见性。

例如:

var start_marker = null;
start_marker = new google.maps.Marker({ position: location, map: map, clickable: true });
google.maps.event.addListener(start_marker, 'click', function(event) {
  start_marker.setMap(null);
}); 
// ... Later in code: check whether marker is currently visible. 
console.log('Type of start_marker is now: ' + typeof(start_marker));

我本以为当标记不可见时,这会给我一个 null 类型,但实际上它仍然是一个对象。

那么,还有什么其他方法可以检查此特定标记是否在地图上可见?

谢谢!


1
PS:是的,一种方法是自己设置start_marker=null,但我想知道是否有内置的方法! - simon
标记已经存在且是一个对象,只是它没有绑定到地图上。 - Salman A
1
“在地图上可见”是指标记是否在用户的视口内?还是仅指标记已放置在地图上,无论它是否超出了用户缩放的范围? - Trott
1
特罗特的问题非常相关,它决定了哪个答案是正确的。 - Ryan Olds
5个回答

72

这个一行代码会在当前map边界下如果marker的位置被包含则返回true,否则返回false

map.getBounds().contains(marker.getPosition())

@Stavros:触发vp更改的最常见事件是拖动处理程序。因此,在vp更改后,您的地图bb中可能会重复点。因此,一旦创建了对象,就将其“删除”是一个非常糟糕的想法,因为很有可能在下一次拖动结束后再次需要它们。由于DOM调用非常“昂贵”,因此您应该明智地使用它们。实际上-在大多数情况下-保留事物是最好的方法,因为您(相对而言)确定不会再次需要它们。 - eyecatchUp
4
contains 只是表示“如果给定的经纬度在该边界内,则返回 true”,并没有实际告诉你在地图上是否已经放置了现有标记。 - johntrepreneur

11
start_marker.getMap()
如果您之前使用了像您示例中的“start_marker.setMap(null);”一样的代码,则会返回null。尽管如此,如果您只想隐藏和显示标记,为什么不使用setVisible和getVisible呢?

10
如果您只想隐藏/显示标记,可以使用标记的setVisible方法,例如:
``` 如果您只想隐藏/显示标记,可以使用标记的setVisible方法,例如: ```
 start_marker.setVisible(false);//to hide
 start_marker.setVisible(true);//to show

因为 setMap(null) 不是隐藏标记,而是将标记从地图中删除。

您可以使用 getVisible() 获取标记的可见性:

console.log('Type of start_marker is now: ' + start_marker.getVisible());

您可以在这里阅读它们: https://developers.google.com/maps/documentation/javascript/overlays#标记 https://developers.google.com/maps/documentation/javascript/overlays


48小时后,我找到了真正的解决方案来隐藏和显示地图标记。当使用地图聚类时,setMap()不会在边界更改时隐藏标记。这样可以保留它。 - Spencer May

5

0

我认为你需要改变你的逻辑。为什么不将你的标记存储在一个数组中,并在点击它们时从这个数组中完全删除它们。这样剩下的标记就是可见的。

祝好


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接