2010-06-30 76 views
5

我正在构建一个ASP.NET MVC网站,我希望Google Maps JavaScript API地图显示通过AJAX从后端加载的标记。将标记延迟加载到Google Maps JavaScript API地图的策略

由于我不希望客户端遇到内存问题,我想延迟加载标记并将它们应用于Fluster2,以将它们放入集群。我认为延迟加载标记的最佳方式是将事件侦听器添加到Map的idle事件中,该事件在地图平移或缩放后发生。


这是我目前的策略:

  1. 事件侦听器添加到idle事件。
  2. idle事件被抛出时,使用jQuery对我的后端进行AJAX HTTP POST调用,提供地图的当前视口/边界。
  3. 后端返回视口内的所有点。
  4. 这些点被创建为标记并添加到Fluster2,它将它们添加到地图中。旧点不会被丢弃。
  5. 重复

然而,这可能会产生问题,因为老点不被丢弃。我不想丢弃它们,因为我不想再次加载它们,但是按照我目前的策略,我会再次加载它们并为它们再次创建标记。

虽然我觉得在AJAX调用中告诉后端不是一个好主意,我已经有了一些标记,但是实现某种不允许重复的散列表

这样,当我加载点时,我可以尝试将它们添加到哈希表中:如果成功,我还没有显示它们,所以我可以将它们添加为标记;如果失败了,他们已经在地图上了。


这是一个很好的策略吗?如果是这样,我怎么能实现一个不允许重复的哈希表?

回答

3

我最近实现了一些非常相似的东西;虽然我个人选择删除所有标记并完全填充地图,但我确实喜欢您的整体策略,并认为它可能会让用户体验更流畅,因为删除所有标记和添加新标记之间的短暂闪烁消失。所以,是的,我认为这是一个很好的策略。

空闲是一个有趣的事件;我发现在Zoom等上没有很好地工作,并为TileLoaded(或类似的)解决了问题。对我来说工作得很好,但看起来有点像黑客。

关于你的hashtable问题 - 有两种可能的地方你可以存储这样的地图。

a)服务器 如果您可以跟踪要发送坐标的页面,则可以在会话状态下保留标记的Dotnet哈希表。这可能会阻止您向客户端发送不必要的坐标,但是更多的是错误产生的。imo

b)客户端 这可能是您想要去的任何地方。在这里,一个正常的Javascript关联数组应该是你的朋友。

var x = {"some key": "some value"}; 
document.write ("some key" in x); // True 
document.write ("some other key" in x); // False 

除非你找到映射纬度和经度到一个单一的可哈希值的好方法,你可能要保持数组的数组:

var markers = {lat1: {lng11: 1, lng12: 1, lng13: 1}, lat2: ...} 

,然后检查类似

... 
if (checklat in markers) 
    if (checklng in markers[checklat]) 
     return True 
return False 

我只是看到这是一个老问题。太晚了,也许它仍然有帮助。

+0

感谢您的帮助!我会尽力实现这一点。 – 2010-07-25 00:52:31

+0

对于散列键,您可以从lat/long创建一个google.maps.latLng对象,并使用它的toString()方法。 – dsas 2013-04-04 13:47:18