我正在使用MapQuest Android API并在两点之间绘制路线。我要做的是沿着路线找到多个点,比如路径上每100米处的纬度和长值,并将其存储在一个数组中。有没有办法做到这一点。我希望我的问题很清楚,可以理解。
答案 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个算法:
说起来容易做起来难,这些都是复杂的算法,网上有一些可疑的例子。我认为很少有人能够解释数学如何运作,而且我发现的动机是不完整的。
然后我找到了这个宝石:http://www.movable-type.co.uk/scripts/latlong.html
我基于Chris Veness的这篇优秀参考资料在actionscript和java中实现了我的算法。
链接应该提供您需要的一切。解释你需要做什么,在psudocode和javascript中简明算法,如果这还不够,那就是测试算法的工具。