【问题标题】:If current bounds lie in others (many) bounds?如果当前界限位于其他(许多)界限中?
【发布时间】:2013-11-29 20:42:22
【问题描述】:

我正在使用谷歌地图 v3。 我想知道如果当前地图边界位于所有先前边界的总和中(当前边界的所有点都被其他边界覆盖)(如果不是,我将通过 ajax 加载当前边界的标记)

假设我有一个以前的视口边界数组,我这样做:

google.maps.event.addListener(map, 'idle',function() {
   var bounds = map.getBounds();
   boundsArray.push(bounds);
});

我现在发明的检查算法很难,如下:

1) 使用一些 $step (0.0001?) 生成当前边界的所有边缘点 (lan/lon),并将它们放入“pointsArray”中。

2) 遍历pointsArray,并检查当前点是否存在于至少一个先前的边界中:

来自 LatLngBounds 文档: contains(latLng:LatLng) boolean 如果给定,则返回 true lat/lng 在这个范围内。

所以,类似:

if (boundsArray[y].contains(pointsArray[i]) {

如果包含,则从 pointsArray 中删除该点

3) 最后,在所有迭代之后,如果 pointsArray 为空——这意味着当前边界的所有点都在另一个/s 边界内,并且函数返回 true...

在我看来,我的算法有 2 个缺点: 1) 它不是 100% 精确的(取决于 $step) 2) 更糟糕的是,它会导致客户端性能下降,全方位检查这么多点...因为 javascipt 是在用户 PC 上实现的。

那么,如果有更精确、更简单、更快的解决方案来解决我的问题?也许使用另一种数学方法,谷歌几何库等等?如何正确地做到这一点?

【问题讨论】:

  • 这听起来像是一个 XY 问题 meta.stackexchange.com/questions/66377/what-is-the-xy-problem - 请告诉我们有关 X 的情况。是不是您有太多标记需要修剪不在视口中的标记?
  • 对于每个当前视口 - 我必须从服务器加载标记数据,但如果当前视口在另一个视图内(对于我已经加载的标记)或者如果当前视图被覆盖,我不想这样做通过较早的视图(所以标记已经加载,我不应该再这样做了......)
  • 所以它一个优化/性能问题。你确定你需要这个吗?您不能只请求视口中的所有标记,删除视口之外的标记并跳过渲染重复项吗?这似乎是最直接的。
  • 如果没有简单的方法来做我想做的事,我会这样做......我也担心如果每个视图的标记数会很大(1000+),所有渲染的东西也可能是减缓。我想尽可能避免这种情况。
  • 好的,我明白了。那么假设视口只改变一点是否安全?比如,你向西移动 100 公里,而不是随机移动?因为那时我在您提出的解决方案中看到了用途。

标签: javascript google-maps


【解决方案1】:

当边界数组变得太大时,您可以删除它。然后你可以重新开始。然后比较边界要容易得多。

【讨论】:

  • 我担心,即使检查 2 个边界的点可能会很慢,因为点数会比较大(我想超过 1000 个)
猜你喜欢
  • 2011-12-20
  • 1970-01-01
  • 2015-06-13
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 2010-11-29
相关资源
最近更新 更多