2016-07-23 1 views
1

В моем приложении я рисую полилинию для каждого изменения местоположения, пока я путешествую. Это может быть для 8-часового похода, чтобы я мог нанести десятки тысяч очков.PolyLines на google maps android для каждого изменения местоположения, новых полилиний или setPoints?

В моем тестировании я заметил, что, когда я масштабируюсь довольно близко (скажем, 17 или 18), он отлично работает даже после построения тысяч строк, но когда я уменьшаю масштаб, и карта должна отображать ВСЕ из этих строк, он становится вялым, поскольку мой телефон пытается все обработать.

Другой вариант, который я знаю для рисования полилиний, - создать коллекцию (ArrayList) всех моих точек (LatLng) и передать ее методу setPoints() для PolyLine, который рисует одну строку. Очевидно, что это отлично работает при просмотре трека после этого факта, но я бы предположил, что внутренности setPoints() должны зацикливаться на всем наборе для каждой новой точки, которая добавляется для рисования этой одной строки, что в конечном итоге, вероятно, хуже, он должен делать это, видны ли более старые точки (в пределах области просмотра) или нет.

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

любые идеи/предложения приветствуются.

TIA

ответ

2

Это то, что я придумал как решение. Это может быть не самый элегантный, но я просто ездил на более чем 40 миль в моей машине, и когда я увеличил масштаб, у меня не было никакого отставания. Я также чувствую, что только создавая одну большую линию каждые 100 пунктов (примерно каждые 100 секунд, так как мой приемник места срабатывает только каждую секунду), я сохраняю обработку, чтобы зацикливать мой latlng-массив для каждого изменения местоположения. Теперь мне просто нужно проверить это на реальном пути :)

// create and add new poly line to map from previos location to new location 
      PolylineOptions lineOptions = new PolylineOptions() 
        .add(new LatLng(previousLocation.getLatitude(), previousLocation.getLongitude())) 
        .add(new LatLng(location.getLatitude(), location.getLongitude())) 
        .color(Color.GREEN) 
        .width(5); 
      // add the polyline to the map 
      Polyline polyline = map.addPolyline(lineOptions); 
      // set the zindex so that the poly line stays on top of my tile overlays 
      polyline.setZIndex(1000); 
      // add the poly line to the array so they can all be removed if necessary 
      polylines.add(polyline); 
      // add the latlng from this point to the array 
      allLatLngs.add(currentLocationLatLng); 

      // check if the positions added is a multiple of 100, if so, redraw all of the polylines as one line (this helps with rendering the map when there are thousands of points) 
      if(PositionsAdded % 100 == 0) { 
       // first remove all of the existing polylines 
       for(Polyline pline : polylines) { 
        pline.remove(); 
       } 
       // create one new large polyline 
       Polyline routeSoFar = map.addPolyline(new PolylineOptions().color(Color.GREEN).width(5)); 
       // draw the polyline for the route so far 
       routeSoFar.setPoints(allLatLngs); 
       // set the zindex so that the poly line stays on top of my tile overlays 
       routeSoFar.setZIndex(1000); 
       // clear the polylines array 
       polylines.clear(); 
       // add the new poly line as the first element in the polylines array 
       polylines.add(routeSoFar); 
      }