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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *