将infoWindow的位置远离重叠的折线

时间:2018-07-19 05:04:11

标签: android google-maps google-maps-markers google-polyline polylineoptions

我正在开发一个Android应用程序,其中包含一个带有google maps的活动,其中我用折线绘制了两个位置之间的路径。我在信息源和目标处添加了标记,其中信息窗口显示了一些数据,但是这些信息窗口会阻止折线,并使用户缩放地图以查看路径。有没有一种方法可以像Uber一样移动信息窗口?Sample example of what I'm trying to achieve

任何帮助将不胜感激。 谢谢。

1 个答案:

答案 0 :(得分:1)

此问题实际上有两部分:(1)确定您要在哪里放置信息窗口,以及(2)如何将其到达那里。我将主要关注(1),并尝试为(2)提供参考。

(请注意,还有第三个问题可以通过动画gif来推断:“首页”的信息窗口已调整,因为它已在最终视图中被裁剪-我在此末尾添加了一种方法。)

(1)的一种方法是在从点A到点B的路径周围创建一个边界矩形。这是问题的简化,虽然有不足之处,但是一种很好的初始方法。我认为您会很快实现一些优化,以便在极端情况下更好地适应该位置。

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

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

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

最简单的情况如下所示:

enter image description here

...但是标签有点塞满了,所以在这里显示了第二个较松的情况:

enter image description here

确定边界矩形是很简单的,尽管效率很低。循环遍历路径的各个点(从“我的位置”到“家”),并保持纬度和经度的最大值和最小值(请注意,-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.

优化:假设您希望第二张图片中“家”的位置类似于:

enter image description here

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

对于第三个问题,在缩放后裁剪“主页”是为了在应用边界矩形时考虑信息窗口的尺寸-这样,最小尺寸将始终包括信息窗口的相应范围。