Поиск, находится ли заданная позиция (широта, долгота) в пределах BoundingBox двух координат (route-me)

Я работаю над приложением для iPhone, используя проект Route-Me. Я использую метод с именем 'latitudeLongitudeBoundingBoxForScreen', который возвращает набор из двух cooördinates. Определение северо-восточных и юго-западных углов в широте / долготе экрана. Кажется, это работает нормально.

Мой вопрос: как я могу определить, находится ли данная точка (широта / долгота) в границах этих двух координат (северо-восток, юго-запад)?

Заранее большое спасибо за вашу помощь.

2 ответа

Решение

Для общей точки в многоугольнике, тест включения точек, кажется, работает в предположении тривиальной эквиктангулярной проекции (x = lon, y = lat).

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

Это сломается, если ограничивающий прямоугольник пройдет через линию 180 лон. Простое исправление заключается в том, что если поле, которое пересекает линию 180 лон, должно добавить 360 к отрицательной долготе. Это недопустимая точка навигации, но она делает математическую работу.

Это также не будет работать вокруг полюсов.

Я знаю, что прошло много времени, но, возможно, кто-то все еще заинтересован.

    Double lat_A, lat_B,lng_A, lng_B, curr_lat,curr_lng;
    LatLng nw_corner, sw_corner;
    Boolean lat_OK,lng_OK,all_OK;
    int t_segs, points;
    t_segs = segments.size()-1;
    curr_lat = curr_LatLng.latitude;
    curr_lng = curr_LatLng.longitude;
    lat_A = list_segm_points.get(0).latitude;
    lng_A = list_segm_points.get(0).longitude;
    lat_B = list_segm_points.get(t_segs).latitude;
    lng_B = list_segm_points.get(t_segs).longitude;

    if (lat_A > lat_B ) {
        lat_OK = curr_lat < lat_A && curr_lat > lat_B;
    } else {
        lat_OK = curr_lat > lat_A && curr_lat < lat_B;
    }
    if (lng_A > lng_B ) {
        lng_OK = curr_lng < lng_A && curr_lng > lng_B;
    } else {
        lng_OK = curr_lng > lng_A && curr_lng < lng_B;
    }
    all_OK = lat_OK && lng_OK;
    return all_OK;
Другие вопросы по тегам