Google Maps API捕捉标记到折线

时间:2018-06-22 08:27:43

标签: google-maps google-maps-api-3

我有一个折线列表(来自Google Directions API)已在Google Map上绘制。接下来,我希望我的标记沿着这条线移动而不使用Google Maps Roads API。

为解决这个问题,这是我目前正在做的事情:

  1. 从折线列表中,我选择路径A和B的两个端点。
  2. 从A到B找出方位。
  3. 在A和B之间创建相距1米的LatLng个点的列表。
  4. 遍历列表以检查最近的LatLng的GPS坐标。
  5. 将标记的位置设置为最近的LatLng

上面的方法在某些情况下有效,但大多数情况下标记显示为平行于不在其上的折线。

还有其他方法可以使我的标记捕捉到折线吗?

1 个答案:

答案 0 :(得分:0)

这是我自己的实现,用于将标记捕捉到折线(基于GPS位置):

首先,使用折线点创建距离更短的<head>列表(我使用的是LatLng函数中指定的一米距离):

splitPathIntoPoints

for (int i = 0; i < polylinePoints.size(); i++) { LatLng src = new LatLng(Double.parseDouble(polylinePoints.get(i).get("lat")), Double.parseDouble(polylinePoints.get(i).get("lng"))); if (polylinePoints.size() > i + 1) { LatLng dest = new LatLng(Double.parseDouble(polylinePoints.get(i + 1).get("lat")), Double.parseDouble(polylinePoints.get(i + 1).get("lng"))); List<LatLng> splitPoints = splitPathIntoPoints(src, dest); mSplitPoints.addAll(splitPoints); } else { break; } } 的代码:

splitPathIntoPoints

public static List<LatLng> splitPathIntoPoints(LatLng source, LatLng destination) { Float distance = findDistance(source, destination); List<LatLng> splitPoints = new ArrayList<>(); splitPoints.add(source); splitPoints.add(destination); while (distance > 1) { int polypathSize = splitPoints.size(); List<LatLng> tempPoints = new ArrayList<>(); tempPoints.addAll(splitPoints); int injectionIndex = 1; for (int i = 0; i < (polypathSize - 1); i++) { LatLng a1 = tempPoints.get(i); LatLng a2 = tempPoints.get(i + 1); splitPoints.add(injectionIndex, findMidPoint(a1, a2)); injectionIndex += 2; } distance = findDistance(splitPoints.get(0), splitPoints.get(1)); } return splitPoints; } 的代码:

findDistance

public static Float findDistance(LatLng source, LatLng destination) { Location srcLoc = new Location("srcLoc"); srcLoc.setLatitude(source.latitude); srcLoc.setLongitude(source.longitude); Location destLoc = new Location("destLoc"); destLoc.setLatitude(destination.latitude); destLoc.setLongitude(destination.longitude); return srcLoc.distanceTo(destLoc); } 的代码:

findMidPoint

一旦public static LatLng findMidPoint(LatLng source, LatLng destination) { double x1 = toRad(source.latitude); double y1 = toRad(source.longitude); double x2 = toRad(destination.latitude); double y2 = toRad(destination.longitude); double Bx = Math.cos(x2) * Math.cos(y2 - y1); double By = Math.cos(x2) * Math.sin(y2 - y1); double x3 = toDeg(Math.atan2(Math.sin(x1) + Math.sin(x2), Math.sqrt((Math.cos(x1) + Bx) * (Math.cos(x1) + Bx) + By * By))); double y3 = y1 + Math.atan2(By, Math.cos(x1) + Bx); y3 = toDeg((y3 + 540) % 360 - 180); return new LatLng(x3, y3); } 被较小的折线点填充,这些点之间相距1米,下面的函数将根据我当前的GPS位置在折线上找到捕捉的位置。请注意,mSplitPoints是我班级的私有字段,初始值设置为零。

mMinorIndexTravelled