Не вдаваясь в теории, совсем кратко опишу отличия: Почти все публикации на ИС, касающиеся работы с Яндекс-картами, основаны на использовании API 1.X, для которой требуется ключ доступа и которая, по нынешним меркам и утверждениям самих разработчиков, устарела. Поэтому за основу я взял актуальную версию 2.0, к тому же не требующую никаких ключей и регистраций, обладающую гораздо более широкими возможностями. Кроме того, представлен другой подход к работе с самой картой. Ранее представленные механизмы были основаны на принципе создания html-текста, который сразу формировался с учётом всех потребностей и, таким образом, для изменения поведения карты требовалось новое формирование этого исходного текста и перезагрузка его в окно встроенного браузера. Это более времяёмко и ресурсоёмко, громоздко и менее гибко. Я заложил в текст исходного html-текста только самые основные параметры-шаблоны (хотя и это может быть универсализировано), а функционал основан на заложенных в тексте js-функциях, которые по мере надобности вызываются из контекста клиента 1С.
Напоминаю, что, согласно Пользовательскому соглашению (http://legal.yandex.ru/maps_api/) и конкретно п.2.3.2, промышленное использование Yandex API в 1С фактически запрещено, и поэтому позиционирую публикацию как примеры для ознакомления, и не более того.
Примеры сведены в обработку, позволяющую наглядно ознакомиться с несколькими простейшими операциями в картах Яндекс. Просьба особо не плюсить, т.к. уровень знания javascript у меня ниже плинтуса, а именно он требуется для задачи в первую очередь. Вопросы, пожелания и замечания приветствуются — будет интересно «выжать» из такого подхода максимум.
UPD: добавил отслеживание событий с относительно управлямой подпиской на них. Всё очень грубо и без использования нормальных возможностей коллекции events на стороне js. Действие показано на примере определения координат места, куда щёлкнул пользователь. Ещё добавил кнопку удаления (скрытия) баллунов и меток.
UPD: добавил прямое геокодирование. Всё-таки захотелось сделать нормальное синхронное множественное геокодирование, по списку строковых адресов получаем их координаты.
UPD: добавлено создание многоугольников, в т.ч. с изменяемой геометрией (включённым режимом редактирования), заодно приведён пример конвертации цвета из RGB в Hex, чего сама 1С не умеет.
Ужасный синтаксис. Название переменных вообще поражают. А за все остальное большое спасибо.
Не подскажите . я смотрю вы передаете com объекты. попытался передать массив у меня не чего не вышло. не подскажите как быть?
(4) так она платная 🙁
(1) Чем же «ужасный»? Отсутствием пробелов? 🙂 И если не секрет, что поражает в названиях? 🙂
http://infostart.ru/public/98156/ (перекопипащивалось всё, вплоть до опечаток).
(2) Попробую завтра выслать.
(3) Массив передавать не пробовал; в качестве грубого решения могу посоветовать сделать функцию, в которую передаётся по 1 аргументу, вызвать сколько надо раз, а массив пусть сразу рождается на стороне js.
(4) Не поверите, я все имеющиеся обработки ИС внимательно посмотрел. 🙂 Правда, уже после своей публикации наткнулся-таки на один случай, клиентская карта на API 2.0, а остальное всё старьё, причём, что забавно, почти все «навороченные» разработки базируются на
я довльно много обработок с картами перебрал, но нужного решения так и не нашел. Мне нужно чтобы пользователь ткнул в карту (грубо говоря метку поставил), а ему (в какой-то реквизит обработки) вернулся АДРЕС этой точки.
(7) Могу завтра сделать.
(1) Я не хочу продолжать спор. я возьму свои слова обратно.
(3) Я из 1С передаю массив для построение полигона, к сожалению так и не смог его обработать на стороне явы, не хочет перебираться. Пришлось передовать строку и парсить ее. Почти переписал свою обработку на новый подход, очень порадовал меня, еще раз большое спасибо за пример.
Очень удобная вещь для отслеживания торговых
(7) Сделал. Надо включить отслеживание событий, потом по факту эти события перехватываются и читаются координаты. Грубо, конечно, надо бы через events на стороне скрипта.
(9) Я бы сделал так: сначала myArray=[]; потом function AddToArray(myArray,myElement) {myArray[myArray.length]=myElement} и дёргал эту функцию бы в цикле со стороны 1С. А потом перебрал бы так: for(var i in myArray) {// некое действие с элементом myArray[i]}
Или, посмотрите, как я компоную объект (это в данном случае почти как и для массива), передаваемый к прокладке маршрута — делаю строку и исполняю на js функцией eval.
(11) Скинь сюда плиз: zel_maks@mail.ru
Всё-таки не удержался, добавил множественное прямое геокодирование. Просто как пример, как можно извратными средствами обработать асинхронные вызовы js promise. Надеюсь, кому-нибудь пригодится.
возможно ли организовать прокладку маршрута для пешехода? и получить примерную длину этого маршрута и время его прохождения?
(14) Насколько знаю, специализированной прокладки маршрутов для пешеходов Яндекс-карты не делали. Единственное, что они советуют, процитирую: «Однако, время = расстояние / скорость. Расстояние между двумя точками Вы можете узнать с помощью метода distance() класса YMaps.GeoPoint.» — т.е. можно задействовать ту же механику, но с меньшей скоростью. Может быть, этот вариант подойдёт?
(15) такой вариант вряд ли подойдет — пешеход все же по дорогам (тротуарам) ходит, а не сквозь дома, если брать расстояние напрямую:) , да и не по автомобильному маршруту он пойдет, а закоулками-переулками без учета «кирпичей» и «встречки»… Спасибо за ответ.
А можно как то реализовать что бы балуны нельзя было двигать мышкой!? Спасибо!
(17) Да, элементарно. В исходном js-коде (макет «Исходный код») поменяйте параметр «draggable» в функциях AddSimplePoint, AddTextPoint (ну и вообще, где надо) — вместо draggable: true надо, соответственно, draggable: false. И всё.
Подскажите пожалуйста как сделать процедуру/функцию удаления всех меткиБалунов с карты (очистить карту)? Спасибо
(19) Тут по-разному можно. Если это именно баллун — тогда через метод Hide (он в обработке есть), а если это метки — можно сбросить им свойство Visible. Если они добавлены в коллекцию показываемых геообъектов — их можно удалить оттуда через map.geoObjects.Remove(myMark). Это я вроде тоже сделал, нэ?
Не уверен, сработает ли в браузере 1С такой код: map.geoObjects.each(function(gOb) {gOb.Visible=false}), но можно попробовать. Разумеется, с проверкой, является ли «gOb» меткой, а то можно всякие другие объекты карты заодно зацепить).
Спасибо !
Просьба выслать обработку Яндекс-карты: примеры работы с API 2.0 на адрес prog@sirobogatov.ru
Значит «напрямую» всётаки нельзя передать массив?
Добрый день! Не могу скачать Вашу обработку… Но очень хочется посмотреть))) Можете поделиться?
vik-k@mail.ru
Ещё не хватает функции удаления маршрута/маршрутов. Может добавите?
Вопрос ко всем — а как с печатью? Сделал подобное, но мне нужно еще и распечатывать результат. Может у кого есть наработки?
(24) Не помню, отправлял Вам или нет?
(25) Посмотрим. Будет свободная минутка — добавлю.
(26) А что мешает распечатать прямо сам HTML-документ? Или, выдрать из него нужный элемент, загнать в отдельно сделанный хтмл, да и на печать?
(27) Ну как бы… Вы пробовали? Именно на 2-м апи? У меня печатается только слова «Яндекс Лицензионное соглашение», а самой карты нет. Если делать на апи 1.х то все нормально печатается.
Выдрать картинку-слой самой карты. Ну наверное да — можно. Но меток на ней не будет. Они в дрогом слое. И это торгда сводить вместе как-то. Наверное возможно (Точно возможно ведь на самих ЯК печать есть), но как и насколько просто …
(28) Упс, я как раз на 1.Х пробовал печатать. Мдя, надо подумать. Интересная задачка, покопаюсь.
Добрый День! , у меня на карте такая ошибка выходит, скачал вашу у вас тоже также, никак не могу разобраться , записываю код html и открываю его в хроме , или ИЕ все работает нормально , а ПолеHTMLДокумента нет
(30) ak0710, я решил проблему, требовалось записать сначала во временный файл весь документ , потом из поле хтмл документа воспользоваться методом перейти, ошибка не появляется
Подксажите, пожалуйста, к ак передать паарметры, а именно координаты вершин многоугольника в функцию из 1С: «ЭлементыФормы.ПолеКарты.Документ.parentWindow.CreateAnyPolygon(рКарта,стрГеокодировать,рЦветФона,рЦветРамки,рТолщина);»
я передаю строку типа «[[[50.01, 30.01],[50.20, 30.20],[50.01, 30.01]]]» — ничего не происходит, многоугольник не рисуется, а если такую же строку прописываю жестко в html коде:
myGeometry = {
type: ‘Polygon’,
coordinates: [[[50.01, 30.01],[50.20, 30.20],[50.01, 30.01]]]
},
— всё работает.
Что передавать в качестве параметра (вершины многоугольника) из 1с ????
Добрый день друзья,подскажите, можно ли добавить метки на карту и произвести масштабирование таким образом, чтобы все метки попали в область видимость. Перерыв яндекс апи но не нашел информации.
(11) Добрый день. Уважаемый Yashazz, не могли бы Вы скинуть свою обработку на lou-bega@list.ru Заранее благодарю.
(33) Mudrii_Gankster, можно попробовать сначала найти центр всех меток , среднюю долготу и широту, а далее расстояние между крайними метками вычислить , потом в зависимости от расстояния этих меток устанавливать маштаб
Yashazz, Добрый день. Можно взглянуть на вашу работу? sv-k@live.ru Заранее большое спасибо.
Yashazz, буду очень признателен, если Вы скинете обработку на shevelkin@pisem.net
(36) Так вам скидывать или нет? Файл, судя по надписи, Вы уже скачали.
классная публикация, давно хотел чтото такое увязать 🙂
для 8.1 есть?
А возможно ли выводить несколько карт на печатный лист по примерувот этой разработки ?
т.е несколько адресов -> сотвественно выводится несколько кусков карты с точками адресов.
(40) Это элементарно даунгрейдится в 8.1, просто копипастом всего и вся. Всё должно работать.
Спасибо, как раз начал осваивать эту сферу.
Для разбора примеров самое оно!
Как прокладывается маршрут между 3 и более точками?
(44) В каком смысле? Точки, между которыми должен быть маршрут, вносятся в таблицу значений, и от порядка в этой таблице всё и зависит. От первой ко второй, далее к третьей итд. А если вы о математико-графической модели, лучше у самих яндексовцев спросить.
(29) С печатью — кирдык. В API её как таковой нет, разработчики Яндекса честно признаются, что и свою-то штатную печать делали весьма тяжко и извратно, и что готовых решений нет. Скидывать всё в static API, разве что.
Для себя сделал грубо, просто, но с нарушением лицензионного соглашения (ну, для эксперимента-то можно) — я банально вывожу карту в её текущем состоянии на форму, с которой программно лепится скриншот, и дальше в mxl и айда. Другие пути ещё более кривые.
(45) Т.е. маршрут строиться по порядку из таблицы. Никакой отптимальности нету, я так понимаю? Просто сейчас работаю над этим, и было бы интересно посмотреть что-то про оптимально-построенный маршрут.
(46) А, вы в смысле оптимальности путей между точками, как вершинами графа? Это уже «задача коммивояжёра», что не было предметом публикации. Поищите решения этой задачи для случаев оптимизации расстояния, повторых посещений и прочая.
Можно ли выделить несколько флажков и передать в 1С их координаты (лучше адрес дома)?
Вышлите пожалуйста на magefred@mail.ru обработку, очень хочется ее потестить
(48) Не совсем понял, как «выделить». Каким образом флажки появились на карте изначально?
Из 1с построили их
В смысле, было геокодирование? Тогда читаются результаты этого геокодирования из массива, и всё. Я не морочился с жёсткой идентификацией, поэтому точки-метки идут строго по порядку, по какому геокодировались.
Из 1с строятся флажки на карте по нескольким адресам.
В первую очередь интересует можно ли получить от карты адреса по выделенным флажками домам:
Сначала к примеру отправляем список с 10 – адресами, на карте должны появиться флажки по этим адресам,
затем мышкой выделяем 4 флажка и нужно получить обратно от карты адреса этих выделенных флажков.
Та же проблема, решений на форуме больше, чем баллов, как доберу, скачаю.
А так очень полезная разработка.
Как уже кто-то заметил, на основе Вашего творения появились новые примеры, с теми же ошибками и той же стилистикой оформления 🙂
(53) Ошибки на бочку, прям сюда. Бум исправлять!
Есть возможность определения административных округов Москвы?
(55) А у самого-то Яндекса такая возможность есть? Если они её в API запихнули, то, думаю, можно, а иначе — вряд ли.
Ну так что, есть зафиксированные баги? С удовольствием исправлю, мне ещё эту механику самому юзать )))
Почему в маршруте балуны не подписаны: 1,2,3 — хотя бы. Я к тому, что нарисовать маршрут это одно, а проиндексировать точки это по труднее будет.
В обработке есть индексация точек маршрута?
(55) plastilin, У яндекса есть сервис «Регионы «. Но сервис базируется на OpenStreetMap и предоставляют доступ только к регионом стран (Россия, Украина и т.п.).
(30) В html добавляете:
Показать
***) Работает фильтр javascript’ов чтобы исключить XSS атаки (так мне сказали в техподдержке), поэтому «критичные слова» разбиты на части. Так, «sc ript» — это «script», «window.on error» — это «window.onerror».
Автору спасибо за идею. Продолжил работу с API2. Вот мойпример .
(7) С опозданием, конечно… Здесь вопрос «кликнул по карте — получил адрес» решен
(57) В какой-то из своих узкоспециальных обработок на основе этой — да, есть. Странно, что в выложенной версии ещё нету, упустил, видать. Но там можно просто по порядку, или в eval передавать ещё массив надписей к баллунам, и тогда по его индексу будет брать в цикле нужное название.
А вообще, что-то мне Гугл-карты в последнее время нравятся больше. Геокодирование у них однозначнее. У Яндекса ведь как — задаёшь ему «улица Пупыркина, дом.666», он не-пойми-куда ставит маркер. Последний раз вообще в Баварию куда-то уехал, я еле нашёл. А у Гугла в этом случае ставит в геоцентр населённого пункта, в случае Мск это Кремль с чётко заданными координатами. Хоть можно понять, что геокодинг не удался.
Спасибо. Очень интересно.
Подскажите, а можно ли на карте выделить зону(прямогольник) или провести отрезки (маршрут) и затем получить координаты этих точек?
можно через яндекс карты на ява скрипте:
ymaps.ready(init);
var myMap, myGeoObject, myRectangle;
function init () {
myMap = new ymaps.Map(‘map’, {
center: [55.674, 37.601],
zoom: 11
});
// Cоздаем геообъект с типом геометрии «прямоугольник».
myGeoObject = new ymaps.GeoObject({
// Геометрия = тип геометрии + координаты геообъекта.
geometry: {
// Тип геометрии — прямоугольник.
type: ‘Rectangle’,
// Координаты.
coordinates: [
[55.665, 37.66],
[55.64, 37.53]
]
},
// Свойства.
properties: {
hintContent: ‘Перетащи меня!’,
balloonContent: ‘Прямоугольник 2’
}
}, {
// Опции.
// Объект можно перетаскивать.
draggable: true,
// Цвет и прозрачность заливки.
fillColor: ‘#ffff0022’,
// Цвет и прозрачность границ.
strokeColor: ‘#3caa3c88’,
// Ширина линии.
strokeWidth: 7
});
// Создаем прямоугольник с помощью вспомогательного класса.
myRectangle = new ymaps.Rectangle([
// Задаем координаты диагональных углов прямоугольника.
[55.66, 37.60],
[55.71, 37.69]
], {
//Свойства
hintContent: ‘Меня перетаскивать нельзя!’,
balloonContent: ‘Прямоугольник 1’
}, {
// Опции.
// Цвет и прозрачность заливки.
fillColor: ‘#7df9ff33’,
// Дополнительная прозрачность заливки..
// Итоговая прозрачность будет не #33(0.2), а 0.1(0.2*0.5).
fillOpacity: 0.5,
// Цвет обводки.
strokeColor: ‘#0000FF’,
// Прозрачность обводки.
strokeOpacity: 0.5,
// Ширина линии.
strokeWidth: 2,
// Радиус скругления углов.
// Данная опция принимается только прямоугольником.
borderRadius: 6
});
myMap.geoObjects
.add(myRectangle)
.add(myGeoObject);
}
Не кто не догнал как сделать растягивания карты при растягивании формы?
(65) Растягивание — в смысле, увеличение размеров рабочего окна? Наверное, можно менять свойства этого контейнера при каком-либо событии от 1С…
(66) Да именно. пробовал но, что то у меня не вышло. буду пробовать дальше. где то читал не у одного меня такая проблема.
Показать
Срабатывает защита…. уточняю:
….scroll=»no»
….style=»width:100%;height:100%;»
Яндекс карты всем устариюват, один минус существенный есть, в небольших населенных пунктах с улицами и домами не работает маршрутизация в отличие от того НАВИТЕЛ например а так все наглядно и прекрасно работает.
у меня так и не заработало нормально
Ну так что?
(71) Vanch90, ну так что что?
Здравствуйте! помогите с проблемой, не растягивается иконка метки, что в скрипте не так?
<html >
<head>
<meta http-equiv=»content-type» content=»text/html; charset=utf-8″/>
<script src=»http://api-maps.yandex.ru/2.1-dev/?lang=ru-RU&load=package.full»» type=»»text/javascript»></script>
<script type=»text/javascript»>
//убираем глюк встроенного в платформу браузера: ошибка сценария Script error при повторном отрытии окна
window.onerror = myOnError;
function myOnError(msg, url, lno) {return true}
var myMap;
ymaps.ready(function ()
{
myMap = new ymaps.Map(‘YMapsID’,
{
center:[//Здесь добавим текущие координаты],
zoom:12,
controls: [‘geolocationControl’, ‘typeSelector’, ‘trafficControl’]
});
myPlacemark0 = new ymaps.Placemark(
[41.26954, 69.366503],
{iconContent: ’18:37′},
{preset: ‘twirl#redStretchyIcon’});
myMap.geoObjects.add(myPlacemark0);
});
</script>
<style type=»text/css»>
html, body {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id=»YMapsID» style=»width:100%;height:100%;»</div>
</body>
</html>
Показать
Обработка класс!
Ребят, не подскажите, как изменить рисунок метки на карте?
Спасибо! 🙂
Чувак, не занимайся программированием. У тебя плохо получается. Меня чуть не вырвало от твоего кода.
(75) ilov_boris, это твои маленькие проблемы, ага. Есть что сказать конкретно — давай, высказывай в личку или по теме, а озвучивать свои кишечные трудности — не на ИС. Тут люди дело делают, вообще-то.
(76) «Тут люди дело делают, вообще-то.»
Да вы занимайтесь чем хотите… В паблик свои дела только не выкладывайте.
(76) Ладно, чувак, приношу публично свои извинения. Не серчай.
Из беседы в личке я понял, что человек ты адекватный, но писать таки старайся аккуратнее.
Это ж паблик. По публичному коду судят о всех одинэсниках.
(78) Ладно, проехали. В свою очередь, извиняюсь за специфический стиль кода (это я так эффект цопирайта типа делаю), и за недостаточные комментарии; также, готов рассматривать претензии по структурированности и логике кода. Ну и если кто нарыл ошибку или лажу, обязательно сообщайте, плиз.
Решение проблемы с растягиванием карты на все HTML поле:
Показать
Спасибо доброму человеку за очередную полезную публикацию
Добрый день.
Выходит ошибка : Ошибка при получении глобальной переменной OurYandexMap; возможно, переменная не инициализирована!
В чем может быть дело?
API менялся, а я под новый ничего не делал. Если актуально, пиши в личку
Добрый день!
Прошу автора написать на почту locksar86@yandex.ru