Программист 1с
twitter email rss
  • Home
  • Полезности
    • Мобильное приложение курьера
    • MailChimp + УТ 11.
    • 1с-sms
    • Pharma-MPD
    • Зуботехническая лаборатория
  • Блог
  • Партнеры
  • Команда
    • Услуги
    • Опыт
    • Отзывы
    • Контакты
  • Поддержка
    • Инструкция
    • Redmine






В проекте Фарма МПД была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было решено использовать геокодирование сервиса Google и Google Visualization для отображение элементов на карте.

Геокодирование – процесс преобразования адресов·(Украина, Киевская область, Киев, Крещатик 20) в географические координаты (широта 37.423021 и долгота -122.083739), которые можно использовать для размещения маркеров или расположения карты. Подробно про геокодирование можно почитать тут.

Для работы с геокодированием необходимо зарегистрировать ключ API карт Google. В демонстрационной конфигурации его надо прописать в константу КлючКарта.

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

И так, собственно программная реализация.

В конфигурации есть две общих формы:

  • Форма подбора координат. Данная форма формирует запрос на геокодирование и обрабатывает результат.
  • Форма отображения объектов. Данная форма использует API визуализации Google. В частности данная форма использует визуализацию Map.

Запрос и обработка результата геокодирования.

Формирование запроса происходит с ключом output=csv, для вывода результата запроса в csv файл. После выполнения запроса проверяется код результата запроса и разбор csv файла на широту и долготу.

#НаСервере
Процедура ОтправитьЗапросНаПоискКоординат()
   Город = Параметры.ОбъектПодбора.Город.Наименование;
   Страна = Параметры.ОбъектПодбора.Город.Владелец.Владелец.Наименование;
   Адрес = Параметры.ОбъектПодбора.Адрес;
   ПараметрПоиска = Страна + " " + Город + " " + Адрес;

   АдресOutput = ПолучитьИмяВременногоФайла();
   Ключ = Константы.КлючКарта.Получить();
   ТекстСсылки = "maps/geo?q=" + EncodeURL(ПараметрПоиска)+"&output=csv&oe=utf8&sensor=false&key=" + Ключ;
   ПроксиСервер = Неопределено;
   HTTPСервис = Новый HTTPСоединение("maps.google.com",,,,ПроксиСервер,Ложь);
   ПравильностьВыполнения = Истина;

   Попытка
      HTTPСервис.Получить(ТекстСсылки, АдресOutput);
   Исключение
      Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
      ПравильностьВыполнения = Ложь;
   КонецПопытки;

   Если ПравильностьВыполнения Тогда
      // Распарсить результат ответа поиска
      Текст = Новый ТекстовыйДокумент;
      Текст.Прочитать(АдресOutput);
      РезультатПоиска = Текст.ПолучитьСтроку(1);

      КодРезультата = Лев(РезультатПоиска,3);
      РезультатПоиска = Сред(РезультатПоиска, 7, СтрДлина(РезультатПоиска));

      Если КодРезультата <> "200" Тогда
         Возврат;
      КонецЕсли;

      Широта = Число(Сред(РезультатПоиска,0,10));
      Долгота = Число(Сред(РезультатПоиска,12,10));
   КонецЕсли;
КонецПроцедуры

 

Формирование карты отображения

При формировании отображения объекта на карте к стандартному коду визуализации добавлен следующий:

if(!google.visualization) setTimeout(checkIfGoogleLoad, 1000);
      else drawMap();

Это связано с тем, что платформа не хочет сразу обновлять фрейм поля html документа.

 

#НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   СсылкаНаБазу = ПолучитьНавигационнуюСсылкуИнформационнойБазы();
   APIГугла = Константы.КлючКарта.Получить();

   ТаблицаОбъектовДляВывода = Новый ТаблицаЗначений;
   ТаблицаОбъектовДляВывода.Колонки.Добавить("Наименование",Новый ОписаниеТипов("Строка"));
   ТаблицаОбъектовДляВывода.Колонки.Добавить("Город",Новый ОписаниеТипов("Строка"));
   ТаблицаОбъектовДляВывода.Колонки.Добавить("Адрес",Новый ОписаниеТипов("Строка"));
   ТаблицаОбъектовДляВывода.Колонки.Добавить("Широта",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,6)));
   ТаблицаОбъектовДляВывода.Колонки.Добавить("Долгота",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,6)));
   Если Параметры.ОтображатьСОтветственными Тогда
      ТаблицаОбъектовДляВывода.Колонки.Добавить("Ответственный",Новый ОписаниеТипов("Строка"));
   КонецЕсли;

   Для Каждого ТекЭлемент Из Параметры.ОбъектыДляОтображения Цикл
      КоординатыОбъекта = ОбщийМодульКартаСервер.ПолучитьКоординатыОбъекта(ТекЭлемент.Значение.ОбъектПосещения);
      Если КоординатыОбъекта = Неопределено Тогда
         Продолжить;
      Иначе
         НоваяСтрока = ТаблицаОбъектовДляВывода.Добавить();
         НоваяСтрока.Наименование = ТекЭлемент.Значение.ОбъектПосещения.Наименование;
         НоваяСтрока.Город = ТекЭлемент.Значение.ОбъектПосещения.Город.Наименование;
         НоваяСтрока.Адрес = ТекЭлемент.Значение.ОбъектПосещения.Адрес;
         НоваяСтрока.Широта = КоординатыОбъекта[0];
         НоваяСтрока.Долгота = КоординатыОбъекта[1];
         Если Параметры.ОтображатьСОтветственными Тогда
            НоваяСтрока.Ответственный = ТекЭлемент.Значение.Ответственный.Наименование;
         КонецЕсли;
      КонецЕсли;
   КонецЦикла;

   ТекстСкрипта = "data.addRows(" + Строка(ТаблицаОбъектовДляВывода.Количество()) + ");";
   Сч = 0;
   Для Каждого ТекСтрока Из ТаблицаОбъектовДляВывода Цикл
      ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 0, " +СтрЗаменить(Строка(ТекСтрока.Широта),",",".") + ");";
      ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 1, " +СтрЗаменить(Строка(ТекСтрока.Долгота),",",".") + ");";
      ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 2, '" +Строка(ТекСтрока.Наименование) + " "
      + Строка(ТекСтрока.Город) + " " + Строка(ТекСтрока.Адрес) + " " + ?(Параметры.ОтображатьСОтветственными, ".Ответственный: " + Строка(ТекСтрока.Ответственный), "") + " " + "');";
      Сч = Сч + 1;
   КонецЦикла;

	СтраницаХТМЛ = "
|
|    
|    
|
|
|
|

|    
|
|";

КонецПроцедуры

Скачать демо-конфигурацию можно тут: 

  GeoMapDemo.dt (115,3 KiB, 3 820 скачиваний)

Похожие записи:

  1. 1С 8.2 Кросс-Таблица в управляемом интерфейсе
  2. Определение координат объекта на Google maps
  3. Кластеризация заказов по географическим координатам
  4. Google maps, поиск оптимального маршрута
  5. Выгрузка табличного документа в Google таблицу
  • Anton

    Спасибо, это очень круто!

    • Андрей Данилюк

      Очень рад, что Вам понравилось. Будут какое-то вопросы по реализации — пишите, постараюсь помочь.

  • MonikaKet

    Здравствуйте. Пожалуйста не удаляйте это сообщение. Алене нужна операция. Сайт — helpalena.ru (helpalena.ru ). Кто может, помогите.

  • mir-mup

    очень впечатляет. Автору СПАСИБО!

  • Pingback: Блог программиста 1с » Blog Archive » Рассылка писем.()

  • Pingback: Блог программиста 1с » Blog Archive » Определение координат объекта на Google maps()

  • Вадим Ляхин

    Спасибо! Отличная идея

    • Андрей Данилюк

      Пожалуйста. Всегда охотно делюсь знаниями.

  • Kolokolnikov83

    спасибо

  • Тамерлан

    Не подскажешь ошибка » Объект не поддерживает свойство или метод setMapTypeId»

← 1С 8.2 Кросс-Таблица в управляемом интерфейсе
Реструктуризация документа. Слишком большой год. →

Новости

  • Работаем с Opendatabot из 1с
  • Сокращаем ссылки в 1с
  • Загрузка данных из Google spreadsheet в 1с
  • Формирование скриншотов сайтов в 1с
  • Удаление старой номенклатуры

Подписка

Copyright © 2022 danila.org.ua
Умные решения для вашего бизнеса