Клуб API Карт

май 2017
Вопрос по карте
zte@innovationsoft.ru
1 мая 2017, 15:54

Здравствуйте! Такой вопрос, есть ли возможность проложить маршрут с несколькими точками на вашей карте из другого приложения. Используя вашу документацию можно проложить маршрут только из одной точки в другую ( https://tech.yandex.ru/yandex-apps-launch/maps/doc/concepts/yandexmaps-android-app-docpage/   ). А есть ли возможноть протянуть через пару точек ?

4 комментария
Загрузка балуна через AJAX
Роман
1 мая 2017, 23:54

Есть такой вот код: http://jsfiddle.net/avdjbsn8/

Под него я настроил загрузку данных через ajax.

Работает всё идеально, единственное я хочу кое что поменять.

При первом клике на балун его не видно несколько секунд (на время загрузки).

Как сделать так, чтобы при этом первом клике моментально открывался балун с надписью "Идет загрузка данных...", а после того как данные были получены через ajax они внеслись в сам балун.

Это уже реализовано тут: https://tech.yandex.ru/maps/jsbox/2.1/balloon_ajax

Но я использую objectmanager, и у меня не получается прикрутить это к моему коду.

Всё что я смог сделать, это вот: http://jsfiddle.net/obLdkhh4/

Работает, но почему-то только для первой метки. Если загружать еще, то эффекта не даёт.

4 комментария
Скроллинг двумя пальцами в мобильной версии яндекс картах
mtao.biz
2 мая 2017, 12:16

Всем привет! 

Не нашел в документации, возможно ли прокручивать карту не одним, а двумя сдвоенными пальцами на мобильных устройствах? 

Просто задисаблить или прокрутка одним пальцем не подходит...

Благодарю

19 комментариев
Прокрутка карты в мобильных устройствах
searchControl - приоритет поиска, не удается задать.
Дмитрий Петровский
3 мая 2017, 11:43

Для searchControl устанавливаются опции:

var searchControl = myMap.controls.get('searchControl');
searchControl.options.set("width", "400px");
searchControl.options.set("useMapBounds", true);

Хочется, чтобы при поиске на первых местах были адреса, которые находятся в текущей видимой области (хорошо бы и ближайшие к области тоже).

Но мы видим следующее:

Почему на первом месте Екатеринбург, а не Нижний новгород?

Что надо сделать для желаемого результата?

3 комментария
Рассчитать расстояние между двумя точками в километрах
neovich2017
4 мая 2017, 18:04

Рассчитываю расстояние между двумя точками по формуле :

корень квадратный( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) ), получаю расстояние между двумя точками, только не понятно в каких единицах,

по удаленности правильно рассчитывает формула. только в каких единицах мы получаем расстояние? Мне нужно это в км перевести ,

Как это сделать? 

2 комментария
Расчет стоимости доставки, что бы конечный адрес вводился с внешнего input
Андрей О.
5 мая 2017, 07:22

Подсмотрел как реализовывается Расчет стоимости доставки на постах раньше.

Все хорошо работает, но понадобилось добавить функцию, что конечный адрес можно было ввести с внешнего поля формы, а не на той что на карте или кликом по самой карте. Подскажите как можно такое сделать, пробовал совместить с SearchAddress, но как то не выходит. 

Вот тестовый домен http://vartan.sstest.ru/dostavka

Нет комментариев
Странно строятся маршруты в Уссурийске
(CDC)
5 мая 2017, 11:06

Мы используем платное API и наш клиент жалуется, что по Уссурийску маршруты строятся несколько странно.

Тут с ним сложно не согласиться. Вот типичный пример, который можно проверить в песочнице:

ymaps.ready(init);
function init() {
    var myMap = new ymaps.Map("map", {
            center: [43.76, 131.8],
            zoom: 9
        });
    ymaps.route([
        [43.83, 131.63],
        [43.8, 131.6],
        [43.76, 132]
    ]).then(function (route) { myMap.geoObjects.add(route); });
}

Здесь мы видим, что после второй точки маршрут уходит куда-то в дебри для разворота, что увеличивает маршрут на приличное количество километров.

Что это?

Кривой граф дорог? Не выставлены какие-то параметры маршрутизации?

Как нам избежать такой ситуации?

1 комментарий
маршрутизация,маршрутизатор,расчет маршрута
Доступ к ссылке balooncontentbody
samaromku
5 мая 2017, 15:01

Здравствуйте.

Есть кластеры, у них, внутри balooncontentbody находится ссылка на страницу.

Пытался получить доступ к ней по id,

типа document.getElementById и $('#ссылка') - не получается.

Через какой объект нужно взаимодействовать и каким методом?

4 комментария
Кластеризация объектов
Задать картинку для множественной метки
neovich2017
5 мая 2017, 15:04

Есть метки где собраны несколько меток и они отображаются кружком http://prntscr.com/f4emh6

Как эту метку заменить на свою на эту http://prntscr.com/f4en7p

1 комментарий
Переключение адресов на яндекс карте
l.semen4enko
5 мая 2017, 20:03
	<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
	<script src="http://api-maps.yandex.ru/2.1/?load=package.standard&lang=ru-RU" type="text/javascript"></script>

	<div id="map" style="width:400px; height:300px"></div>

	<a href="#" class="goto" data-map="Москва">Москва</a><br>
	<a href="#" class="goto" data-map="Киев">Киев</a><br>
	<a href="#" class="goto" data-map="Екатеринбург">Екатеринбург</a><br>
	<a href="#" class="goto" data-map="Одесса">Одесса</a>

<script>
		ymaps.ready(init);

		function init() {
			var myMap = new ymaps.Map('map', {
			    center: [55.753994, 37.622093],
			    zoom: 10,
			    controls: []
			});

	        destinations = {
	            'Москва': [55.753559, 37.609218],
	            'Санкт-Петербург': [59.938531, 30.313497],
	            'Екатеринбург': [56.829748, 60.617435],
	            'Одесса': [46.466444, 30.7058]
	        },        

		    $('.goto').on('click', function(e){
		    	e.preventDefault();

		    	var pos = $(this).data('map'); 

		    	console.log(pos);

		    	// переходим по координатам
		    	myMap.panTo(destinations[pos], {
		    	    flying: 1
		    	});
		    });


		    var myPlacemark = new ymaps.Placemark(destinations['Москва'], {
		        
		    }, {
		    	iconLayout: 'default#image',
		        iconImageHref: 'map-icon.png',
		        iconImageSize: [79, 96],
		        iconImageOffset: [0, -50],
		    });

		    myMap.geoObjects
		        .add(myPlacemark);
		}
	</script>

Есть карта и ссылки с data атрибутами, внутри которых записаны адреса. По клику на ссылку должен происходит переход (не обязательно плавный)  или новая загрузка карты с этим самым адресом вн. дата атрибута данной ссылки. 

destinations  не подходит для данной цели, потому как редактирование адресов не через скрипт будет происходит, а с помощью задания этих самых адресов внутри data-map.

Вопрос: как можно поправить скрипт, чтобы формировалась карта с меткой (и маркером к ней) + по клику на ссылку происходил переход к адресу ссылки, с центрированием и отображением маркера у данного адреса?

3 комментария
yamaps
Ограничение на количество и/или частоту обращения к маршрутизатору
Роман В.
5 мая 2017, 22:51

Здравствуйте!

Имеется ли какое-либо ограничение на количество запросов к маршрутизатору, кроме 25000 в сутки для бесплатной версии js-API?

В моём проекте происходит построение большого количества маршрутов за раз, однако  больше 1147 маршрутов (год основания Москвы? ;)) ни разу не удавалось получить за  раз. При этом при повторном подключении маршруты снова строятся, но на каком-то моменте сервер перестает отвечать. Пробовал вводить таймауты и кликать руками — всё равно упираюсь в какой-то предел, 1147 или меньше.

Если убрать воду, то мой код выглядит следующимо бразом:

По клику на карту определяются координаты, для которых требуется построить маршрут, далее рекурсивно вызывается функция построения маршрута после того, как пришёл ответ от сервера для предыдущего маршрута. И так до тех пор, пока все координаты не будут обработаны.

function init () {

	var targetCoords = [55.848527, 37.583103],

	myMap = new ymaps.Map('map', {
	    center: targetCoords,
	    zoom: 11
	}, {
	    searchControlResults: 1,
	    searchControlNoCentering: true
	}),

	currentRoute,
	sourceCoordsArr,
	targetPoint;

	routesArr = [];
	var sourceCoordsArrLength;
	myMap.events.add('click', onMapClick);

    function evalRoute(source, target){
    	var currentRoute = new ymaps.multiRouter.MultiRoute(
    	{
    		referencePoints: [source, target],
    		params: { routingMode: 'masstransit'},
    	});

    	currentRoute.events.add("activeroutechange", function (event) {
    		var routes = currentRoute.getRoutes();
    		for (var i = 0; i<routes.getLength(); i++){
				// some code
    		}

	    	routeArr.push(route);	
	    	console.log('' + getCurrentTime() + '\t' + routeArr.length+' ' + route);

	    	if(routeArr.length == sourceCoordsArrLength){
	    		// some code
	    	}
	    	else{
	    		evalRoute(sourceCoordsArr[sourceCoordsArrIndex++], targetCoords);
	    		console.log('' + getCurrentTime() + '\t' +sourceCoordsArrIndex+' waitig..');
	    	}
		});
    }

    function evalCoordinates(targetCoords){
 		// some code
 		return sourceCoordsArr;
    }

    function onMapClick (e) {
    	metricArr = [];
	    clearTargetPoint();
	    targetCoords = e.get('coords');
	    targetPoint = new ymaps.Placemark(targetCoords, { iconContent: '' }, { preset: 'islands#blueCircleIcon' });
	    myMap.geoObjects.add(targetPoint);

	    // Generate source coordinates
	    sourceCoordsArr = evalCoordinates(targetCoords);
	    sourceCoordsArrLength = sourceCoordsArr.length;
	    
	    str = '' + sourceCoordsArrLength + ' точек';

	    evalRoute(sourceCoordsArr[sourceCoordsArrIndex++], targetCoords);
	}
}
ymaps.ready(init);

6 комментариев
маршрутизатор,маршрутизация,Ограничения API
Построить пропорционально-бОльший полигон
mgolnev
6 мая 2017, 19:17

Добрый день!

Подскажите как имея полигон  «А» построить полигон «Б» с вершинами +10км от  каждой из вершин полигона «А»

1 комментарий
Задание координат для собственной карты по разрешению исходного изображения
Dimoks
9 мая 2017, 01:49

Создал из исходного изображения разрешением 15000×10000 тайлы для масштабов с 3 до 6, и из них сделал собственную карту по примеру.

Моей целью было разместить начало координат в центре исходного изображения, правому верхнему углу его задать координаты (y, x): (5000, 7500), нижнему левому координаты (-5000, -7500). Протяжённость координат равна сторонам исходного изображения.

С помощью подсказки поддержки про использование размера мира на максимальном масштабе получилось задуманное через декартову систему координат:

/* до функции создания карты поместил вычисление размера мира для максимального масштаба*/

var MAX_ZOOM = 6;

var worldSize = Math.pow(2, MAX_ZOOM) * 256;

/* в функции же создания карты разместил проекцию так:*/

projection: new ymaps.projection.Cartesian([[5000-worldSize, -7500], [5000, worldSize-7500]], [false, false]))

Т. е. для координаты (y) нижнего левого угла исходного изображения из отрицательной желаемой координаты вычел размер мира, а для координаты (x) верхнего правого угла из размера мира вычел желаемую для него.

