Я использую API-интерфейс MapQuest для Android и прокладываю маршрут между двумя точками. То, что я пытаюсь сделать, это найти несколько точек вдоль маршрута, скажем, лат и длинные значения каждые 100 метров вдоль пути и сохранить их в массиве. Есть ли способ сделать это. Надеюсь, мой вопрос достаточно ясен, чтобы понять.MapQuest точки по маршруту
ответ
Если вы пытаетесь уменьшить количество точек в пути, но все равно сохраняете точное представление о пути, лучше всего использовать алгоритм упрощения линии.
алгоритмаОбычной линия упрощение Дуглас-Peucker, и есть реализация Дуглас-Peucker в проекте Google MyTracks, которые вы можете использовать, под лицензией Apache версии 2.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.
Во-первых, если вы еще не знали, каждая нога на маршруте у вас есть прямая линия. Чем выше маршрут, тем меньше у вас ног.
Чтобы определить точки равного расстояния по маршруту - или в моем случае, время в пути по маршруту - просто пройдите через набор [lat, long] coords, вычисляющих совокупное расстояние в конце каждой ноги.
Используя эту информацию, вы можете легко изменить свой цикл, чтобы проверить, где точка расстояния (или точки) встречается вдоль ноги. Помня, что каждая нога - прямая линия. Если это так, его достаточно просто, чтобы определить расстояние вдоль ноги, которое вы ищете, и из этого вычислите точку, которая находится так далеко по ноге.
Для этого нужно 2 алгоритма:
- расстояние между 2 [ш, LNG] координаты
- точка, которая, умноженная на расстояние вдоль линии между 2 [ш, LNG] координаты
Легче сказать, чем сделать, это сложные алгоритмы, и в сети есть некоторые сомнительные примеры. Немногие, на мой взгляд, неплохо объясняют, как работает математика, и мот, который я нашел, является неполным.
Тогда я нашел этот перл: http://www.movable-type.co.uk/scripts/latlong.html
Я реализовал свои алгоритмы в ActionScript и Java на основе этой прекрасной ссылки Криса Венесс.
Ссылка должна предоставить все необходимое. Объяснение того, что вам нужно сделать, сжатые алгоритмы как в psudocode, так и в javascript, и если этого недостаточно, это средство для проверки ваших алгоритмов.