MapQuest指向一条路线

时间:2013-09-29 12:24:21

标签: android google-maps-android-api-2 openstreetmap direction mapquest

我正在使用MapQuest Android API并在两点之间绘制路线。我要做的是沿着路线找到多个点,比如路径上每100米处的纬度和长值,并将其存储在一个数组中。有没有办法做到这一点。我希望我的问题很清楚,可以理解。

2 个答案:

答案 0 :(得分:0)

如果您尝试减少路径中的点数,但仍保持路径的准确表示,最好的办法是使用线简化算法。

常见的行简化算法是Douglas-Peucker,在Google MyTracks项目中有一个Douglas-Peucker的实现,您可以使用它,在Apache v2.0下获得许可: https://code.google.com/p/mytracks/source/browse/MyTracks/src/com/google/android/apps/mytracks/util/LocationUtils.java#78

以下是代码,以防链接中断:

/**
 * Decimates the given locations for a given zoom level. This uses a
 * Douglas-Peucker decimation algorithm.
 * 
 * @param tolerance in meters
 * @param locations input
 * @param decimated output
 */
private static void decimate(double tolerance, ArrayList<Location> locations, ArrayList<Location> decimated) {
  final int n = locations.size();
  if (n < 1) {
    return;
  }
  int idx;
  int maxIdx = 0;
  Stack<int[]> stack = new Stack<int[]>();
  double[] dists = new double[n];
  dists[0] = 1;
  dists[n - 1] = 1;
  double maxDist;
  double dist = 0.0;
  int[] current;

  if (n > 2) {
    int[] stackVal = new int[] { 0, (n - 1) };
    stack.push(stackVal);
    while (stack.size() > 0) {
      current = stack.pop();
      maxDist = 0;
      for (idx = current[0] + 1; idx < current[1]; ++idx) {
        dist = LocationUtils.distance(
            locations.get(idx), locations.get(current[0]), locations.get(current[1]));
        if (dist > maxDist) {
          maxDist = dist;
          maxIdx = idx;
        }
      }
      if (maxDist > tolerance) {
        dists[maxIdx] = maxDist;
        int[] stackValCurMax = { current[0], maxIdx };
        stack.push(stackValCurMax);
        int[] stackValMaxCur = { maxIdx, current[1] };
        stack.push(stackValMaxCur);
      }
    }
  }

  int i = 0;
  idx = 0;
  decimated.clear();
  for (Location l : locations) {
    if (dists[idx] != 0) {
      decimated.add(l);
      i++;
    }
    idx++;
  }
  Log.d(Constants.TAG, "Decimating " + n + " points to " + i + " w/ tolerance = " + tolerance);
}

答案 1 :(得分:0)

我在Java和Actionscript中做过类似的事情。

首先,如果您还不知道,您所拥有的路线中的每条腿都是一条直线。路线越直,你的腿越少。

识别沿着路线的相等距离​​的点 - 或者在我的情况下,沿着路线的行进时间 - 简单地循环通过计算每条腿末端的累积距离的[纬度,长度]坐标的集合。

使用此信息,您可以轻松修改循环以检查沿着腿的距离点(或多个点)发生的位置。记住每条腿都是一条直线。如果是这样,它足够简单,以确定您正在寻找的腿的距离,并从中计算出沿腿远的点。

为此你需要2个算法:

  1. 2 [lat,lng]坐标之间的距离
  2. 沿2 [lat,lng]坐标
  3. 之间的直线x距离的点

    说起来容易做起来难,这些都是复杂的算法,网上有一些可疑的例子。我认为很少有人能够解释数学如何运作,而且我发现的动机是不完整的。

    然后我找到了这个宝石:http://www.movable-type.co.uk/scripts/latlong.html

    我基于Chris Veness的这篇优秀参考资料在actionscript和java中实现了我的算法。

    链接应该提供您需要的一切。解释你需要做什么,在psudocode和javascript中简明算法,如果这还不够,那就是测试算法的工具。