Това е GPS местоположение между две местоположения

Работя върху проект, който ще проследява превозно средство, докато се движи. Местоположението на превозното средство се взема от Geoloqi API и се показва на карта, която се актуализира автоматично. Координатите се предават на функция AHAH в Drupal, която ще зареди малко повече информация за позицията чрез някои други API:s. Един от тях е Geonames.org.

Не искам да зареждам данни от отдалечени сървъри твърде често, тъй като това ще увеличи натоварването и ще използва нашите кредити твърде бързо. Въпреки това. Искам да е възможно най-реално време, тъй като това е от съществено значение за проекта. Така че реших да го направя така:

Geonames дава поредица от GPS местоположения за текущата улица, така че да може да бъде начертана на карта. „Линията“ се дава на следващото кръстовище. Бихме изяли билетите си твърде бързо, ако питахме за текущото име на улицата всеки път, когато местоположението се промени, но какво ще кажете за всяко кръстовище?

Би ли било възможно в PHP да се провери дали дадена gps координата е на линията между две други координати? Също така би било добре, ако тази линия може да бъде удължена с няколко метра във всички посоки, за да се изчисти всяко отместване.

Благодаря ви много за всички предложения.


person Fredrik Jonsson    schedule 03.07.2012    source източник


Отговори (1)


Първоначалният ви въпрос се свежда до прост математически проблем: намерете уравнение на права, дадени две точки, през които тя преминава. Тази част е проста: да речем, че имате две точки с координати (lat1, lon1) и (lat2, lon2), тогава уравнението на правата ще бъде

(lon2 - lon1) * X + (lat1 - lat2) * Y + (lat1 * lon2 + lat2 * lon1) = 0

Сега, когато получите друга точка (ширина, дължина), просто поставете тези координати като (X, Y) съответно в уравнението. Ако получите 0, тогава точката е на линията. След това проверете дали вашият lat е между lat1 и lat2, а вашият lon е между lon1 и lon2. Ако да, тогава новата точка е на линията между двете съществуващи точки.

По-сложната част идва от две неща:

  1. GPS грешка. За да отчетете това, можете да направите някакво приближение, например вместо да сравнявате с 0, дайте му малко свобода на действие, напр. сравнете от -err до +err, където err е някаква стойност, която бихте определили.

  2. Фактът, че повечето улици не са прави. Картината по-долу показва проблема. Ако погледнете линията между двата края на горната улица, горната част на вертикалната улица ще бъде на тази линия - но това не е това, което искате.
    въведете описание на изображението тук.

Може би по-добрият подход би бил да се използва промяна на разстоянието. Не задавайте отново позиция, ако отчетеното от GPS разстояние се е променило с по-малко от някаква предварително зададена стойност.

person Aleks G    schedule 03.07.2012