Проверьте, находится ли пользователь рядом с контрольной точкой маршрута с помощью GPS. - PullRequest
5 голосов
/ 19 декабря 2011

Вот ситуация:

У меня есть заранее определенный маршрут GPS, по которому будет работать пользователь. Маршрут имеет несколько контрольных точек, и пользователь должен проходить рядом со всеми из них (думайте о них как о контрольной точке гоночной игры, которая не позволяет пользователю использовать ярлыки). Мне нужно убедиться, что пользователь проходит через все контрольные точки. Я хочу определить область, которая будет рассматриваться в радиусе контрольной точки, но я не хочу, чтобы это была просто радиальная область, это должна быть область, учитывающая форму пути. Не поняла это? Я тоже. Посмотрите на это плохо нарисованное изображение, чтобы лучше понять его: Route example

Черные линии представляют собой заранее определенный путь, синий шар - это контрольная точка, а синий многоугольник - искомая область. Зеленая линия - более точный пользователь, а красная линия - менее точный пользователь (пьяный парень, возможно, за рулем? Лол). Обе линии должны быть внутри многоугольника, но пользователь, который полностью пропускает маршрут, не должен.

Я уже видел где-то здесь функцию, которая проверяет, находится ли пользователь внутри многоугольника, как это, но мне нужно знать, как рассчитать многоугольник.

Есть предложения?

EDIT:

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

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

Ответы [ 3 ]

2 голосов
/ 19 декабря 2011

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

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

Edit

Поскольку вы хотите избежать distanceTo, вот небольшая функция, которую я написал некоторое время назад, чтобы проверить, является ли точкав многоугольнике:

public boolean PIP(Point point, List<Point> polygon){
    boolean nodepolarity=false;
    int sides = polygon.size();
    int j = sides -1;
    for(int i=0;i<sides;i++){
        if((polygon.get(i).y<point.y && polygon.get(j).y>=point.y) ||(polygon.get(j).y<point.y && polygon.get(i).y>=point.y)){
            if (polygon.get(i).x+(point.y-polygon.get(i).y)/(polygon.get(j).y-polygon.get(i).y)*(polygon.get(j).x-polygon.get(i).x)<point.x) {
                nodepolarity=!nodepolarity; 
            }
        }
    j=i;
    }
    return nodepolarity; //FALSE=OUTSIDE, TRUE=INSIDE
}

List<Point> polygon - это список точек, составляющих многоугольник.

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

Все, что вам нужно сделать, - это создать «границу» вокруг нужной области с переводом GeoPoints в пиксели с использованием метода toPixels .

Сохраните эти точки в Список <> точек, и все должно быть готово.

1 голос
/ 15 мая 2013

Я знаю, что это старый вопрос, но, возможно, он кому-нибудь пригодится.

Это более простой метод, требующий гораздо меньших вычислений.Это не сработает при первом входе пользователя в пороговую область, оно получит только самую близкую точку, где пользователь прошел вблизи контрольной точки И (и) он достаточно близко подошел.

Идея состоит в том, чтобы поддерживатьсписок из 3 пунктов расстояний для каждой контрольной точки, с последними тремя расстояниями в нем (таким образом, это будет [d (t), d (t-1), d (t-2)]).Этот список следует вращать при каждом расчете расстояния.

Если при любом расчете расстояния предыдущее расстояние d (t-1) меньше текущего d (t) и больше предыдущего d (t-2)), то точка перемещения прошла контрольную точку.Было ли это реальным проходом, или это был только сбой, можно определить, проверив фактическое расстояние d (t-1).

private long DISTANCE_THRESHOLD = 2000;

private Checkpoint calculateCheckpoint(Map<Checkpoint, List<Double>> checkpointDistances)
{
    Map<Checkpoint, Double> candidates = new LinkedHashMap<Checkpoint, Double>();
    for (Checkpoint checkpoint: checkpointDistances.keySet())
    {
        List<Double> distances = checkpointDistances.get(checkpoint);
        if (distances == null || distances.size() < 3)
            continue;
        if (distances.get(0) > distances.get(1) && distances.get(1) < distances.get(2) && distances.get(1) < (DISTANCE_THRESHOLD))  //TODO: make this depend on current speed
            candidates.put(checkpoint, distances.get(1));
    }

    List<Entry<Checkpoint, Double>> list = new LinkedList<Entry<Checkpoint,Double>>(candidates.entrySet());
    Collections.sort(list, comp);

    if (list.size() > 0)
        return list.get(0).getKey();
    else
        return null;
}

Comparator<Entry<Checkpoint, Double>> comp = new Comparator<Entry<Checkpoint,Double>>()
{
    @Override
    public int compare(Entry<Checkpoint, Double> o1, Entry<Checkpoint, Double> o2)
    {
        return o1.getValue().compareTo(o2.getValue());
    }
};

Функция получает один параметр - Map<Checkpoint, List<Double>> сконтрольные точки и список последних трех расстояний.Он выводит ближайший Checkpoint пройденный или null (если их не было).DISTANCE_THRESHOLD следует выбирать с умом.Comparator просто для того, чтобы иметь возможность сортировать контрольные точки по их расстоянию до пользователя, чтобы получить самую близкую.

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

1 голос
/ 19 декабря 2011

отметьте несколько алгоритмов, чтобы сделать это по ссылке ниже

http://geospatialpython.com/2011/01/point-in-polygon.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...