1C 8.2 и Google Maps
В проекте Фарма МПД была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис 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; КонецЦикла; СтраницаХТМЛ = " | | <script type="text/javascript"><!--mce:0--></script> | <script type="text/javascript"><!--mce:1--></script> | | | | | <script type="text/javascript"><!--mce:2--></script> | |"; КонецПроцедуры
Скачать демо-конфигурацию можно тут:
GeoMapDemo.dt (115,3 KiB, 280 скачиваний)
Похожие записи:




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