helpf.pro
Регистрация

1C и Google Maps

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

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

Для работы с геокодированием необходимо зарегистрировать ключ API карт Google.

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

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

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

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

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

Код 1C v 8.2 УП
 #НаСервере
Процедура ОтправитьЗапросНаПоискКоординат()
   Город = Параметры.ОбъектПодбора.Город.Наименование;
   Страна = Параметры.ОбъектПодбора.Город.Владелец.Владелец.Наименование;
   Адрес = Параметры.ОбъектПодбора.Адрес;
   ПараметрПоиска = Страна + " " + Город + " " + Адрес;
 
   Адрес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));
   КонецЕсли;
КонецПроцедуры
   


Формирование карты отображения
При формировании отображения объекта на карте к стандартному коду визуализации добавлен следующий:
Код 1C v 8.х
 if(!google.visualization) setTimeout(checkIfGoogleLoad, 1000);
      else drawMap();   

Это связано с тем, что платформа не хочет сразу обновлять фрейм поля html документа.
Код 1C v 8.2 УП
 #НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   СсылкаНаБазу = ПолучитьНавигационнуюСсылкуИнформационнойБазы();
   APIГугла = Константы.КлючКарта.Получить();
 
   ТаблицаОбъектовДляВывода = Новый ТаблицаЗначений;
   ТаблицаОбъектовДляВывода.Колонки.Добавить("Наименование",Новый ОписаниеТипов("Строка"));
   ТаблицаОбъектовДляВывода.Колонки.Добавить("Город",Новый ОписаниеТипов("Строка"));
   ТаблицаОбъектовДляВывода.Колонки.Добавить("Адрес",Новый ОписаниеТипов("Строка"));
   ТаблицаОбъектовДляВывода.Колонки.Добавить("Широта",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,6)));
   ТаблицаОбъектовДляВывода.Колонки.Добавить("Долгота",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,6)));
   Если Параметры.ОтображатьСОтветственными Тогда
      ТаблицаОбъектовДляВывода.Колонки.Добавить("Ответственный",Новый ОписаниеТипов("Строка"));
   КонецЕсли;
 
   Для Каждого ТекЭлемент Из Параметры.ОбъектыДляОтображения Цикл
      КоординатыОбъекта = ОбщийМодульКартаСервер.ПолучитьКоординатыОбъекта(ТекЭлемент.Значение.ОбъектПосещения);
      Если КоординатыОбъекта = Неопределено Тогда
         Продолжить;
      Иначе
         НоваяСтрока = ТаблицаОбъектовДляВывода.Добавить();
         НоваяСтрока.Наименование = ТекЭлемент.Значение.ОбъектПосещения.Наименование;
         НоваяСтрока.Город = ТекЭлемент.Значение.ОбъектПосещения.Город.Наименование;
         НоваяСтрока.Адрес = ТекЭлемент.Значение.ОбъектПосещения.Адрес;
         НоваяСтрока.Широта = КоординатыОбъекта[0];
         НоваяСтрока.Долгота = КоординатыОбъекта[1];
         Если Параметры.ОтображатьСОтветственными Тогда
            НоваяСтрока.Ответственный = ТекЭлемент.Значение.Ответственный.Наименование;
         КонецЕсли;
      КонецЕсли;
   КонецЦикла;
 
   ТекстСкрипта = "data.addRows(" + Строка(ТаблицаОбъектовДляВывода.Количество()) + ");";
   Сч = 0;
   Для Каждого ТекСтрока Из ТаблицаОбъектовДляВывода Цикл
      ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 0, " +СтрЗаменить(Строка(ТекСтрока.Широта),",",".") + ");";
      ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 1, " +СтрЗаменить(Строка(ТекСтрока.Долгота),",",".") + ");";
      ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 2, '" +Строка(ТекСтрока.Наименование) + " "
      + Строка(ТекСтрока.Город) + " " + Строка(ТекСтрока.Адрес) + " " + ?(Параметры.ОтображатьСОтветственными, ".Ответственный: " + Строка(ТекСтрока.Ответственный), "") + " " + "');";
      Сч = Сч + 1;
   КонецЦикла;
СтраницаХТМЛ = "<html>
|  <head>
|    <script src=""http://maps.google.com/maps?file=api&v=2&key=" + APIГугла + """ type=""text/javascript""></script>
|    <script type=""text/javascript"" src=""http://www.google.com/jsapi""></script>
|  </head>
|
|  <body>
|    <div id=""map_div"" style=""width: 800px; height: 550px""></div>
|    <script type=""text/javascript"">
|
|      google.load(""visualization"", ""1"", {packages:[""map"">);
|      google.setOnLoadCallback(drawMap);
|      function checkIfGoogleLoad() {
|        if(!google.visualization) setTimeout(checkIfGoogleLoad, 1000);
|		else drawMap();
|      }
|      function drawMap() {
|        var data = new google.visualization.DataTable();
|        data.addColumn('number', 'Lat');
|        data.addColumn('number', 'Lon');
|        data.addColumn('string', 'Name');" + ТекстСкрипта + "
|        var map = new google.visualization.Map(document.getElementById('map_div'));
|        map.draw(data, {showTip: true, mapType: 'normal'});
|      }
|      checkIfGoogleLoad();
|    </script>
|  </body>
|</html>"; 
КонецПроцедуры   

Андрей Данилюк
Разместил:   Версии: | 8.x | 8.2 УП |  Дата:   Прочитано: 41678
 +21 
Распечатать
Возможно, вас также заинтересует
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 53
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C: Enterprise Development Tools 52
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем
1Cv8.1CD - Файл данных достиг максимального размера! 9
1С выдает предупреждение " Файл данных достиг максимального размера" . Подскажите из - за чего это и как можно решить ? Превышен размер файла, обычно это сообщение возникает, когда размер файла 1Cv8.1CD приближается к 10 гигабайтам или размер ка
1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? 6
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче
Посмотреть все результаты поиска похожих
Комментарии
Ermak
19.03.2014 19:10Комментарий: 3
Ermak
Добрый вечер! Объясните мне что у меня не так

Код 1C v 8.х
 	 Запрос = Новый Запрос (
	 "ВЫБРАТЬ
	 |	История.ЛицевойСчет.Владелец КАК Владелец,
	 |	История.Период,
	 |	История.ЛицевойСчет.Регион КАК Регион
	 |ИЗ
	 |	РегистрСведений.История КАК История
	 |ГДЕ
	 |	История.Период = &Дата");
	 Запрос.УстановитьПараметр("Дата"   , ЭтаФорма.ПолеВвода1);
	 
	 РезультатЗапроса = Запрос.Выполнить().Выбрать();
	 
	 Пока РезультатЗапроса.Следующий() Цикл
		 
		 ПараметрПоиска = "Карелия Респ," + " " + РезультатЗапроса.Регион + "," + " " + РезультатЗапроса.Владелец;
		 АдресOutput = ПолучитьИмяВременногоФайла();
		 Ключ = KeyAPI;
		 ТекстСсылки = "maps/geo?q=" + EncodeURL(ПараметрПоиска)+"&amp;output=csv&amp;oe=utf8&amp;sensor=false&amp;key=" + Ключ;
		 ПроксиСервер = Неопределено;
		 HTTPСервис = Новый HTTPСоединение("maps.google.com",,,,ПроксиСервер,Ложь);
		 ПравильностьВыполнения = Истина;
		 
		 Попытка
			 HTTPСервис.Получить(ТекстСсылки, АдресOutput);
		 Исключение
			 Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
			 ПравильностьВыполнения = Ложь;
		 КонецПопытки;
		 
		 Если ПравильностьВыполнения Тогда
			 // Распарсить результат ответа поиска
			 Текст = Новый ТекстовыйДокумент;
			 Текст.Прочитать(АдресOutput);
			 РезультатПоиска = Текст.ПолучитьСтроку(1);
			 
			 КодРезультата = Лев(РезультатПоиска,3);
			 РезультатПоиска = Сред(РезультатПоиска, 7, СтрДлина(РезультатПоиска));
			 
			 Если КодРезультата <> "200" Тогда
				 Возврат;
			 КонецЕсли;
			 
			 Широта = Число(Сред(РезультатПоиска,0,10));
			 Долгота = Число(Сред(РезультатПоиска,12,10));
		 КонецЕсли;
	 КонецЦикла;
   

Выкидывает на этой строке
Код 1C v 8.х
 	 Если КодРезультата <> "200" Тогда
				 Возврат;
			 КонецЕсли;   

ПОЧЕМУ???
E_Migachev
07.10.2011 12:10Комментарий: 2
E_Migachev
yurii-syrkin, если не изменяет память, то EncodeURL - Осуществляет минимальную кодировку URL путем преобразования пробелов в указанном URL-адресе в строку "%20".
yurii-syrkin
07.10.2011 00:14Комментарий: 1
yurii-syrkin
А как функция EncodeURL работает?
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!