Имя: Пароль:
1C
1С v8
Моя битва с Яндекс-картами...
,
0 mikecool
 
05.06.12
16:44
При загрузке выполняется
       window.onload = function () {
           map = new YMaps.Map(document.getElementById("YMapsID"));
           map.setCenter(new YMaps.GeoPoint(39.761795, 47.271364), 10);
           
           map.addControl(new YMaps.TypeControl());
           map.addControl(new YMaps.ToolBar());
           map.addControl(new YMaps.Zoom());
           map.addControl(new YMaps.ScaleLine());
           map.addControl(new YMaps.SearchControl());
           
       }
есть пара функций
    function AddPath(Param) {
       
       debugger;
       polyline = new YMaps.Polyline(Param);
       polyline.setStyle("example#CustomLine");
       map.addOverlay(polyline);
       return polyline;
       }
       
    function GetPointObject(X, Y) {
       return new YMaps.GeoPoint(X, Y);    
    }
в одноэсе пишу
   СафеЭррей = Новый COMSafeArray("VT_VARIANT", Результат.Количество());
   
   Счетчик = 0;
   Пока Результат.Следующий() Цикл
       
       СафеЭррей.SetValue(Счетчик, ЭлементыФормы.ПолеHTMLДокумента.Документ.parentWindow.GetPointObject(Результат.Долгота, Результат.Широта));
       Счетчик = Счетчик + 1;
       
   КонецЦикла;
   
   ПостроитьПуть = ЭлементыФормы.ПолеHTMLДокумента.Документ.parentWindow.AddPath(СафеЭррей);

выбираются сохраненные координаты и должен рисоваться маршрут.
Пробовал отдавать обычный массив, была ругань на параметр.
При передаче сейфэрея - не ругается, но и нифига не рисуется
чяднт?
1 pumbaEO
 
05.06.12
16:55
вот моя борьба с ЯндексКартами


Процедура ОбновитьКартуЯндекс(ПолеHTMLДокумента, ТипМетки, ТипМаршрута) Экспорт
   
   ПолеHTMLДокумента.УстановитьТекст("");
   
   //Если ДокументОбъект.СоставМаршрута.Количество() = 0 Тогда
   //    Возврат;
   //КонецЕсли;    
   
   Заголовок = "Документ "+СсылкаНаОбъект;
   
   GM = Новый ТекстовыйДокумент;
   ТекстHTML = "";
   МаршрутHTML = "";
   СтруктураВозврата = ПолучитьГабаритыКарты(СоставМаршрута);
   
   Отказ = Ложь;
   Для Каждого СтрокаКонтрагенты Из СоставМаршрута Цикл
       
       Если СтрокаКонтрагенты.Долгота=0 ИЛИ СтрокаКонтрагенты.Широта=0 Тогда
           //Если Не ЗначениеЗаполнено(СтрокаКонтрагенты.ТорговаяТочка) Тогда
           ОбщегоНазначения.СообщитьОбОшибке("Невозможно расчитать расстояние, т.к. для посещения не заполненны координаты строка " + Строка(СтрокаКонтрагенты.НомерСтроки) , Отказ, Заголовок);
           //ИначеЕсли СтрокаКонтрагенты.ТорговаяТочка.Долгота=0 ИЛИ СтрокаКонтрагенты.ТорговаяТочка.Широта=0 Тогда
           //    ОбщегоНазначения.СообщитьОбОшибке("Невозможно расчитать расстояние, т.к. для посещения не заполненны координаты строка " + Строка(СтрокаКонтрагенты.НомерСтроки) , Отказ, Заголовок);
           // Иначе
           //     СтрокаКонтрагенты.Долгота = СтрокаКонтрагенты.ТорговаяТочка.Долгота;
           //     СтрокаКонтрагенты.Широта = СтрокаКонтрагенты.ТорговаяТочка.Широта;
           //КонецЕсли;
       КонецЕсли;    
   КонецЦикла;
   
   //Если Отказ Тогда
   //    Возврат;
   //КонецЕсли;
   
   
   Для Каждого СтрокаКонтрагенты Из СоставМаршрута Цикл
       
       Если СтрокаКонтрагенты.Долгота=0 ИЛИ СтрокаКонтрагенты.Широта=0 Тогда
           Если Не ЗначениеЗаполнено(СтрокаКонтрагенты.ТорговаяТочка) Тогда
               //ОбщегоНазначения.СообщитьОбОшибке("Невозможно расчитать расстояние, т.к. для посещения не заполненны координаты строка " +Стр
               Продолжить;
               
           ИначеЕсли СтрокаКонтрагенты.ТорговаяТочка.Долгота=0 ИЛИ СтрокаКонтрагенты.ТорговаяТочка.Широта=0 Тогда
                Продолжить;
            Иначе
                СтрокаКонтрагенты.Долгота = СтрокаКонтрагенты.ТорговаяТочка.Долгота;
                СтрокаКонтрагенты.Широта = СтрокаКонтрагенты.ТорговаяТочка.Широта;
           КонецЕсли;
       КонецЕсли;    
       
       Если СтрокаКонтрагенты.НомерСтроки=1 ИЛИ СтрокаКонтрагенты.НомерСтроки=СоставМаршрута.Количество() Тогда
           ЦветМаркера = "red";
       Иначе
           ЦветМаркера = "blue";
       КонецЕсли;
       
       МаршрутHTML = МаршрутHTML+?(МаршрутHTML="","",",")+"'"+Формат(СтрокаКонтрагенты.Долгота,"ЧРД=.; ЧН=; ЧГ=0")+","+Формат(СтрокаКонтрагенты.Широта,"ЧРД=.; ЧН=; ЧГ=0")+"'";
       
       Если ТипМаршрута = 2 Тогда
           Продолжить;
       КонецЕсли;
       
       Если ТипМетки = 0 Тогда
           
           // обычная метка на карте
           ТекстHTML = ТекстHTML + "
           |
           |    pm = new YMaps.Placemark(new YMaps.GeoPoint(" + Формат(СтрокаКонтрагенты.Долгота,"ЧРД=.; ЧН=; ЧГ=0") + "," +
           Формат(СтрокаКонтрагенты.Широта,"ЧРД=.; ЧН=; ЧГ=0")+ "), {style:""default#" + ЦветМаркера + "Point"", hideIcon: false});
           |    pm.description = '" + СтрЗаменить(СокрЛП(СтрокаКонтрагенты.Контрагент.Код),"'","""") + "';
           |    objManager.add(pm);";
           
       ИначеЕсли ТипМетки = 1 Тогда
           
           // текстовая метка
           ТекстHTML = ТекстHTML + "
           |
           |    pm = new YMaps.Placemark(new YMaps.GeoPoint(" + Формат(СтрокаКонтрагенты.Долгота,"ЧРД=.; ЧН=; ЧГ=0") + "," +
           Формат(СтрокаКонтрагенты.Широта,"ЧРД=.; ЧН=; ЧГ=0")+ "), {style:""default#" + ЦветМаркера + "Point"", hideIcon: false});
           |    pm.description = '" + СтрЗаменить(СокрЛП(СтрокаКонтрагенты.Адрес),"'","""") + "';
           |    objManager.add(pm);
           |    pm.setIconContent('"+СокрЛП(СтрокаКонтрагенты.Контрагент.Код)+"');";
           
       ИначеЕсли ТипМетки = 2 Тогда
           
           // метка с нумератором
           ТекстHTML = ТекстHTML + "
           |
           |    var point = new YMaps.GeoPoint(" + Формат(СтрокаКонтрагенты.Долгота,"ЧРД=.; ЧН=; ЧГ=0") + "," +
           Формат(СтрокаКонтрагенты.Широта,"ЧРД=.; ЧН=; ЧГ=0")+ ");
           |   var placemark = new YMaps.Placemark(point, {style: ""example#customPoint""});
           |   placemark.name = "+СтрокаКонтрагенты.НомерСтроки+";
           |   placemark.description = '"+СтрЗаменить(СокрЛП(СтрокаКонтрагенты.Адрес),"'","""")+"';
           |   map.addOverlay(placemark);
           |";
           
       КонецЕсли;
       
   КонецЦикла;
   
   МаршрутHTML = "
   |
   |    // Прокладывание маршрута
   |    var router = new YMaps.Router(["+МаршрутHTML+"], [1], {viewAutoApply: 1});
   |   map.addOverlay(router);
   |    // После заверешение построения маршрута изменяем содержмое значков начальной и конечной точек
   |        // И добавляем маршрут на карту
   |        YMaps.Events.observe(router, router.Events.Success, function() {
   |          
   |           //map.addOverlay(router);
   |            var summaryPanel = document.getElementById(""directions_panel"");
   |var route = """";
   |var dest=0;
   |for (var i=0; i<router.getNumRoutes(); i++) {
   |route = router.getRoute(i);
   |dest+=route.getDistance();
   |summaryPanel.innerHTML+=i +"":""+route.getDistance()+"";"";
   |}
   |summaryPanel.innerHTML = dest;
   |var summaryPanel = document.getElementById(""points_panel"");
   |summaryPanel.innerHTML = """";
   |var waypoint = """";
   |for (var i=0; i<router.getNumWayPoints(); i++) {
   |waipoint = router.getWayPoint(i);
   |summaryPanel.innerHTML+=i+"":""+waipoint.text+"";"";
   |
   |}
   |        });
   |    
   | ";
   
   ТекстHTML = "
   //|<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">
   //|<html xmlns=""http://www.w3.org/1999/xhtml"" style=""height: 100%"">
   //|<head>
   //|    <title>Карта маршрута.</title>
   //|    <meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" />
   //|    <meta http-equiv=""X-UA-Compatible"" content=""IE=7""/>
   //|    <script src=""http://api-maps.yandex.ru/1.0/index.xml?key=" + KeyAPI + """ type=""text/javascript""></script>
   |<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN"" ""http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd"">
   |<HTML
   |xmlns=""http://www.w3.org/1999/xhtml""><HEAD><TITLE>Карта маршрута.</TITLE>
   |<META content=""text/html; charset=windows-1251"" http-equiv=Content-Type>
   |<SCRIPT type=text/javascript
   |src=""http://api-maps.yandex.ru/1.1/index.xml?key=" + KeyAPI + """></SCRIPT>
   |    <script type=""text/javascript"">
   |            var map;
   |    
   |    window.onload = function () {
   |           map = new YMaps.Map(document.getElementById(""YMapsID""));
   |           map.setBounds(new YMaps.GeoBounds(new YMaps.GeoPoint(" +
   Формат(СтруктураВозврата.МинДолгота,"ЧРД=.; ЧН=; ЧГ=0") + ", " +
   Формат(СтруктураВозврата.МинШирота,"ЧРД=.; ЧН=; ЧГ=0") + "), new YMaps.GeoPoint(" +
   Формат(СтруктураВозврата.МаксДолгота,"ЧРД=.; ЧН=; ЧГ=0") + ", " +
   Формат(СтруктураВозврата.МаксШирота,"ЧРД=.; ЧН=; ЧГ=0")+ ")));
   |
   |            map.enableScrollZoom();
   |            map.addControl(new YMaps.TypeControl());
   |            map.addControl(new YMaps.ToolBar());
   |            map.addControl(new YMaps.Zoom());
   |            map.addControl(new YMaps.ScaleLine());
   |           map.addControl(new YMaps.Zoom());
   |
   |           var objManager = new YMaps.ObjectManager();
   |           map.addOverlay(objManager);
   |
   |              // Создание шаблона для значка метки (нумератор)
   |            var template = new YMaps.Template(""<div>\
   |                <img style=\""height:$[style.iconStyle.size.y];width:$[style.iconStyle.size.x];\"" src=\""$[style.iconStyle.href]\""\/>\
   |                <div class=\""CustomPointName\"">$[name|0]</div></div>"");
   |
   |            // Создание стиля для значка метки (нумератор) с использованием шаблона
   |            var s = new YMaps.Style();
   |            s.iconStyle = new YMaps.IconStyle(template);
   |            s.iconStyle.offset = new YMaps.Point(-22, -46);
   |            s.iconStyle.href = ""http://api.yandex.ru/i/maps/icons/blue.png"";
   |            s.iconStyle.size = new YMaps.Point(26, 46);
   |            s.iconStyle.shadow = new YMaps.IconShadowStyle();
   |            s.iconStyle.shadow.offset = new YMaps.Point(0, -25);
   |            s.iconStyle.shadow.href = ""http://api.yandex.ru/i/maps/icons/blue-shadow.png"";
   |            s.iconStyle.shadow.size = new YMaps.Point(25, 23);
   |            YMaps.Styles.add(""example#customPoint"", s);
   |" +
   
   ТекстHTML + ?(ТипМаршрута>0,МаршрутHTML,"") + "
   |    }    
   |    function onunloadpage(){
   |        map.destructor();
   |}
   |    </script>
   |
   |<STYLE type=text/css>
   |    .CustomPointDot {
   |        font-family:Arial,Geneva CY,Sans-Serif;
   |        font-size:12px;
   |        font-weight:bold;
   |
   |        position:absolute;
   |        left:1px;
   |        top:3px;
   |
   |        text-align:center;
   |        line-height:21px;
   |        
   |        width:25px;
   |        height:18px;
   |
   |        color:#444444;
   |    }
   |    
   |    .CustomPointName{
   |        font-size:12px;
   |        font-weight:bold;
   |
   |        position:relative;
   |        top: -41px;
   |        left: 10px;
   |    }
   |
   |</STYLE>
   |
   |<META name=GENERATOR content=""MSHTML 8.00.7600.16535"">
   |
   |</head>
   |<body style=""height: 100%"" onunload =""onunloadpage()"">
   |     <div id=""YMapsID"" style=""width: 100%; height: 90%""></div>
   |    <DIV style=""BACKGROUND-COLOR: #ffee77; MARGIN: 20px; DISPLAY: none"" id=""directions_panel""></DIV>
   |    <DIV style=""BACKGROUND-COLOR: #ffee77; MARGIN: 20px; DISPLAY: none"" id=""points_panel""></DIV>
   |     </body>
   |</html>
   |";
   
   GM.ДобавитьСтроку(ТекстHTML);
   GM.Записать(_КаталогВременныхФайлов + "GeoKontrs.html");
   ПолеHTMLДокумента.УстановитьТекст(ТекстHTML); //Перейти(_КаталогВременныхФайлов + "temp.html");
   //ПолеHTML = ПолеHTMLДокумента;

   //ПаузаВыполнить(2);
   //ЗаписатьМаршрутВТЧ();

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


2 mikecool
 
05.06.12
16:58
(1) омг )))
3 pumbaEO
 
05.06.12
17:04
(2) маршрут может строиться до минуты, не забудь про sleep
4 mikecool
 
05.06.12
17:07
(3) мне сам маршрут прокладывать не надо, пока только отобразить полигональ по имеющимся координатам с трекинга
5 mikecool
 
05.06.12
17:07
за пример спасибо, буду щас свое писать )))
6 pumbaEO
 
05.06.12
17:10
(4) зачем, тогда рисуешь вручную, в гугле точно(в яндексе не помню) можно POST передать трекинг и он сам построит по нему кривую.
7 pumbaEO
 
05.06.12
17:10
*передать трекинг  - передать файл с трекингом.
8 mikecool
 
05.06.12
17:14
(7) файл с трекингом - он обычно имеет какой то стандарт? мобильная торговля в нем ли?
9 pumbaEO
 
05.06.12
17:17
(8) файл с трекингом - 2 или 3 стандарта.
[мобильная торговля в нем ли?] - не понял вопроса.
10 Serg_1960
 
05.06.12
17:20
Угм... сильно зауважал. Даже как-то "тыкать" неудобно - буду теперь на "Вы" обращаться: Вы "не против", что я тут "отмечусь" для памяти на будущее?
11 mikecool
 
05.06.12
17:22
(9) мобильная торговля - суть агент плюс новой версии
вот она выгружает файл трекинга, там тупо три поля: дата и координаты, разделенные табуляцией
12 mikecool
 
05.06.12
17:23
ща попробую набросать скрипт, принцип понятен, вроде )
13 БалбесВ1с
 
05.06.12
17:27
(10)А я код из (1) на рабочий стол обоями сделал.
14 pumbaEO
 
05.06.12
17:28
(10) это не мое, подсмотрел где-то... Там еще обработчик на форме стоит и ожидает определенное время, как в

<DIV style=""BACKGROUND-COLOR: #ffee77; MARGIN: 20px; DISPLAY: none"" id=""directions_panel""></DIV>
<DIV style=""BACKGROUND-COLOR: #ffee77; MARGIN: 20px; DISPLAY: none"" id=""points_panel""></DIV>
добавятся элементы, но это неправильно, но к сожалению работает и все никак не перепишу на обработку события.

А так ли нужен трекинг, мы берем отметки посещений торговой точки, строю маршрут, проверяю относительное расстояние от координат снятия и координат торговой точки, коли километраж сильно отличается от задекларированного или же расстояние до точки больше чем пол километра, тогда задачу суперу - этого агента на ковер.
15 Learn_
 
05.06.12
17:29
ого какие вы тут все умные
16 Deon
 
05.06.12
17:30
(15) Элита
17 and2
 
05.06.12
17:30
(15) а ты вышей код крестиком.
никто из них и близко не умеет....
18 mikecool
 
05.06.12
17:32
(17) вот если на машинке - то да, а крестиком любой сможет
19 mikecool
 
05.06.12
17:32
(16) ошибка, правильно Илита
20 and2
 
05.06.12
17:34
(18) на машинке сейчас - как 2 пальца.
ввел программу - хоть Джоконду в цвете вышьет.
а вот крестиком руцами - то сильно уважительно....
21 Паланик
 
05.06.12
17:37
Зубры))
СафеЭррей - прикольно)
22 mikecool
 
05.06.12
17:43
(14) а вот не понял, нафига цикл
Для Каждого СтрокаКонтрагенты Из СоставМаршрута Цикл
если текстхтмл потом перебивается?
23 mikecool
 
05.06.12
17:45
(21) думать уже не хочется )
24 pumbaEO
 
05.06.12
17:49
(22) строиться строка с массиво координат точек
МаршрутHTML = МаршрутHTML+?(МаршрутHTML="","",",")+"'"+Формат(СтрокаКонтрагенты.Долгота,"ЧРД=.; ЧН=; ЧГ=0")+","+Формат(СтрокаКонтрагенты.Широта,"ЧРД=.; ЧН=; ЧГ=0")+"'";

а в html уже пишем вручную массив
|    var router = new YMaps.Router(["+МаршрутHTML+"], [1], {viewAutoApply: 1});
25 kuromanlich
 
05.06.12
17:51
а есть у яндекса ограничения по количеству точек при построении трека?
26 pumbaEO
 
05.06.12
17:54
(25) у яндекса пока нет, во всяком случаи для 30-60 точек проблем не было, у гугла ограничение 8 роутов = 10 точек.
27 mikecool
 
05.06.12
17:54
(24) это я понял, но там же собирается ТекстHTML, который не используется
или я гоню?
28 kuromanlich
 
05.06.12
17:57
(26) про гугл знал, вот про яндекс нет... обидно будет если все заточишь, а через пол года накося...
29 pumbaEO
 
05.06.12
18:00
Используется...

ПолеHTMLДокумента.УстановитьТекст(ТекстHTML);


Процедура вызывается из формы

Процедура ОбновитьФорму()
   
   ОбновитьКартуЯндекс(ЭлементыФормы.Карта, 2, 1);
   ПодключитьОбработчикОжидания("ПолучитьРасстояниеЯндекс", 2, Ложь);
       
КонецПроцедуры

ЭлементыФормы.Карта - ПолеHTML...
30 mikecool
 
05.06.12
18:01
(29) блин, так после того как соберется в цикле, тупо перебивается Текстхтмл = )))
31 pumbaEO
 
05.06.12
18:03
(28) тогда можно будет на бинг перейти, а если будут карты нарисованы то и на openstreetmap.

(30) работает ... не трогаю.
32 Learn_
 
05.06.12
19:24
(17) ну спасиб ))))))
33 Alex_MA
 
05.06.12
20:10
(0) скажите для каких целей ?
34 Alex_MA
 
05.06.12
20:11
матрица маршрутов чтоль ?
35 Agent ООЗ
 
05.06.12
20:33
как все сложно то, вот пример внешней обработки вывода гпс трека для трех карт: гугл, яндекс, опенстрит.
http://agentoid.ru/?attachment_id=706
36 Agent ООЗ
 
05.06.12
20:35
результат http://clip2net.com/s/20gXl
37 mikecool
 
06.06.12
12:18
(35) чета не подружился я с нею (
ну да бох с нею, потом может и получиться подружиться
возник маленький вопрос:
в при открытии вызывается
   ЭлементыФормы.ПолеHTMLДокумента.УстановитьТекст(Текст);
Текст содержит хтмл страницу, в которой описана ява функция GetPointObject
по кнопке заменяю Текст на свой, в котором также описана эта функция
но получаю при попытке использования, что функция не обнаружена
может нужен какой то рефреш?
38 mikecool
 
09.06.12
10:21
ситуация поменялась, бросил я переопределять текст страницы с картой
начал писать яваскрипты ))

проблема обнаружилась в получении координат по переданному адресу
делаю:
       var geocoder = new YMaps.Geocoder(AddressString);
       //map.addOverlay(geocoder); - если раскоментить, то добавится метка на карту
       var GeoPoint = geocoder[0].getGeoPoint(); -- вот здесь нулл с меткой или без (((
       var result = Array();
       
       result[0] = GeoPoint.getX();
       result[1] = GeoPoint.getY();
       
       
       return result;    
что делать?
39 rs_trade
 
09.06.12
10:28
(38) можно вкраце чего не получается? в 1С результат получить?
40 mikecool
 
09.06.12
10:30
(39) да, координаты нужны в 1с,
возвращал в 1с geocoder - у него в свойстве result = 0
хотя отметку на карте рисует, значит результат таки есть
41 acsent
 
09.06.12
10:35
может поможет
http://infostart.ru/public/69837/
42 mikecool
 
09.06.12
10:38
(41) не поможет, видел ее уже
43 mikecool
 
09.06.12
10:38
+42 все равно спасибо )
44 rs_trade
 
09.06.12
10:44
(40) он асинхронно работает. воткни alert перед ретурном. и посмотри, вернет в 1с или нет
45 mikecool
 
09.06.12
10:51
(44) воткнул
       var geocoder = new YMaps.Geocoder(AddressString);
       alert(AddressString);
       var GeoPoint = geocoder[0].getGeoPoint();
не удалось получить значение свойства "getGeoPoint": значением объекта является NULL или он не определен
зы: Привет, Ненавижу1с )))
46 mikecool
 
09.06.12
10:53
насчет асинхронности - читал, вот только ума пока не приложил - как из события вернуть данные в 1с )
47 rs_trade
 
09.06.12
10:56
Результат = Новый Массив;
МассивЗаказов = Док.parentWindow.getOrderArray(Результат);


В Javascript

function getOrderArray(result)
{  
  result.add(1);
  result.add(2);
  result.add(3);

  return(result);
}
48 mikecool
 
09.06.12
11:01
Пример ниже иллюстрирует обработку событий геокодера. В случае успешного геокодирования пользователю карты будет показано сообщение о количестве найденных объектов, а самый релевантный (первый) из них будет показан на карте:

YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
   if (this.length()) {
       alert("Найдено :" + this.length());
       map.addOverlay(this.get(0));
       map.panTo(this.get(0).getGeoPoint())
   }else {
       alert("Ничего не найдено")
   }
});

YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (error) {
   alert("Произошла ошибка: " + error.message)
});

вот сюда пока ума не хватает ))
49 mikecool
 
09.06.12
11:01
+48 попробовать чтоли обработку оповещения натянуть...
50 rs_trade
 
09.06.12
11:31
я че то с трудом вспоминаю свою войну с эти делом, но в итоге я по моему пошел другим путем. посмотри обработку, такое тебе подойдет?

https://dl.dropbox.com/u/20471596/ПолучениеКоординатПоАдресу.epf
51 mikecool
 
09.06.12
11:39
(50) посмотрел, щас попробую такую же фигню для яндекса придумать )
52 rs_trade
 
09.06.12
11:41
(51) У яндекса есть такой же формат запросов. Гугл меня устроил тем, что выдавал адм. округ Москвы, в отличии от яндекса.
53 pumbaEO
 
09.06.12
11:41
(51) почту проверь...
54 mikecool
 
09.06.12
11:48
(53) проверяю, сообщение в присоздании впечатляет ))))
55 mikecool
 
09.06.12
11:48
+54 спасибо
56 mikecool
 
09.06.12
11:53
(53) посмотрел, не нашел момента возврата координат в 1с ((
57 pumbaEO
 
09.06.12
11:58
(55) обращайтесь:
   |   // Создание обработчика события Click для карты
   |   YMaps.Events.observe(map, map.Events.Click, function (map, mEvent) {
   |   var ClickOnMap = document.getElementById(""Clikatel"");
   |   tempPoint = mEvent.getGeoPoint();
   |   document.body.CoordLat = tempPoint.getLat();
   |   document.body.CoordLng = tempPoint.getLng();
   |   document.body.ActionMap = 1;
     |   ClickOnMap.click();
   |    });
58 mikecool
 
09.06.12
12:00
(57) гм, описание обработчика и его вызов в обработчике?
59 mikecool
 
09.06.12
12:00
+58 и я уже упоминал - чего то нет у меня тех объектов, на которые ссылаешься ты ((
60 pumbaEO
 
09.06.12
12:06
(59) Давай еще раз описание задачи:
1. Есть адресс, надо получить координаты? (решается без поля HTML)
2. Есть адрес, получаем координаты, отмечаем на карте пускай пользователь посмотрит и согласится? (с помощью ПолеHTML)
61 mikecool
 
09.06.12
12:07
(60) нет, мне достаточно получить координаты
62 mikecool
 
09.06.12
12:08
как бы скрипт отрабатывает, метку размещает, но сам объект Geocoder возвращается пустым
63 pumbaEO
 
09.06.12
12:14
геокодирование через HTTP:
Перем _КаталогВременныхФайлов;
Перем  KeyAPI;

Функция hex(Знач Значение)
   Значение=Число(Значение);
   Если Значение<=0 Тогда
       Результат="0";
   Иначе
       Значение=Цел(Значение);
       Результат="";
       Пока Значение>0 Цикл
           Результат=Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Значение%16 + 1,1)+Результат;
           Значение=Цел(Значение/16) ;
       КонецЦикла;
   КонецЕсли;
   Если СтрДлина(Результат) < 2 Тогда
   
       Результат = "0" + Результат;
   
   КонецЕсли;
   Возврат "%" + Результат;
КонецФункции

Функция EncodeURL(URL)
   
   // отсюда: http://www.w3.org/International/URLUTF8Encoder.java
   
   Рез = "";
   
   Для Сч = 1 По СтрДлина(URL) Цикл
       
       ch = Сред(URL,Сч,1);
       vch = КодСимвола(ch);
       
       Если ("A" <= ch ) И ( ch <= "Z") Тогда        // "A".."Z"
           Рез = Рез + ch;
       ИначеЕсли ("a" <= ch ) И ( ch <= "z") Тогда    // "a".."z"
           Рез = Рез + ch;
       ИначеЕсли ("0" <= ch ) И ( ch <= "9") Тогда    // "0".."9"
           Рез = Рез + ch;
       ИначеЕсли (ch = " ") ИЛИ ( ch = "+") Тогда            // space
           Рез = Рез + "+";
       ИначеЕсли (ch = "-" ) ИЛИ ( ch = "_") Тогда        // unreserved
           // ch == '.' || ch == '!'
           // ch == '~' || ch == '*'
           // ch == '\'' || ch == '('
           // ch == ')') Тогда
           Рез = Рез + ch;
       ИначеЕсли (vch <= 127) Тогда        // other ASCII
           Рез = Рез + hex(vch);
       ИначеЕсли (vch <= 2047) Тогда        // non-ASCII <= 0x7FF
           Рез = Рез + hex(192 + Цел(vch / 64));
           Рез = Рез + hex(128 + (vch % 64));
       Иначе                    // 0x7FF < ch <= 0xFFFF
           Рез = Рез + hex(224 + Цел(vch / 4096));
           Рез = Рез + hex(128 + (Цел(vch / 64) % 64));
           Рез = Рез + hex(128 + (vch % 64));
       КонецЕсли;
       
   КонецЦикла;
   
   Возврат Рез;

КонецФункции // ()

Функция YandexGeoCodeGetFile(Адрес, Ключ, ПроксиСервер, АдресOutput)

   HTTPСервис = Новый HTTPСоединение("geocode-maps.yandex.ru",,,,ПроксиСервер,Ложь);
   
   Попытка
       HTTPСервис.Получить("1.x/?geocode=" + EncodeURL(Адрес) + "&key=" + Ключ, АдресOutput);
   Исключение
       Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
       Возврат Ложь;
   КонецПопытки;

   Возврат Истина;
   
КонецФункции // YandexGeoCodeGetFile()

Функция YandexGeoCode(Адрес, Ключ, ПроксиСервер, Рез)
   
   Рез = Новый Структура("lat, lng, Представление", 0, 0, "");

   АдресOutput = _КаталогВременныхФайлов + "geores.xml";
   
   Если Не YandexGeoCodeGetFile(Адрес, Ключ, ПроксиСервер, АдресOutput) Тогда
       
       Возврат Ложь;    
   
   КонецЕсли;
   
   ЧтениеXML = Новый ЧтениеXML;
   ЧтениеXML.ОткрытьФайл(АдресOutput);
   ПостроительDOM = Новый ПостроительDOM;
   ДокументДОМ = ПостроительDOM.Прочитать(ЧтениеXML);
   СписокText = ДокументДОМ.ПолучитьЭлементыПоИмени("text");
   СписокPos = ДокументДОМ.ПолучитьЭлементыПоИмени("pos");
   
   Если (СписокText.Количество() = 0) ИЛИ (СписокPos.Количество() = 0) Тогда
       
       Возврат Ложь;    
       
   КонецЕсли;
   
   Рез.Представление = СписокText[0].ТекстовоеСодержимое;
   Рез.lng = СписокPos[0].ТекстовоеСодержимое;
   ПОз1 = Найти(Рез.lng," ");
   Рез.lat = Сред(Рез.lng, Поз1 + 1);
   Рез.lng = Лев(Рез.lng, Поз1 -1);
   Возврат Истина;
   
КонецФункции // GeoCode()

Процедура ГеокодироватьСтроку(СтрокаТаблицы, Адрес="", Долгота=0, Широта=0)
   
   Рез = Неопределено;
   Если ЗначениеЗаполнено(Адрес) Тогда
       YandexGeoCode(Адрес, KeyAPI, Неопределено, Рез);
   Иначе
       YandexGeoCode(Формат(Долгота,"ЧРД=.")+","+Формат(Широта,"ЧРД=."), KeyAPI, Неопределено, Рез);
   КонецЕсли;
   
   Если СтрокаТаблицы.АдрессПоГеоКоду <> Рез.Представление Тогда
       СтрокаТаблицы.АдрессПоГеоКоду = Рез.Представление;
   КонецЕсли;
   
   Если СтрокаТаблицы.Широта+ СтрокаТаблицы.Долгота=0 Тогда
       СтрокаТаблицы.Широта = рез.lat;
       СтрокаТаблицы.Долгота = рез.lng;
       
   КонецЕсли;
   
КонецПроцедуры



ГеокодироватьСтроку - в строку таблицы возвращает или координаты или адрес. Передаешь адрес, возвращает координаты, передаешь координаты возвращает адрес. Более точное описание http://api.yandex.ru/maps/doc/geocoder/desc/concepts/input_params.xml
64 mikecool
 
09.06.12
12:19
(63) ого, спасибо )
65 rs_trade
 
09.06.12
12:28
(63)

Функция URLEncode4(Строка="")
   
   ScrCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
   ScrCtrl.Language="JScript";
   Сообщение = ScrCtrl.eval("var uri='"+Строка+"'; encodeURI(uri);") ;
   
   Возврат Сообщение;
   
КонецФункции
66 pumbaEO
 
09.06.12
12:30
(65) согласен, проще, но в linux не отработает, без доп шаманств
67 mikecool
 
09.06.12
14:54
получилось по варианту из (63)
всем спасибо )))
68 pumbaEO
 
09.06.12
14:55
(67) не забудь про apikey, а то на каком-то запросе забанят...
69 mikecool
 
09.06.12
14:59
(68) кстати, не нашел инфы - с какой частотой можно отправлять такие запросы?
поставил паузу в 3 секунды, насколько можно уменьшить?
а апикей есть )
70 pumbaEO
 
09.06.12
15:03
(69) когда много точек надо был определить, делал RND с 1 до 10 секунд. Есть ограничение до 2500 за сутки вроде (или то у гугла), но вроде было и у яндекса. Пару раз в результате тестов приходилось сосать лапу(зачеркнуто) ждать сутки.
71 ЗЫ5
 
09.06.12
15:05
аналогичный вопрос по 7.7 есть специалисты нашел такой код.
ScrptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");

ScrptCtrl.Language="vbscript";
ScrptCtrl.AddCode(
"Function EncodeURIcomponent(SourceString)
| Dim I, C, Out
| For I = 1 To Len(SourceString)
| C = Asc(Mid(SourceString, I, 1))
| '/// Пробелы заменяем на плюс
| If C = 32 Then
| EncodeURIcomponent = EncodeURIcomponent + ""%20""
| '/// Запрещённые символы заменяем на ""%"" и HEX значение от кода символа
| ElseIf (C = 44) Then
| EncodeURIcomponent = EncodeURIcomponent + "",""
| ElseIf (C < 48 Or C > 126) Or (C > 56 And C <= 64) Then
| EncodeURIcomponent = EncodeURIcomponent + ""%"" + Hex©
| Else
| '/// Разрещённые символы добавляем как есть
| EncodeURIcomponent = EncodeURIcomponent + Chr©
| End If
| Next
| End Function");

СтрокаURL = ScrptCtrl.CodeObject.EncodeURIcomponent(СтрокаAnsi);

Сервер = "geocode-maps.yandex.ru";
Страница = "/1.x/?geocode="+СтрокаURL+"&key=ANpUFEkBAAAAf7jmJwMAHGZH­rcKNDsbEqEVjEUtCmufxQMwAAAAAAAAAAAAvVrubVT4btztbdu­oIgTLAeFILaQ==";
Вопрос что в строку СтрокаAnsi должно передоваться?
72 pumbaEO
 
09.06.12
15:07
(71) http://api.yandex.ru/maps/doc/geocoder/desc/concepts/input_params.xml - или адрес или координаты вернет обратное переданному
73 ЗЫ5
 
09.06.12
15:07
еще есть вот пример может кому нужен
http://infostart.ru/public/76147/
только к 7.7. никак не могу прикрутить автора измучал))
74 ЗЫ5
 
09.06.12
15:09
(+73) при чем у некоторых получается запустить на 7.7. у нас никак..
может кто сталкивался у нас пишет  АктивХ.СоздатьЭУ("Maps1C.ActiveX.Maps1CUserControl");
{C:\DOCUMENTS AND SETTINGS\FEDOROV\РАБОЧИЙ СТОЛ\MAPS\MAPS.ERT(63)}: Создание элемента управления Maps1C.ActiveX.Maps1CUserControl не удалось в 8.2. все работет идеально.
Если делаешь АктивХ.СоздатьЭУ("Maps1C.Карта"); то ошибок не выдает но на форме появляется сообщение окно здесь должен быть элемент АктивХ.
75 ЗЫ5
 
09.06.12
15:10
самое интересное что разработка автора на 8.2 работает идеально..
76 pumbaEO
 
09.06.12
15:10
прикольные ограничения:
2. Максимальное количество маршрутов - 3  - люди купять и потом им скажут, для гугла ограничение в 8 маршрутов, хотите большего заплатите еще гуглу нехилую денюжку...
77 ЗЫ5
 
09.06.12
15:11
(76) так нам просто точки нужны маршруты не нужны нужен анализ покупателей. на карте
78 ЗЫ5
 
09.06.12
15:12
(72) Спасибо.
79 pumbaEO
 
09.06.12
15:16
(77) вам просто точки нужны или еще нужна интерактивность, типа клацнули на карте, вот эта точка?
80 ЗЫ5
 
09.06.12
15:21
(79) Выгрузить хотим из справочника Контрагенты покупателей чтобы можно было двигаться по карте на форме 1С и смотреть кто сколько берет в каком регионе и какой менеджер отвечает за этого контрагента ну это можно цветами выделять.
81 pumbaEO
 
09.06.12
15:26
Формируйте себе правильный html, и показывайте, если честно не вижу проблемы. То API яндекса которое достаточно, что бы отобразить... (вставляете activex объект ie и можете через форму смотреть)... Но я бы советовал сохранять в файл html и открывать современным браузером, с ie6 приходилось костыли выдумывать причем на одной машинке работает, на другой нет...
82 ЗЫ5
 
09.06.12
15:42
Сделал такой код в 7.7. на форме сделал текстовое поле КартаАктХ но при выполнении это кода все равно в примоугольнике пишет, здесь должен быть элемент АктивX не доходит что ему может не нравится..
АктивХ = СоздатьОбъект("АктивИкс") ;
АктивХ.УстановитьАтрибут(Форма,"КартаАктХ");
АктивХ.СоздатьЭУ("Maps1C.ActiveX.Maps1CUserControl");
АктивХ.УстановитьФокус();
Карта = АктивХ.Объект;
Карта.ТипКарты="GoogleMap";
Карта.Маршруты.Очистить();
Карта.Маркеры.Очистить();

СтрокаПоиска1="Россия, Новосибирск, Ленина, 12";
СтрокаПоиска2="Россия, Новосибирск, Гоголя, 30";

Координаты1 = Карта.ПолучитьКоординатыПоАдресу(СтрокаПоиска1);
Координаты2 = Карта.ПолучитьКоординатыПоАдресу(СтрокаПоиска2);
ТекМаркер=Карта.ДобавитьМаркер(Координаты1);
ТекМаркер=Карта.ДобавитьМаркер(Координаты2);
Карта.АвтомасштабМаркеров();
83 ЗЫ5
 
09.06.12
15:42
компоненту автора зарегил ок в 8.2 все супер а в 7.7. не идет..
84 mikecool
 
15.06.12
16:31
а вот как определить оверлей на карте по координатам?
есть - список точек с координатами, тыцкаю в нужную - на ней происходит центрирование
хочу еще сменить тип балуна, поменять ему цвет, может еще и размер )
85 mikecool
 
15.06.12
16:57
попробую поднять, хоть и тяпница, хоть и вечер )
86 kuromanlich
 
15.06.12
17:07
а у тебя есть уже функция "рядом"? ну типа учет 15 метровой погрешности. поделешься?
87 mikecool
 
15.06.12
17:14
(86) ээ? не, такую еще не рисовал ((
88 kuromanlich
 
15.06.12
17:19
а мне вот уже понадобилос... е охота возиться... по идее функции приближения должны быть в инете специально для геокоординат...
89 kuromanlich
 
17.06.12
12:17
(88) не приближения, а принадлежности? wiki:Функция_принадлежности
90 kuromanlich
 
17.06.12
16:10
(0) если понадобится "функция приближения" (в абсолютном конечно выражении, т.е. обычное множество) то вот тут Калькулятор расстояния (гео. координаты А и Б) есть функция вычисения расстояния между двумя точками
91 mikecool
 
21.06.12
15:02
(84) так понимаю сложно реализовать, если вообще возможно
решил пойти другим путем - сохраняю в массиве добавленные на карту элементы и буду пробовать работать с ним
не найду - если несколько меток одна на другой, то как (если я знаю метку) вывести ее на передний план?
92 pumbaEO
 
21.06.12
15:07
(91) на хабре почитай, там была поднята тема с оверлейми и множеством точек с объединениями и т.д.
93 mikecool
 
21.06.12
15:34
(92) не нашел там упоминаний по своему вопросу (
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший