Как определить, не в курсе ли я на Android MapView - PullRequest
0 голосов
/ 08 марта 2012

Итак, я наметил маршрут GPX в моем MapView, и я слушаю изменения местоположения.

В конечном итоге я хочу уведомлять пользователей, когда они выключены / находятся на курсе.

Итак, я могу себе представить, как грубой силой проходят все мои координаты GPX, и создаю Location.distanceTo для каждого для каждого из них.Но это кажется дорогим.

Я мог бы снизить стоимость, делая это нечасто.

Мне интересно, есть ли у кого-нибудь умная идея для достижения этой цели?

Ответы [ 2 ]

0 голосов
/ 08 марта 2012

Вы можете использовать функцию distanceTo, но не внутри onLocationChanged (потому что она вызывается очень часто), вы должны сделать таймер и проверить, уходит ли пользователь с курса каждые 5 секунд (например), этокак реализовать таймер:

1 - объявить это как глобальную переменную:

private Timer myTimer;

2 - добавить этот код в onCreate():

                myTimer = new Timer();
                myTimer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        TimerMethod();
                    }

                }, 0, 5000);

3- добавьте эти две функции в свой класс:

     private void TimerMethod()
        {
            this.runOnUiThread(Timer_Tick);
        }

     private Runnable Timer_Tick = new Runnable() {
            public void run() {
                //do your test for off course here
            }
        };

Удачи

0 голосов
/ 08 марта 2012

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

Затем в какой-то момент вам необходимо осознать, что пользователь подошел как можно ближе к Текущему и теперь движется к Следующему.Затем вы сдвинете точки вниз (Last = Current; Current = Next; Next = ???;).Опять же, есть несколько способов сделать это определение (пользователь достаточно близко подошел к Текущему, пользователь движется к Следующему, отходит от Текущего и т. Д.)на случай, если вы пропустите несколько баллов, особенно когда баллы расположены близко друг к другу, но вы не хотите делать слишком много.Проверьте свой маршрут с петлями в дорожках и убедитесь, что вы не прыгаете вперед.Возможно, вам также потребуется реализовать какой-то метод holyExpletiveIHaveNoIdeaWhereTheUserIsGoing() для восстановления после (неизбежных) ошибок.

...