Majordomo Умный дом

Как получить адрес по координатам?

• 19-09-2019 •

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

Как отправлять координаты с телефона?

Тут есть несколько вариантов:

  • Родное приложение от majordomo для android
  • Приложение Tasker (Лично не пробовал, но много кто советует)
  • Btraced, приложение для iOS

Так как я пробовал только с родного приложения majordroid, то тут собственно все просто. Заходим в настройки, ищем раздел GPS-трекер и включаем.

Так же и на самом сервере majordomo должен быть установлен GPS трекер.

Важно, чтобы до сервера majordomo, можно было достучаться из вне, более подробно об этом можно почитать вот тут.

Настройка GPS Трекера

После того как включили gps трекер на телефоне, проверяем, что данные успешно приходят и сохраняются. Для этого переходим в лог событий и смотрим, должно быть нечто подобное:

Осталось привязать устройство к пользователю, который уже должен быть создан заранее. Если еще не создан, переходим в Настройки -> Пользователи и создаем.

И так, переходим в Устройства, видим новое обнаруженное устройство и привязываем к нему пользователя.

Можно еще добавить места, поиграться с картами, это уже на ваше усмотрение.

Адрес из координат

Вот тут самое интересное!

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

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

Переходим в модуль телеграм, вкладка «Команды» и создаем кнопку «Кто где«.

Кто чуть чуть прошаренный и не хочет больше читать, то вот весь код:


$users = getObjectsByClass("Users");
$response = [];

foreach($users as $user) {
 $coord = gg($user['TITLE'].".Coordinates");
 $name = gg($user['TITLE'].".fullName");
 $explode = explode(',', $coord);
 $lat = $explode[0];
 $lot = $explode[1];
 
 if(!$lat || !$lot){
  continue;
 }
 
 $api = 'http://geocode-maps.yandex.ru/1.x/?lang=ru_RU&apikey={APIKEY}&format=json&geocode=N'.$lat.',E'.$lot;
 $jsonString = file_get_contents($api);
 
 if(!$jsonString){
  return 'В данный момент, что-то не работает, попробуйте позже!';
 }
 
 $data = json_decode($jsonString, true);
 $address = $data['response']['GeoObjectCollection']['featureMember'][0]['GeoObject']['metaDataProperty']['GeocoderMetaData']['text'];
 $map = 'https://www.google.com/maps/@'.$lat.','.$lot.',17z';
 $response[$name] = ['address' => $address, 'map' => $map];
}
$data = '';

if($response){
 	foreach($response as $name => $value){
     	$data .= $name.": ".$value['address']."\n".$value['map']."\n";
    }
}

return $data;

И так, давай-те разбираться


//Достаем все объекты класса Users
$users = getObjectsByClass("Users");

// Проходимся по всем юзерам и достаем имя и координаты
foreach($users as $user) { 

// Так как координаты у нас в одной строке, разбиваем их на части (запятая это разделитель) и добавляем в массив
$explode = explode(',', $coord);

// Если нету координат, то пропускаем этого пользователя
if(!$lat || !$lot){
  continue;
}

// Вот именно благодаря этой ссылке, мы вытаскиваем полную информацию по координатам. Но для этого вам понадобиться APIKEY, который можно бесплатно получить в кабинете Яндекса
// Так же можно и без ключа, но буквально пару запросов в час.
$api = 'http://geocode-maps.yandex.ru/1.x/?lang=ru_RU&apikey={APIKEY}&format=json&geocode=N'.$lat.',E'.$lot;

// Получаем json строку
$jsonString = file_get_contents($api);

// Получаем массив из json строки
$data = json_decode($jsonString, true);

// Так как я чаще пользуюсь гуглом, для меня актуально получать ссылку гугла, но я думаю для яндекса можно сделать тоже самое.
$map = 'https://www.google.com/maps/@'.$lat.','.$lot.',17z';

// Всю полученную информацию я сохраняю в массив.
$response[$name] = ['address' => $address, 'map' => $map];

// Тут я подготавливаю данные для отправки в телеграм
if($response){
 	foreach($response as $name => $value){
     	$data .= $name.": ".$value['address']."\n".$value['map']."\n";
    }
}

// Отправляю данные в телеграм, так же можно использовать функцию say, чтобы это увидели все пользователи majordomo
return $data;

Вы можете добавить эту функцию в сценарии или в любое другое место в majordomo и она будет так же хорошо работать! Надеюсь я вам помог, если будут вопросы, задавайте в комментариях!

4 thoughts on “Как получить адрес по координатам?

  1. Очень интересный функционал, спасибо за идею. Единственное что хотелось бы, что бы каждого пользователя отправляло в отдельном сообщении, а не всех пользователей в одном. Можно будет использовать yandex static map, получать картинку карты на каждого юзера. Что бы не открывать ссылку в картах. Не подскажите как сделать отправку сообщения на каждого юзера?

    1. В моем варианте ответ придет только одному пользователю, тот кто нажал кнопку «Кто где». Если же надо получить конкретного пользователя, то можно создать отдельную кнопку, к примеру: «Где сын», и поменять получение данных от всех пользователей, на одного. А чтобы получать картинку, тут надо посмотреть документацию яндекса, позволяет ли он такое.

  2. Постоянно выдаéт- В данный момент, что-то не работает, попробуйте позже! Свойства у юзера такие как координаты и имя заполнены, но все ровно не робит. Жаль! Хорошая идея.

    1. Видимо что то не так сделали, только что у себя проверил, все работает.

Добавить комментарий