Пример построения маршрута и оптимизация его с помощью Яндекс карт и api Яндекса 2.1




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

55 Comments

  1. anig99

    Какие ограничения на число точек?

    Reply
  2. Трактор
    Какие ограничения на число точек?

    (1) anig99, не знаю. В документации об этом ничего не сказано http://api.yandex.ru/maps/jsbox/2.1/

    На некоторых адресах яндекс глючит. Не строит к ним маршрут.

    Reply
  3. Yashazz

    Советую пробовать такие фокусы в Гугл-картах. Похожие возможности API, но стабильнее, и адреса корректнее обрабатывает.

    Вообще, отличная работа проделана, респект! Главное ведь именно логику реализовать, вон, сами яндексовцы не осилили и даже плакались об этом где-то в «песочнице».

    Однозначный плюс.

    Reply
  4. harmer

    Обязательно скачаю, как только появятся мани.

    Но есть один вопрос: почему выбран «жадный» алгоритм построения маршрута, ведь для задачи коммивояжера есть множество готовых реализаций?

    Reply
  5. Трактор
    почему выбран «жадный» алгоритм построения маршрута

    (4) harmer, потому, что я никогда ранее не занимался этой задачей. Готовых решений не искал. Решил способом, первым пришедшим в голову.

    Reply
  6. Трактор

    Запустил сегодня этот же скрипт и маршрут построился по-другому 🙂 Прикольно. Похоже Яндекс переоценил расстояния от Селезнёвской до метро Новослободская и до метро Достоевская.



    http://infostart.ru/upload/iblock/049/%D0%92%20%D0%B1%D1%80%D0%B0%D1%83%D0%B7­%D0%B5%D1%80%D0%B5.png

    Обновление 14:12

    Понял в чём дело!!! Дело в том, что расстояние меряется не в километрах, а в минутах!!! Сейчас до Красноказарменной добраться на метро быстрее, чем на том же метро до Ленинградского проспекта 40.

    Reply
  7. Трактор

    (2)

    На некоторых адресах яндекс глючит. Не строит к ним маршрут.

    Моя ошибка была. Исправил.

    Ещё исправил отображение в клиенте 1С спасибо FallenMad за ответ в теме http://forum.infostart.ru/forum26/topic117885/

    Кто скачал файл до 23:51 03.10.2014 скачайте ещё раз. Если нема денег — давайте адрес пришлю файлик,

    Reply
  8. Smaylukk

    Я думаю, что стоит упомянуть в посте о том, что цикл вычисления расстояний между точками реализован тоже с помощью маршрутизации Яндекс. А на нее Яндекс поставил ограничения. По моему 25000 запросов в сутки, но точно не скажу — не могу найти.

    Я занимаюсь автоматизацией службы доставки, поэтому этот вопрос изучал. В моем случае это более 200 маршрутов в день и в каждом в среднем 25 точек (325 запросов в цикле). Итого на один день надо 65 000 запросов. Так что соглашусь с harmer, алгоритм жадный.

    По Google — позволяет построить маршрут не более чем по 25 точкам для платного API и 10 для бесплатного. API Google может само оптимизировать промежуточные точки.

    Reply
  9. Трактор

    (8) Smaylukk, спасибо за сведения.

    Так что соглашусь с harmer, алгоритм жадный.

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

    API Google может само оптимизировать промежуточные точки.

    О как! Это интересно. Я до этого не докопался.

    Reply
  10. vano-ekt

    25к / сутки это на один ip или 1 ключ апи? 🙂

    +

    Reply
  11. Трактор

    (10) vano-ekt, ключ api в этом интерфейсе не используется.

    Reply
  12. pt_olga

    (8) Smaylukk, а за ~9 килобаксов в год Гугл строит и оптимизирует маршруты без ограничений по количеству точек 🙂 вроде так было, когда мы считали

    Reply
  13. kotlovD

    Скачал, спасибо. А как сделать чтобы маршрут сразу для автомобиля формировался?

    Reply
  14. Трактор

    (13) kotlovD,

    как сделать чтобы маршрут сразу для автомобиля формировался?

    В параметре, передаваемом функции route заменить строку

    routingMode: ‘masstransit’

    на

    routingMode: ‘auto’

    Reply
  15. kotlovD

    (14) отлично. Спасибо за оперативность

    Reply
  16. kotlovD

    правда в этом случае маршрут сразу не строится, приходиться нажимать кнопку «Переключить на общественный транспорт» и обратно, тогда маршрут выстраивается

    Reply
  17. assa

    Не качал. Хотел спросить на счет логики.

    Для оптимизации яваскрипт рассчитывает расстояние от исходной точки до каждой точки доставки. Находит ближайшую. Делает её исходной.

    С год назад написал такое же, но с гуглом. И тоже применил такой алгоритм. Был поражен результатом. Представьте ситуацию: исходная точка №1, далее следует перекресток, в лево точка А на расстоянии 1000м, в право тоже точка В, но на расстоянии 800 м. Такая логика делает точкой №2 точку В . Далее за точкой №2 следует точка С и, если от точки В до точки С расстояние меньше, чем от В до А, то точка А все больше удаляется и по итогу она становится последней в маршруте. Вы у себя проверяли такой вариант? У меня так завернуло, что пропала охота дальше что то выдумывать. После получения такого результата забросил. За обработку однозначно +

    Reply
  18. Трактор

    (17) я уже опубликовав обработку почитал на эту тему. Да, маршрут не всегда оптимальный. Но в большинстве случаев попадает близко. Этой темой я занялся недавно. Может быть допилю логику под другой алгоритм.

    Сейчас пилю раздачу заявок курьерам. Вкупе с задачей построения маршрута получается некислая задача.

    (16) kotlovD, завтра посмотрю в чём дело.

    Reply
  19. Трактор

    (16) лучше поздно, чем никогда. В прикреплении файл, который по умолчанию строит маршрут на автомобиле. Файл «ymap.html»

    Некто Гоша Забыл http://forum.infostart.ru/profile/324667/ просил вывести только метки, без построения маршрута.

    Заглушил построение маршрута. Тем более, что метки я всё-равно ставил отдельно. Но при этом скрипт выполняет оптимизацию. То есть много лишних действий. Файл «ymap только метки.html»

    Reply
  20. It-developer

    Почему в ИТ статье ссылка на левый сайт? МИНУС автору!!!

    Reply
  21. Veselchak

    Не отображается карта, только пустое html-поле. В чем может быть дело?

    Reply
  22. Трактор

    (22) в веб клиенте тоже?

    Reply
  23. Veselchak

    В веб клиенте, тонком и толстом карта не отображается, а если открыть файл html браузером, то отображается.

    А в картах 1.3 наоборот — в 1С работает, но не отображается если открыть файл html браузером.

    Reply
  24. daria.zubra@ace-target.ru

    Добрый день! скачала файл но не понимаю как им пользоваться! html открыла в гугле, а вот что делать с фалом epf? заранее благодарю.

    Reply
  25. Трактор
    то делать с фалом epf

    (25) daria.zubra@ace-target.ru, дык ради него всё и затеяно. Это внешнаа обработка для 1С. в 1С Файл/Открыть, выбираешь этот файл. Это демонстрация построения маршрута в связке с 1С.

    Reply
  26. korvin76

    А можно оптимизированный маршрут вернуть в табл.поле (чтобы можно было в печатном виде получить оптимизированный список адресов)?

    Reply
  27. Трактор
    можно оптимизированный маршрут вернуть в табл.поле

    (27) korvin76, можно решить так:

    При вычислении маршрута записать точки маршрута в поле html документа.

    А потом средствами 1С найти это поле html документа и прочесть информацию из него.

    Reply
  28. Трактор

    (27) Что-то в (28) я кривое написал. Можно пользовать яндекс api из 1С. Формируешь http запрос из 1С, отправляешь его яндексу. Всё тоже самое, что и в яваскрипте, только из 1С. По сути это работа с rest сервисом.

    Reply
  29. reflexcompani

    Доброго дня. Данная обработка только для Москвы? Какой бы адрес не указывал другого города, ни чего не строится.

    Reply
  30. Трактор

    (30) Я к Москве не привязывался. Возможно что-то с Яндекс картами. Город в адресе указываете?

    Reply
  31. reflexcompani

    да, город указывал. по разному пробовал.

    Скажите, а то, что в обработке в процедуре при открытии, есть такие строки:

    ЦентрКарты = «[55.781416, 37.611711]»;

    ГраницыМосквы = «[[56.1,37.0],[55.3,38.3]]»;

    ОтправнаяТочка = «[‘Москва, Селезневская улица, 21’]»;

    Не может мешать построению маршрута в других городах?

    Reply
  32. Трактор
    ГраницыМосквы = «[[56.1,37.0],[55.3,38.3]]»;

    (32) reflexcompani, точно. Совсем забыл. Надо поправить границы карты.

    Reply
  33. Yulya8888

    Добрый день. Скачала обработку, запускала и через файл/открыть и через сервис/внешние обработки устанавливала, не запускается. УТ 10.3, предприятие 8.3 С чем может быть связано?

    Reply
  34. Трактор

    >> С чем может быть связано?

    (34) Yulya8888, с тем, что вы пытаетесь открыть её в обычном приложении, а надо в управляемом интерфейсе.

    Reply
  35. orlovskiy-a

    С недавнего времени при любом действии с картой начали появляться ошибки

    ,



    Помогите исправить.

    http://s020.radikal.ru/i719/1603/ac/405df2a7ad23.jpg

    http://s016.radikal.ru/i337/1603/af/c0894c028a6e.jpg

    Reply
  36. Трактор

    (36) похоже 1С изменила js движок в платформе. Фирефокс отработал скрипты без ошибок. А тонкий клиент с руганью. Но маршрут таки построил. Сейчас со временем всё плохо. Боюсь что на разбирательства времени не хватит.

    Reply
  37. cloudysaturn

    ну ёмоё, если она криво работает вы напишите в начале описание. что потом возможно доработаю если будет время. я ради вашей работы этой закинул деньги и теперь все коту под хвост(

    Reply
  38. Трактор

    (38) cloudysaturn, написал комментарий в публикации. Яндекс карты криво отображаются в 1С. Но маршрут строится и отображается. Мешает только сообщение об ошибке при масштабировании карты. Будет время — посмотрю.

    В веб клиенте, в фирефоксе, карты отображаются верно и маршруты строятся.

    Reply
  39. maikl007

    надо поправить в обработке код

    | <meta http-equiv=»»Content-Type»» content=»»text/html; charset=utf-8″» /><meta http-equiv=»»X-UA-Compatible»» content=»»IE=8″»/>

    на

    | <meta http-equiv=»»Content-Type»» content=»»text/html; charset=utf-8″» /><meta http-equiv=»»X-UA-Compatible»» content=»»IE=9″»/>

    заменить IE=8 на IE=9

    у меня заработало без ошибок

    Reply
  40. Al-77

    Всем привет. я так понимаю сегодня ошибка с яндексом у всех ?

    Reply
  41. Hexed

    Разработчик, исправь адрес в шапке, https://yandex.ru/blog/mapsapi/28445 уже не открывается

    Reply
  42. user829115

    как проложить маршрут общественным транспортом более чем по 10 точкам?

    Reply
  43. user829115

    (2)

    есть ли способ как в яндекс картах проложить маршрут общественным транспортом на более 10 точек?

    Reply
  44. user829115

    есть ли способ как в яндекс картах проложить маршрут общественным транспортом на более 10 точек?

    Reply
  45. Трактор

    (45) читай api Яндекса. Там должно быть сказано. Всё меняется, я сейчас не слежу за этой темой.

    Reply
  46. vitek1

    В описании указано

    «Сообщение об ошибкаях можно отключить в настройках IE.»

    Пробовал разные настройки IE11. В тонком клиенте 1С все-равно при первой отрисовке карты выходит ошибка как в(36)

    Какие настройки надо сделать, чтобы она не выскакивала?

    Reply
  47. proger.1c

    не работает обработка,

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

    Reply
  48. nusv

    (48)Добрый день, получилось что-нибудь?

    Reply
  49. proger.1c

    получилось

    Reply
  50. systemaooo2007

    Добрый день! Вчера скачал — карта не отображается! Подскажите плз у кого получилось как исправить!!!

    Reply
  51. user790109

    не работает ссылка. как исправить?

    Reply
  52. user790109

    (51)решили проблему?

    Reply
  53. insurgut

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

    Reply
  54. Трактор

    (54) ой! Не виноватый я. Это Яндекс изменил апи. Заниматься восстановлением некогда.

    Reply
  55. keyn5565`

    маршруты не строит от слова вообще…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *