将 infoWindow 放置在远离重叠多段线的位置

Position infoWindow away from overlapping polyline

我正在开发一个 Android 应用程序,其中包含一个 activity 和 google 地图,我在其中用多段线绘制了两个位置之间的路径。我在源和目的地添加了标记,信息窗口显示了一些数据,但这些信息窗口阻止了折线并使用户缩放地图以查看路径。有没有办法像 Uber 那样移动信息窗口?

如有任何帮助,我们将不胜感激。 谢谢。

这个问题实际上有两个部分:(1) 确定您想要信息的位置 window 和 (2) 如何获取信息。我将主要关注 (1) 并尝试帮助参考 (2)。

(请注意,还有第三个问题可以从动画 gif 中推断出来:"Home" 的信息 window 已调整,因为它在最终视图中被剪裁了 - 我添加了最后的方法。)

(1) 的一种方法是在从 A 点到 B 点的路径周围创建一个边界矩形。这是对问题的简化,虽然有待展示的缺点,但却是一个很好的初始方法。我认为您很快就会意识到在极端情况下可以更好地适应位置的优化。

使用此边界矩形 (R) 确定相对于感兴趣的标记锚点的最小尺寸(d1 与 d2)。

然后使用最小尺寸,您可以计算从锚点到信息最近边的屏幕距离 window (f)。从这个最近的点,您可以确定信息的锚点偏移量 window.

首先是一些有几个用途的图片:(a) 通过标签识别关键位置和 (b) 开始考虑更复杂的问题:

最简单的情况如图所示...:

...但是标签有点挤,所以这里显示了第二个松散的案例:

虽然效率低下,但确定边界矩形很简单。遍历路径点(从我的位置到家)并保持纬度和经度的最大值和最小值(请注意,-180 度到 180 度经度交叉是一种普遍的复杂性,此处未解决 - 请记住这一点)。这产生:

LatLng upperLeft (maxLat, minLng)
LatLng lowerRight (minLat, maxLng)

那么确定A的信息window的位置就是:

Compute the length (in meters) from A to side of rectangle by using Point A to (A lat, M lng) and Point A to (M lat, A Lng).  (Use `SphericalUtil.distanceBetween`)

Determine the lesser of the two measurements, L.

Use L (distance in meters) to compute a screen pixel equivalent S.

Adjust S to offset from edge of BR (Sadj)

Use Sadj (in screen pixels) to compute the Info Window offset (in screen pixels) taking into account the Info Window anchor point and the dimension of the Info Window.

Set the info window anchor (which is relative to the marker coordinate system) and render.

优化:假设您希望第 2 张图片中 'Home' 的位置类似于:

然后优化将是考虑仅使用较近路径段的某些子集的较小边界矩形。因此,这导致了下一个问题,即确定何时使用 d1/d2 的阈值进行优化。当缩放级别不包括两个点时,将使用相同的优化;只需使用屏幕上的点来计算边界矩形。

对于第三个问题 "Home" 在缩放后被裁剪是为了在应用边界矩形时考虑信息的尺寸window - 这样最小尺寸将始终包括相应的信息范围 window.