这个问题实际上有两个部分:(1)确定您想要信息窗口的位置以及(2)如何到达那里。我将主要关注 (1) 并尝试为 (2) 提供参考。
(请注意,可以从动画 gif 中推断出第三个问题:“Home”的信息窗口已调整,因为它在最终视图中被剪辑 - 我在最后添加了一种方法。)
(1) 的一种方法是围绕从 A 点到 B 点的路径创建一个边界矩形。这是对问题的简化,它有待展示的缺点,但它是一个很好的初始方法。我认为您很快就会意识到一些优化,以更好地适应极端情况下的位置。
使用此边界矩形 (R) 确定相对于感兴趣的标记锚点的最小尺寸(d1 与 d2)。
然后,您可以使用最小尺寸计算从锚点到信息窗口最近一侧的屏幕距离 (f)。然后,您可以从这个最近的点确定信息窗口的锚点偏移量。
首先是一些有多种用途的图片:(a) 通过标签识别关键位置和 (b) 开始考虑更复杂的问题:
最简单的情况如下图……:
...但是标签有点挤,所以这里描绘了第二个松散的情况:
确定边界矩形是直截了当的,尽管效率低下。循环遍历路径点(从我的位置到家)并保持最大和最小纬度和经度(请注意,-180 到 180 经度交叉是一种普遍的复杂性,这里没有解决 - 请记住它)。这产生:
LatLng upperLeft (maxLat, minLng)
LatLng lowerRight (minLat, maxLng)
那么建立A的信息窗口的位置就是:
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.
优化:假设您更喜欢第二张图片中“家”的位置:
那么优化将是考虑一个较小的边界矩形,仅使用路径的较近段的一些子集。因此这导致了下一个问题,即确定何时使用 d1/d2 的阈值进行优化。当缩放级别不包括两个点时,将使用相同的优化;只需使用屏幕上的点来计算边界矩形。
对于第三个问题,在缩放后剪裁“主页”是为了在应用边界矩形时考虑信息窗口的尺寸 - 这样最小尺寸将始终包括信息窗口的相应范围。