Проверете дали дадена точка на географска ширина и дължина се намира по протежение на маршрута от A до B

Работя с приложение за android и трябва да разбера дали дадена точка на географска ширина и дължина се намира по маршрута от А до Б.

Използвам LatLngBounds за това. Работи, когато маршрутът е само от югозапад до североизток, но никога не работи за други маршрути (СИ до ЮЗ или ЮИ до СЗ или СЗ към ЮИ). Дава грешен резултат за NW към SW и грешка за SE към NW или NW към SE.

Опитах да използвам LtLngBounds.Builder() за другите три случая, т.е. СИ към ЮЗ или ЮИ към СЗ или СЗ към ЮИ. Но кодът не работи за тях. Следва кодът, който използвах.

LatLngBounds.Builder b_builder = new LatLngBounds.Builder();
b_builder.include(se_latlng); //start point
b_builder.include(nw_latlng); //end point 
LatLngBounds b = b_builder.build(); //I am building the bound here
boolean present3 = b.contains(mid_latlng1); //Checking if this point lies along the route
boolean present4 = b.contains(mid_latlng2); //Checking if this point lies along the route

И в двата горни случая получавах вярно за b.contains (NE към SW или SE към NW или NW към SE). Но всъщност само една от тези точки се намира по маршрута. Опитах същото за останалите случаи, но винаги получавах истина, дори ако точката лъже или не лъже по маршрута.

LatLngBounds обаче работи за югозапад до североизток. Може ли някой любезно да ми помогне да разбера дали дадена точка се намира по маршрута от А до Б в другите посоки (СИ към ЮЗ или ЮИ към СЗ или СЗ към ЮИ).


comment
Работата на конструктора е да конструира ограничителна кутия, която включва всички предоставени му точки, така че не виждам как може да предостави информация за маршрути или упътвания. Извикването на съдържа ще ви каже само дали дадена точка се намира вътре в тази генерирана граница. От имената на вашите променливи mid_latlng1 и mid_latlng2 предполагам, че техните координати лежат в центъра на ограничаващия правоъгълник, генериран с помощта на se_latlng и nw_latlng, така че има смисъл методът съдържа винаги да връща true.   -  person stkent    schedule 08.03.2015
comment
@stkent: Благодаря за пояснението, следях this, за да откриете дали дадена точка се намира на маршрута от точка A до точка B. В горния проблем se_latlng, nw_latlng са две точки на магистрала. mid_latlng1 е точка между тях, на магистралата, но не и точната средна точка. mid_latlng2 е точка, която може да лежи вътре в обвързания правоъгълник, но не е на магистралата. Намира се малко встрани от магистралата по друг път.   -  person user3543477    schedule 08.03.2015
comment
Струва ми се, че използването на тест LatLngBounds за този проблем е твърде грубо/неточно. Ако бях на ваше място, щях да помисля за геометричен подход (вижте напр. en.wikipedia.org/wiki/Distance_from_a_point_to_a_line за някаква уместна дискусия). Трябва да определите някакъв толеранс, който представлява точка, която е достатъчно близо до права линия, свързваща A с B. Ако имате нужда от по-красиви пътеки, можете да разделите пътека на прави линии и след това да приложите отново същия алгоритъм към всеки сегмент от пътя.   -  person stkent    schedule 08.03.2015


Отговори (1)


Вече има библиотека за тази задача. Създайте Polyline от вашите LatLng и използвайте isLocationOnPath.

person Marian Paździoch    schedule 10.03.2015