Карты Google для Android - сделайте полилинию более прямой/гладкой

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

Например. Во-первых, после прогулки я вижу свой путь вот так (это не полилиния, это полигон в примере, но я думаю, что вы поняли идею): https://www.dropbox.com/s/763mq0wja6x7lpy/11.png

Но после сохранения приложение сделало путь более прямым/гладким: https://www.dropbox.com/s/npwkz9coqve7m4g/22.png

Как это сделать? Потому что я понятия не имею.

Я рисую путь с LocationListener:

LocationManager locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);

    Criteria criteria = new Criteria();
  //criteria.setPowerRequirement(Criteria.POWER_LOW); 
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);
    criteria.setCostAllowed(true);
    criteria.setSpeedRequired(false);       
    String bestProvider = locationManager.getBestProvider(criteria, true);
    locationManager.requestLocationUpdates(bestProvider, 500, 3, this );

И прослушиватель onLocationChanged:

@Override
public void onLocationChanged(местоположение) {

          if(lastLocationloc == null) 
                          lastLocationloc = location;     
          LatLng lastLatLng= locationToLatLng(lastLocationloc);
          LatLng thisLatLng= locationToLatLng(location);
          mMap.addPolyline
                       (new PolylineOptions().add(lastLatLng).add(thisLatLng).width(4).color(Color.RED));
          lastLocationloc = location;             
  }

person Eddwhis    schedule 13.08.2013    source источник
comment
Не уверен, но думаю, это только из-за ваших lastLatLng и thisLatLng. Информация о широте и долготе всегда немного шаткая, поэтому, если вы используете это как прямой ввод для рисования линии... линия будет шаткой. Вы можете попытаться немного изменить информацию о широте, чтобы уменьшить шум, но это может быть сложно.   -  person Stefan de Bruijn    schedule 13.08.2013
comment
Что вы имеете в виду, говоря «отрегулируйте свой латлонг»?   -  person Eddwhis    schedule 13.08.2013


Ответы (1)


LocationManager никогда не даст вам точное местоположение. Поэтому, хотя вы можете идти не по ровной дороге, GPS-координаты, которые вы получаете, всегда будут скачкообразными, даже если вы установите очень высокую точность в своих критериях.

Таким образом, когда вы рисуете путь, вы можете использовать Android Path API

Для некоторого кода по этому поводу посмотрите этот ответ:

Android Как нарисовать плавную линию, следуя твой палец

person alvi    schedule 13.08.2013
comment
А где мне найти функцию quadTo для карт? Потому что я думаю, что это то, что я искал. Или как-то использовать функцию пути для карты? - person Eddwhis; 13.08.2013
comment
Это идет немного дальше, чем может вместить это пространство. Вкратце: вам нужно создать свой собственный оверлей и добавить его на карту. В Overlay вы переопределяете метод draw(Canvas canvas, MapView mv,...). Холст важен, так как теперь вы можете рисовать прямо на карте. Чтобы преобразовать местоположения в соответствующие пиксели на карте, вам нужно будет получить проекцию и преобразовать в пиксели следующим образом: mapView.getProjection().toPixels(...). в этот момент вам нужно будет применить метод Path.quadTo(), чтобы нарисовать плавный путь. - person alvi; 13.08.2013
comment
Хорошо, у меня есть идея, но я думаю, что это не будет работать правильно. Поскольку вы можете ходить и в то же время перетаскивать карту (или камера карты может следить за вашим движением), поэтому я думаю, что ваш метод может провести линию к неправильным пикселям. Но, кстати, просматривая приведенные вами ссылки, я случайно нашел эту ссылку johan.karlsteen.com/2011/07/30/ , и это лучшее решение, которое я нашел до сих пор. Спасибо за вашу помощь! - person Eddwhis; 13.08.2013
comment
хорошая ссылка. относительно неправильных пикселей: этого не произойдет. draw вызывается при каждом обновлении на пустом холсте. Таким образом, вы можете масштабировать, панорамировать, делать что угодно... пока вы получаете текущую проекцию и используете ее для преобразования координат широты/долготы в пиксели, вы получите правильный результат. - person alvi; 13.08.2013