Широко распространена задача треканья подвижного объекта. В простейшем случае надо взять телефон с android-ом, поставить туда OsmAnd и настроить live-мониторинг. Сидишь себе и смотришь на карте (OpenStreetMap конечно) перемещение аппарата. Так бы и поступил, но внезапно оказалось, что в нужный день у меня не будет интернета, не будет компьютера, не будет времени.
И я начал искать выход. Сначала состоялись непродолжительные консультации и обсуждения с чатиком, а потом, после обеда, пришло решение.
Есть мобильный телефон и есть услуга оператора email2sms. Значит в моем случае задача сводится к простому получению человекочитаемого текста не более 1000 символов длинной. Но сначала постараюсь изложить ход мыслей.
Предоставляемый опсос-ами сервис слежения отметаем сразу, как неточный и по причине не имения симки ни одного из означенных операторов.
У ОСМЪ есть неплохой поиск (не без греха, как выяснили хабрапользователи, но приемлемый). А что, если его развернуть в обратную сторону и по переданным координатам получить наименование близлежащего наземного объекта. При чем тут моя задача?.. А не при чем! Просто относительно ориентиров более человекочитаемым получиться текст должен. В общем, мысль интересная, надо на потом оставить. Автор сайта даже что-то имеет в загашнике.
«Наблюдаемый продвинулся с прошлого замера на север на 350 м» — вроде годится, но тогда нужно как-то сохранять все точки. Пусть даже последние две… Где взять хостинг такой?
Заранее расставить WPT и по достижении их пусть аппарат скидывает сообщение. Ну тут, во-первых, не известен заранее маршрут, а только место назначения. Во-вторых, такого приложения не нашлось. Об этом ниже.
И так не всегда отзывчивый juick_ppl и тут ничем не помог.
Итак, 100500 приложений из маркета умеют ровно тоже, что OsmAnd — собирают треки, показывают местоположение на карте, делятся координатами. Проблема в том, что делятся они только по нажатию пункта меню «поделиться», а зависимость от ручных действий не обученного андроидопользователя следует исключить. Да и то сказать — пара координат (lat, lon) годится разве что в рамку на стену вешать, но никак не подсказывать человеку куда уже добрался объект. Прочих пригодных вариантов так и не обнаружилось, возможно времени не хватило. Упомяну лишь OruxMaps — несомненно полезная и весьма функциональная программа. Настолько функциональная, что напугала меня до дрожи в коленках. Оставлю её изучение на потом...
К этому моменту четко сформировалась мысль о формате получаемого каждые 5 мин сообщения: "До точки назначения осталось ХХХ км", этого мне будет достаточно. Можно бы и реже, но 5 минут — максимум, что можно выставить. Примерное ограничение на количество сообщений email2sms — 100 в сутки. Этого хватит на целых 8 часов, годится.
Неожиданно просто удалось найти хостинг, на условиях размещения предельно простого php-скрипта, без БД и прочих плюшек. Значит пора приступать к кодингу. На сайте из закладок (ГИС-ЛАБ.инфо, чего уж скрывать) нашлось толковое описание больших кругов с готовым алгоритмом «Вычисление расстояния и начального азимута между двумя точками на сфере», нагло передираю и бессовестным образом переделываю в php:
В качестве контрольного примера взяты точки аэропортов, примерно соответствующих направлению и дальности поездки.
Distance between MQF and CEK
The distance has been calculated as being: 277 kilometres (173 miles)
Отлично, работает! Оформляем в функцию, начальный азимут выкидывается за ненадобностью и для упрощения. Навешиваем недостающий функционал, не забывая запостить данные в ту сторону, ради которой изначально и появился Live Tracking в OsmAnd 0.7.1.
<?php
function distance($llat1,$llong1,$llat2,$llong2) #координаты двух точек
{
//[...поскипано...]
return $dist;
}
import_request_variables('G', 'hhsb_');
//проверка переменных на наличие и их заполненность - для слабых духом. не наш случай!
# c - current; f - final; s - start
$d1 = distance($hhsb_clat,$hhsb_clon,$hhsb_flat,$hhsb_flon);
$d2 = distance($hhsb_clat,$hhsb_clon,$hhsb_slat,$hhsb_slon);
# письмо
$emailfrom = $hhsb_rpl;
$replyemail = $emailfrom;
$emailto = $hhsb_eml;
$headers = "MIME-Version: 1.0rn";
$headers .= "From: ".$emailfrom."rn";
$headers .= "Reply-To: ".$replyemail."rn";
$headers .= "X-Priority: 3 (Normal)rn";
$headers .= "X-Mailer: yourhoster.comrn";
$headers .= "Content-Type: text/plain; charset=Windows-1251rn";
$headers .= "Content-Transfer-Encoding: 8bit";
$message = "Distance >> ".$d1." to final destination and ".$d2." from start (meters)rn";
$message .= "Speed >> ".round($hhsb_speed,2)." (m/s)";
$subject = "distance";
mail($emailto, $subject, $message, $headers);
# сохранить в ОсМо для просмотра на карте
$esya = 'http://воизбежаниехабраэффектапутьвидентольковархиве/?'.$hhsb_clat.':'.$hhsb_clon.':'.$hhsb_hdop.':'.$hhsb_alt.':'.$hhsb_speed.':'.$hhsb_usr.':'.$hhsb_n;
$ch = curl_init($esya);
$res=curl_exec($ch);
curl_close($ch);
$ans=json_decode($res);
echo $ans->response; //{"s":1} по-любому, можно не проверять
?>
Очень важный этап — в OsmAnd прописать строку Web адрес Live слежения вида:
Можно грабить корованы в эту же концепцию добавить путевые точки, а при наличии мало-мальской БД вообще развернуться по-полной. Однако мой наколеночный минимум уже выполнен...
...В добрый путь! Осталось обязательно зарядить андроид. Ведь если не дунутьзарядить, то фокус не получится.
Из выявленных недостатков:
Максимальный интервал 5 минут, хотелось бы побольше. В идеале вообще иметь возможность вводить числом, а не выбирать из списка.
К исходу второго часа сдохло приложение, не понятно кто постарался. Подозреваю, что андроид сумничал, т.к. пользователь не проявлял активность всё это время — как только состоялась первая передача данных аппарат сразу оказался в сумке и исправно подавал сигналы. Пришлось наводить панику и просить реанимировать OsmAnd. Справились, ОК.
Таки есть зависимость от не обученного пользователя — удаленно же не отключить. Инструкции не помогли, сложно видите ли… Проще оказалось попросить выключить питание «трекера» по прибытии.
Но довольно перемывать косточки такого сферически-идеального, продуманного и логически завершенного лайфхака, ведь уже приехали на место. Distance >> 29 to final destination and 247194 from start (meters) Speed >> 0.0 (m/s)