0

Я использую API-интерфейс MapQuest для Android и прокладываю маршрут между двумя точками. То, что я пытаюсь сделать, это найти несколько точек вдоль маршрута, скажем, лат и длинные значения каждые 100 метров вдоль пути и сохранить их в массиве. Есть ли способ сделать это. Надеюсь, мой вопрос достаточно ясен, чтобы понять.MapQuest точки по маршруту

ответ

0

Если вы пытаетесь уменьшить количество точек в пути, но все равно сохраняете точное представление о пути, лучше всего использовать алгоритм упрощения линии.

алгоритма

Обычной линия упрощение Дуглас-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); 
} 
0

Я сделал что-то подобное в Java и ActionScript.

Во-первых, если вы еще не знали, каждая нога на маршруте у вас есть прямая линия. Чем выше маршрут, тем меньше у вас ног.

Чтобы определить точки равного расстояния по маршруту - или в моем случае, время в пути по маршруту - просто пройдите через набор [lat, long] coords, вычисляющих совокупное расстояние в конце каждой ноги.

Используя эту информацию, вы можете легко изменить свой цикл, чтобы проверить, где точка расстояния (или точки) встречается вдоль ноги. Помня, что каждая нога - прямая линия. Если это так, его достаточно просто, чтобы определить расстояние вдоль ноги, которое вы ищете, и из этого вычислите точку, которая находится так далеко по ноге.

Для этого нужно 2 алгоритма:

  1. расстояние между 2 [ш, LNG] координаты
  2. точка, которая, умноженная на расстояние вдоль линии между 2 [ш, LNG] координаты

Легче сказать, чем сделать, это сложные алгоритмы, и в сети есть некоторые сомнительные примеры. Немногие, на мой взгляд, неплохо объясняют, как работает математика, и мот, который я нашел, является неполным.

Тогда я нашел этот перл: http://www.movable-type.co.uk/scripts/latlong.html

Я реализовал свои алгоритмы в ActionScript и Java на основе этой прекрасной ссылки Криса Венесс.

Ссылка должна предоставить все необходимое. Объяснение того, что вам нужно сделать, сжатые алгоритмы как в psudocode, так и в javascript, и если этого недостаточно, это средство для проверки ваших алгоритмов.

Смежные вопросы