Как реализовать оперативное обновление текущего местоположения пользователя? - PullRequest
4 голосов
/ 07 февраля 2012

Я использую MyLocationOverlay для отображения текущего местоположения.Однако обновление местоположения занимает некоторое время.Я хотел реализовать что-то вроде функции «следуй за мной» на iPhone, в которой местоположение пользователя также перемещается по мере его перемещения.Как я могу сделать маркер MyLocationOverlay для оперативного обновления его местоположения?

Обратите внимание, что я переопределяю draw () и drawMyLocation (), потому что мне нужно нарисовать собственный маркер.

Мой текущий код выглядит следующим образом: (Проблема с моим кодом заключается в том, что маркер не перемещается вместе с пользователем. Поскольку требуется некоторое время, прежде чем вызывается onLocationChanged, маркер просто внезапно перепрыгивает с одного места на другое.)

@Override
public synchronized void onLocationChanged(Location location)
{
    if (location != null && mapController != null)
    {
        //Recenter map based on current location
        mapController.animateTo(new GeoPoint((int) (location.getLatitude() * 1e6), (int) (location.getLongitude() * 1e6)));
    }
    super.onLocationChanged(location);
}

1 Ответ

2 голосов
/ 07 февраля 2012

Вы можете задать диспетчеру местоположения минимальный интервал ожидания между вызовами этого метода, но он не будет полностью напоминать, что этот интервал 100% времени (см. Описание LocationManager.requestLocationUpdates () ).Может быть короче, может быть дольше - потому что, например, он может быть облачным, а чип GPS не сможет получать обновления местоположения так часто, как вы этого хотите.

Нет правильного способа преодолеть это- услуги определения местоположения всегда будут иметь недостатки.Каждое приложение, учитывающее местоположение, которое я использовал, время от времени «подвешивало» маркер, потому что чип gps на мгновение терял свое значение.

Единственное, что вы можете сделать, чтобы немного сгладить это, - это запомнить скорость движения иесли gps lost fix дает поддельные обновления маркера карты, исходя из предположения, что пользователь движется в том же направлении с той же скоростью, с которой он был, когда gps имел исправление.Но это имеет смысл делать только для 2-5 пропущенных реальных обновлений (просто для сглаживания случаев, когда исправление потеряно на несколько секунд).

UPD Для этого вы можете реализоватьвид прослушивателя местоположения прокси, который будет обновлять маркер строго с учетом заданных интервалов, например каждые 200 мс, и делать это в зависимости от сохраненного местоположения.И сохраненное местоположение может быть асинхронно обновлено слушателем реального местоположения.У объектов местоположения есть время исправления, которое предоставило данные (см. getTime () метод), вы можете использовать это, чтобы определить, должны ли вы все еще «прогнозировать» следующее движение маркера, или местоположение достаточно старое, чтобы сдаться иуведомить пользователя, что gps не знает, где он находится:)

...