Для размещения начала координат в левом верхнем углу исходного изображения и совпадения мировых координат с пиксельными задание проекции будет таким:

projection: new ymaps.projection.Cartesian([[worldSize, 0], [0, worldSize]], [false, false])

А если есть желание сделать отрицательное значение (y) для нижнего края, то так:

projection: new ymaps.projection.Cartesian([[-worldSize, 0], [0, worldSize]], [false, false])

Собственно для совпадения мировых координат с размерами исходного изображения требуется лишь указание размера мира для максимального масштаба в качестве одной из координат: для нижней левой — y, для верхней правой — x. Оказывается довольно просто.

3 комментария
Яндекс.карты API,Декартова система координат
multiRoute добавить WayPoints
Женя Кренёв
9 мая 2017, 23:41

Добрый день, вопрос такой:

у меня есть маршрут

var multiRoute_1 = new ymaps.multiRouter.MultiRoute({
        // Описание опорных точек мультимаршрута.
        referencePoints: [
            "Москва","Тула"
        ],
        params: {
            results: 1
        }
});

myMap.geoObjects.add(multiRoute_1);

к этому маршруту, должна быть возможность, добавить или удалить статические точки, например хотим добавить к маршруту, Орел и Калугу.

Как это реализовать? Через удаление и новое добавление? Или есть возможность редактирвоания этого маршрута на карте?

И еще одно но, нужно получать километраж при удалении или добавлении.

Что то типа:

multiRoute_1.model.events.add("requestsuccess", function (event) {

console.log(multiRoute_1.getRoutes().get(0).properties.get("distance").value);

});

Какие есть варианты?

5 комментариев
multiRoute
Большое количество маркеров и кластеризатор: исчезают метки при зуме. Баг?
Роман
10 мая 2017, 07:54

Уже 5 часов не могу понять в чем проблема.

http://jsfiddle.net/rom4i/krnxxw5f/

На карте примерно 10тыс. меток с включенным кластеризатором. Казалось бы работает всё хорошо, однако я заметил, что иногда почему-то при зуме изсчезают метки. Просто пропадают. На картинке, которую я сделал (http://i.imgur.com/16jhNXX.jpg), это хорошо продемонстрировано.

Если отключить кластеризацию, метки пропадать перестают. Но, как вы понимаете, когда 10 тысяч меток на карте это делать нельзя.

7 комментариев
SearchControl ограничить вывод результатов
Удалённый пользователь
10 мая 2017, 12:33

Добрый день!

Помогите пожалуйста разобраться.

Суть задачи, ограничить вывод результатов определенным радиусом от заданной точки.

Но даже в примере тут https://tech.yandex.ru/maps/jsbox/2.1/search_control_ppo

если дописать в опции

strictBounds: true,
 boundedBy: myMap.getBounds(),
useMapBounds: true

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

возможно ли это? и как?

Заранее спасибо!

3 комментария
Есть код, который выводит на карту объект по адресу из переменной. Как можно вывести множество таких объектов?
Юлия
10 мая 2017, 12:36

Необходимо вывести множество объектов на одной карте, с использованием геокодера, который преобразует адрес в координаты. Ниже код для одного объекта, а вот как адаптировать его под вариант с множеством, пока не понимаю.. Может быть кто-то владеет информацией, буду очень признательна за подсказку!

ymaps.ready(init);
function init(){
    var geocoder = new ymaps.geocode(
          // Строка с адресом, который нужно геокодировать
          'ПЕРЕМЕННАЯ АДРЕСА',
          // требуемое количество результатов
          { results: 1 }
    );
    // После того, как поиск вернул результат, вызывается callback-функция
    geocoder.then(
          function (res) {
                // координаты объекта
                var coord = res.geoObjects.get(0).geometry.getCoordinates();
                var map = new ymaps.Map('yandex_map', {
                        // Центр карты - координаты первого элемента
                        center: coord,
                         // Коэффициент масштабирования
                        zoom: 10,
                        // включаем масштабирование карты колесом
                         behaviors: ['default', 'scrollZoom'],
                         controls: ['mapTools']
                 });
                 var myPlacemark = new ymaps.Placemark(
                         coord, {
                                 balloonContent: 'ПЕРЕМЕННАЯ СОДЕРЖИМОГО БАЛУНА'
                          }
                 );
                // Добавление метки на карту
                map.geoObjects.add(myPlacemark);

                // устанавливаем максимально возможный коэффициент масштабирования - 1
                map.zoomRange.get(coord).then(function(range){
                         map.setCenter(coord, range[1] - 1)
                 });
                 // Добавление стандартного набора кнопок
                         map.controls.add('mapTools')
                 // Добавление кнопки изменения масштаба
                         .add('zoomControl')
                         // Добавление списка типов карты
                         .add('typeSelector');
            }
    );

}

Заранее спасибо!

3 комментария
множество объектов,множественное геокодирование
Изменение позиции элементов управления
Александр Сидельников
10 мая 2017, 12:54

Здравствуйте. Есть блок с картой, подключенной через API Яндекс Карт. На карту добавляю элемент управления GeolocationControl:

var geolocationControl = new ymaps.control.GeolocationControl();
myMap.controls.add(geolocationControl);

Нужно при определённом условии изменить положение элемента. Для этого нужно поменять опции float и position. С первым проблем нет:

geolocationControl.options.set('float','none');

А вот поменять position не получается - при любых попытках переходит в верхний левый угол (видимо, что-то не так пишу). Подскажите, как его правильно прописать?

5 комментариев
Позиционирование,элементы управления
Пользовательский макет балуна для ObjectManager
Игорь Чамин
10 мая 2017, 15:32

Мне нужно сформировать карту следующим образом, метки делятся на две категории (район, медицинское учреждение). Сначало на карту выводятся метки районов. При выборе метки с районом текущие метки удаляются и прорисовываются метки медицинских учреждений относящихся к этому району. Любая метка содержит информацию которую нужно вывести в балун при выборе. Пример того что я уже сделал miac58.ru/maps_lpu Сейчас информацию меток региона я вывожу в хинт, что бы клик по метки использовать как событие для "открытия" региона.  Я хочу сделать везде балун, а событие назначить на ссылку типа "Подробнее" в подвале балуна. Проблема в том что я не увижу объекты из события onclick ссылки. Ознакомившись с документацией, с примерами я вроде понял что мне нужно описать шаблон балуна а там я смогу описать событие клика по ссылке. Правильно? Вот этим примером я пользовался.  У меня не получается(  Помогите.

var myMap;
var his, hisZoom, hisCenter;
var listBoxControl;
ymaps.ready(
function (){
myMap = new ymaps.Map (
	"map",{
		center: [53.19, 44.43],
		zoom: 8, 
		controls: ['zoomControl', 'typeSelector', 'fullscreenControl']
	}
);
var MyBalloonLayout = ymaps.templateLayoutFactory.createClass(
	'<div class="popover top">' +
		'<a class="more" href="#">Подробнее</a>' +
		'<div class="arrow"></div>' +
		'<div class="popover-inner">' +
			'$[[options.contentLayout observeSize minWidth=235 maxWidth=235 maxHeight=350]]' +
		'</div>' +
	'</div>'
	,
	{
	build: function () {
		this.constructor.superclass.build.call(this);
		this._$element = $('.popover', this.getParentElement());
		this.applyElementOffset();
		this._$element.find('.more')
			.on('click', $.proxy(this.onMoreClick, this));
	},
	onSublayoutSizeChange: function () {
		MyBalloonLayout.superclass.onSublayoutSizeChange.apply(this, arguments);

		if(!this._isElement(this._$element)) {
			return;
		}

		this.applyElementOffset();

		this.events.fire('shapechange');
	},
	applyElementOffset: function () {
		this._$element.css({
			left: -(this._$element[0].offsetWidth / 2),
			top: -(this._$element[0].offsetHeight + this._$element.find('.arrow')[0].offsetHeight)
		});
	},
	onMoreClick: function (e) {
				   
		alert('УРА!');
	},
	getShape: function () {
		if(!this._isElement(this._$element)) {
			return MyBalloonLayout.superclass.getShape.call(this);
		}

		var position = this._$element.position();

		return new ymaps.shape.Rectangle(new ymaps.geometry.pixel.Rectangle([
			[position.left, position.top], [
				position.left + this._$element[0].offsetWidth,
				position.top + this._$element[0].offsetHeight + this._$element.find('.arrow')[0].offsetHeight
			]
		]));
	},
	_isElement: function (element) {
		return element && element[0] && element.find('.arrow')[0];
	}
	}
);

var MyBalloonContentLayout = ymaps.templateLayoutFactory.createClass(
	'<h3 class="popover-title">$[properties.balloonContentHeader]</h3>' +
	'<div class="popover-content">$[properties.balloonContentBody]</div>'
);

var objectManager = new ymaps.ObjectManager({geoObjectBalloonLayout: MyBalloonLayout, geoObjectBalloonContentLayout:  MyBalloonContentLayout});
$.ajax({
	url: "/maps_lpu/json"
}).done(function(data) {
	objectManager.add(data);
});
myMap.geoObjects.add(objectManager);
button = new ymaps.control.Button({
	data : {
		content : 'Назад',
		title : 'Назад'
	},
	options : {
		visible: false
	}
});				
button.events.add('click', function () {
	button.options.set('visible', false);
	myMap.setCenter(hisCenter, hisZoom); 
	objectManager.objects.removeAll();
	objectManager.add(his);
	myMap.geoObjects.add(objectManager);
});
	
myMap.controls.add(button, {float:'left'})




var myListBoxItems = [];

//здесь вырезано заполнение списка (php)

    var listBoxItems =  myListBoxItems.map(function(title) {
            return new ymaps.control.ListBoxItem({
                data: {
                    content: title
                },
                state: {
                    selected: true
                }
            })
        }),
        // Теперь создадим список, содержащий 5 пунктов.
        listBoxControl = new ymaps.control.ListBox({
            data: {
                content: 'Фильтр',
                title: 'Фильтр'
            },
            items: listBoxItems,
            state: {
                // Признак, развернут ли список.
                expanded: false,
                filters: listBoxItems.reduce(function(filters, filter) {
                    filters[filter.data.get('content')] = filter.isSelected();
                    return filters;
                }, {})
            }
        });
    myMap.controls.add(listBoxControl);
	
    // Добавим отслеживание изменения признака, выбран ли пункт списка.
    listBoxControl.events.add(['select', 'deselect'], function(e) {
        var listBoxItem = e.get('target');
        var filters = ymaps.util.extend({}, listBoxControl.state.get('filters'));
        filters[listBoxItem.data.get('content')] = listBoxItem.isSelected();
        listBoxControl.state.set('filters', filters);
    });

    var filterMonitor = new ymaps.Monitor(listBoxControl.state);
    filterMonitor.add('filters', function(filters) {
        // Применим фильтр.
        objectManager.setFilter(getFilterFunction(filters));
    });

    function getFilterFunction(categories){
        return function(obj){
            var content = obj.properties.typeTitle;
            return categories[content]
        }
    }




});

8 комментариев
Метка из конструктора
c3b2
10 мая 2017, 18:54

Добрый вечер!

В конструкторе карт есть метка с обозначением бензоколонки. Не подскажите, как называется эта метка (интересует формы и круглая и вопросиком, и разновидности цветов как в конструкторе)? Примеры из документации и песочницы смотрел, они другие.:(

Спасибо!

P.S. В песочнике и глиф иконках бустрапа такую не нашел.

Я так понимаю, что по аналогии из песоницы должно быть что-то типа такого:

preset: 'islands#redGasPumpIcon'. Поправьте меня, пожалуйста, если я ошибаюсь

2 комментария