【发布时间】: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 公里,而不是随机移动?因为那时我在您提出的解决方案中看到了用途。