MapQuest Android API を使用して、2 点間のルートを描画しています。私がやろうとしているのは、ルートに沿って複数のポイントを見つけて、パスに沿って 100 メートルごとに緯度と経度の値を言って、それを配列に格納することです。それを行う方法はありますか。私の質問が理解できるほど明確であることを願っています。
2 に答える
パス内のポイントの数を減らそうとしているが、パスの正確な表現を維持しようとしている場合は、ライン単純化アルゴリズムを使用することをお勧めします。
一般的な行単純化アルゴリズムは 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);
}
私はJavaとActionscriptで似たようなことをしました。
まず、まだ気付いていない場合は、ルートの各レグは直線です。ルートがまっすぐであればあるほど、足は少なくなります。
ルートに沿った等距離のポイント (私の場合はルートに沿った移動時間) を特定するには、[緯度、経度] 座標のセットを循環して、各区間の終点での累積距離を計算します。
この情報を使用すると、ループを簡単に変更して、脚に沿って距離ポイント (または複数のポイント) が発生する場所を確認できます。各脚が直線であることを思い出してください。もしそうなら、あなたが探している脚に沿った距離を特定し、そこからその脚に沿った点を計算するのは簡単です.
このためには、2 つのアルゴリズムが必要です。
- 2 つの [lat,lng] 座標間の距離
- 2 つの [緯度、経度] 座標間の直線に沿った x 距離のポイント
言うは易く行うは難しですが、これらは複雑なアルゴリズムであり、ネット上には疑わしい例がいくつかあります。私の意見では、数学がどのように機能するかをうまく説明している人はほとんどおらず、私が見つけたほとんどは不完全です.
次に、この宝石を見つけました: http://www.movable-type.co.uk/scripts/latlong.html
Chris Veness によるこの優れたリファレンスに基づいて、actionscript と Java でアルゴリズムを実装しました。
リンクは、必要なものすべてを提供する必要があります。何をする必要があるかの説明、疑似コードと JavaScript の両方での簡潔なアルゴリズム、およびそれで十分でない場合は、アルゴリズムをテストする機能。