Клуб API Карт

июль 2016
objectManager.objects.overlays.getLength() после обработки setFilter()
xsmilefacex
1 июля 2016, 12:23

Добрый день.

Собственно вопрос "Как узнать количество элементов после применения setFilter()"?

Сделал пример: https://jsfiddle.net/833xrh9t/4/

Вроде должны были посчитать оверлеи, но вот беда, функция то асинхронная на сколько я понимаю (я про setFilter()), поэтому отображается старое количество элементов.


Во всяком случае код:

 

objectManager.setFilter(sFilters);

console.log(objectManager.objects.overlays.getLength() + ' from ' + objectManager.objects.getLength());



у меня показывает старые значения (т.е. setFilter() еще не отработал?).


А setFilter().then(function...) у меня выдаёт ошибку (objectManager.setFilter(...).then is not a function).
Может нужен Promise?

3 комментария
ObjectManager
по клику на внешнюю ссылку открывает не верный балун
veremeev.al
1 июля 2016, 12:36

Есть карта с метками и балунами(api 2.1), и есть список адресов вне карты. по клику на этот список нужно открывать балун, и центрировать карту, все вроде сделал, но по клику почему-то не всегда открывает нужный балун, что не так?

// По клику на адрес, открывает балун и центрирует карту
     $('.filter-result').on('click', '.filter-result__item', function(){
            $(".filter-result__item").removeClass('filter-result__item_active');
            $(this).addClass('filter-result__item_active');
            var pos = $(this).find('.shop-address').text();
            var indexObj = $(this).index();
            //номер метки
            var point = myMap.geoObjects.get(indexObj);
            //координаты метки
            var npoint = $.map(point.geometry.getCoordinates(), Number);
            //центрирование карта
            myMap.setCenter(npoint, 13, {checkZoomRange: true,
                }).then(function () {
                  //открыть балун
                  point.balloon.open();
                }, function (err) {
                }, this);
        });

6 комментариев
Всем доброго дня! Мне нужно определить, входит ли данная точка к прорисованному маршруту.
abilkaiyr.doszhanov
2 июля 2016, 10:30

Например есть маршрут на карте, от точки А до точки В, как узнать попадает ли некая точка С в маршрут между этими двумя, т.е А и В.

1 комментарий
Маршрут и точка
Возможно ли задать zIndex для иконки кластера?
a.shcherbakov@instella.com
3 июля 2016, 13:22

Пытаюсь добавить на карту два типа иконок - зеленые и серые. Добавляю с помощью двух ymaps.ObjectManager. Одному задаю один preset, другому - другой. У обоих включена кластеризация.

И хочу, чтобы зеленые точки всега были выше по zIndex чем серые. Для точек все хорошо - задал geoObjectZIndex. Но иконки кластеров выводятся как хотят. В документации не нашел способа указания zIndex для иконок кластера.

Собственно вопрос.

Есть ли возможность указать zIndex для иконок кластера? Если нет - пранируется ли добавление такое возможности?

Заранее списибо за ответы.

7 комментариев
Удалить маршрут с карты
Talanov.kz
4 июля 2016, 12:45

Подскажите как удалить маршрут с карты, по ссылке ниже пытаюсь сдлеать.

Маршрут стирается но если повторно кликнуть на карту то видно что маршрут просто скрыт.

https://jsfiddle.net/h8sygm1j/28/

1 комментарий
Видео со "Стачки" 2016 и Map Solutions
ymapsapi
4 июля 2016, 13:01

23 апреля в Ульяновске прошла V Международная IT-конференция "Стачка", на которой выступили сразу два разработчика API Яндекс.Карт.

Антон Корзунов рассказал про ренессанс клиентской графики и искусство работы с WebGL. А Всеволод Шмыров дал возможность заглянуть внутрь Конструктора Яндекс.Карт и рассказал про File API и другие полезные кейсы использования web спецификаций.
Если вы не смогли прийти #nastachku лично, предлагаем посмотреть видео выступлений Антона и Всеволода.

Также стало доступно видео с конфернеции Map Solutions, где команду API представлял Кирилл Дмитренко. Рассказ о нашем опыте разработки API Панорам вы можете посмотреть по ссылке.

Нет комментариев
видео,мероприятия,API,webGL,конструктор,панорамы
Проблема с API карты
vosovec777
5 июля 2016, 10:24

После смены версии карт имя текстовому полю теперь не присваивается и соответственно адрес который ввел пользователь в строку поиска адреса не заносятся в базу. Как это исправить? У нас запрос передаётся формой через post и значение принимается сервером php. Без ajax.

<form action="map_save.php" method="POST">  
<div>              
Имя<input id="name" name="name" type="text"/>
</div>
<div> 
Телефон<input id="tel" name="tel" type="text" /> 
</div> 
<div id="map"></div>
<div id="marker" style="float:left;"></div> 
<p class="header" style="float:left;"> Перетащите метку на карту</p>
  <div style="clear: left"></div>
   <input id="latitude" name="x" type="hidden"/><input id="longitude" name="y" type="hidden" />       
 <!--  <input id="latitude" name="x" type="text"/><input id="longitude" name="y" type="text" />      -->
    <br /><br /><br />
 <input type="submit" value="Сохранить и продолжить">   
</form>
	<script>
    
jQuery(function () {
    ymaps.ready(init);
    jQuery("#map input").attr("name", "adress"); 
    
});

function init () {
    var map = new ymaps.Map('map', {
            center: [44.32907842796631, 38.74097519022592],
            zoom: 9
        }, {
            searchControlProvider: 'yandex#search'
        }),
        markerElement = jQuery('#marker'),
        dragger = new ymaps.util.Dragger({
            // Драггер будет автоматически запускаться при нажатии на элемент 'marker'.
            autoStartElement: markerElement[0]
        }),
        // Смещение маркера относительно курсора.
        markerOffset,
        markerPosition;

    dragger.events
        .add('start', onDraggerStart)
        .add('move', onDraggerMove)
        .add('stop', onDraggerEnd);

    function onDraggerStart(event) {   
        var offset = markerElement.offset(),
            position = event.get('position');
        // Сохраняем смещение маркера относительно точки начала драга.	
        markerOffset = [
            position[0] - offset.left,
            position[1] - offset.top
        ];
        markerPosition = [
            position[0] - markerOffset[0],
            position[1] - markerOffset[1]
        ];

        applyMarkerPosition();
    }

    function onDraggerMove(event) {
        applyDelta(event);
    }

    function onDraggerEnd(event) {
        applyDelta(event);
        markerPosition[0] += markerOffset[0];
        markerPosition[1] += markerOffset[1];
        // Переводим координаты страницы в глобальные пиксельные координаты.
        var markerGlobalPosition = map.converter.pageToGlobal(markerPosition),
            // Получаем центр карты в глобальных пиксельных координатах.
            mapGlobalPixelCenter = map.getGlobalPixelCenter(),
            // Получением размер контейнера карты на странице.
            mapContainerSize = map.container.getSize(),
            mapContainerHalfSize = [mapContainerSize[0] / 2, mapContainerSize[1] / 2],
            // Вычисляем границы карты в глобальных пиксельных координатах.
            mapGlobalPixelBounds = [
                [mapGlobalPixelCenter[0] - mapContainerHalfSize[0], mapGlobalPixelCenter[1] - mapContainerHalfSize[1]],
                [mapGlobalPixelCenter[0] + mapContainerHalfSize[0], mapGlobalPixelCenter[1] + mapContainerHalfSize[1]]
            ];
        // Проверяем, что завершение работы драггера произошло в видимой области карты.
        if (containsPoint(mapGlobalPixelBounds, markerGlobalPosition)) {
            // Теперь переводим глобальные пиксельные координаты в геокоординаты с учетом текущего уровня масштабирования карты.
            var geoPosition = map.options.get('projection').fromGlobalPixels(markerGlobalPosition, map.getZoom());
            xy = geoPosition.join(' ');
            xyz = geoPosition.join(' ');
            xy = xy.split(' ') 
            $("#latitude").val(xy[0]);
            $("#longitude").val(xy[1]);
            if ($(".ymaps-2-1-39-input__control").val()=="")
            {
 var myGeocoder = ymaps.geocode(xyz, {kind: 'house'});
        myGeocoder.then(
            function (res) {
                var street = res.geoObjects.get(0);
                var name = street.properties.get('text');
                $(".ymaps-2-1-39-input__control").val(name);
                
                alert (name);
            }
        );

            
            }
        }
    }

    function applyDelta (event) {
        // Поле 'delta' содержит разницу между положениями текущего и предыдущего события драггера.
        var delta = event.get('delta');
        markerPosition[0] += delta[0];
        markerPosition[1] += delta[1];
        applyMarkerPosition();
    }

    function applyMarkerPosition () {
        markerElement.css({
            left: markerPosition[0],
            top: markerPosition[1]
        });
    }

    function containsPoint (bounds, point) {
        return point[0] >= bounds[0][0] && point[0] <= bounds[1][0] &&
               point[1] >= bounds[0][1] && point[1] <= bounds[1][1];
    }
  
}
    
window.onload = function () {
$("input.ymaps-2-1-39-input__control").attr("name", "adress"); 
};

	</script>

Запись в базу:

<?php
function no_injection($str='') {
    $str = stripslashes($str);
    $str = mysql_real_escape_string($str);
    $str = trim($str);
    $str = htmlspecialchars($str);
    return $str;
}
$name=no_injection($_POST['name']);
$tel=no_injection($_POST['tel']);
$address=no_injection($_POST['adress']);
//$adr_razbor = explode(',', $address);
//if (count($adr_razbor)!=6) {
//echo "Неправильно введён адрес";
//exit ();
$x=no_injection($_POST['x']);
$y=no_injection($_POST['y']);
$zapros = mysql_query("insert into `hotels` (`id_user`, `name`, `tel`, `adres`, `x`, `y`)
values ('".$_COOKIE['id']."', '".$name."', '".$tel."', '".$address."', '".$x."', '".$y."')");
echo "<script>location.href = 'objekt.php';</script>";
?>

Как исправить? Голова уже кипит.

1 комментарий
Геокодер отдает неточные данные (не учитывает ll и spn)
andrusova.ksenia
5 июля 2016, 11:42

Добрый день!

Возникла такая проблема: обращаюсь к геокодеру по https, в параметрах запроса указываю приоритетную область поиска, но приходящие в ответ данные этой области никак не соответствуют. Поле поиска кастомное, реализовано через angular ui-select. Запросы к геокодеру идут по мере ввода адреса пользователем, первый запрос уходит после ввода 5 символов.

Например хотим найти Московскую улицу в Санкт-Петербурге, параметры запроса:

format:json
geocode:московск
ll:30.315868, 59.939095
spn:0.5254879999999993, 0.3464700000000036

Результат не радует, хотя ввели уже 8 символов:

Пробовали реализовать тоже самое с помощью ymaps.suggest - выдает более точные результаты, но по непонятной причине с ymaps.suggest плохо работает встроенная в ui-select функция рефреша (с задержкой обновляет результаты в выпадающем списке, с https запросами такой проблемы нет).

Строго ограничить область поиска Петербургом не можем, т.к. область рассчитывается в зависимости от местоположения пользователя.

Вопрос: есть ли возможность обращаться к ymaps.suggest по https как к геокодеру, либо сделать что-то, чтобы геокодер выдавал более релевантные результаты?

Буду очень благодарна за помощь!

5 комментариев
геокодер,suggest
Как изменить метки у объектов помещеных ObjectManager
mik-8ya
6 июля 2016, 09:34

Объекты на карту добавляются с помощью ObjectManager. Как можно изменить метки на свои?

1 комментарий
Connection timed out geocode-maps.yandex.ru/1.x/
m-sg
6 июля 2016, 13:56

С сегодняшнего дня наблюдаем проблему с ответами по геокоду, а именно 50% запросов не получают ответов.

Лимит не исчерпан. С другого IP всё ОК.

+ У вас с часами всё ок? Что-то мне подсказывыает, что они спешат на 3 часа.

Вношу изменения в пост в 14:08, а пишет, что пост изменён в 17:08...

3 комментария
Как правильно разместить на странице две карты?
anatoly-kirsanov
6 июля 2016, 18:47

Получаю ошибку "InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable combine.xml:1:0"

Работаю с JS API версии 2.0. Обе карты создаются в обработчике события ymaps.ready

Первая карта простая, на ней всего три точки (балуны), устанавливается центр и границы. С ней проблем нет.

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

Вторая карта создается после всех манипуляций по первой. Я не знаю как гарантированно вызвать ее создание после окончания всех асинхронных шагов по первой карте. Если только не использовать "промисы" для всех вызовов. Но для geoObjects.add такой возможности нет, а для setBounds я уже безрезультатно использовал callback.

Ошибка возникает после получения полигонов из XML и добавления их на карту, в процессе их перебора в myMap.geoObjects.each и добавления балунов myMap.geoObjects.add. При одной карте на странице проблем с этим кодом не было. Отсюда вопрос насчет двух карт.

В документации я видел пример с двумя картами, но там все намного проще.

Добавлено: От второй карты на проблемной странице я избавился. Но проблема с ошибкой осталась. Причем только в Firefox ESR 45.2.0 на Linux.

Нет комментариев
Получить список городов, через которые проходит маршрут
Владислав Умрихин
6 июля 2016, 20:43

Привет всем добрым форумчанам, думаю мой вопрос полностью понятен из темы, единственное добавлю, что эти города нужно отметить на карте метками+в будущем метки нужны будут не на все города, а только те, которые будут указаны в неком списке, чтобы не получилась избыточность. Интересуют ваши предложения, советы, но самое главное для меня, это разобратся с вычлинением городов.

4 комментария
Доступ через API к карте созданной в конструкторе.
danchdv
6 июля 2016, 22:42

Каким образом через API можно получить доступ к данным карты, которая была создана в конструкторе? API конструктора позволяет только вывести данные в HTML.

Как-то можно получить объект Map из этого? Или каким-то другим образом использовать сконструированную карту в JS API? Если есть ссылка на пример - было бы отлично.

6 комментариев
Разные описания у множества балунов
aclyte
6 июля 2016, 23:52

Всем привет, мне нужно вывести на карту пункты самовывоза.

Я предварительно загоняю в массив landmarks их адреса, описания, названия, цену.

Дальше вывожу их следующим скриптом:

var nearest = {};
    for (i in landmarks) {
        var myGeocoder = ymaps.geocode(landmarks[i]['address']);
        myGeocoder.then(
            function (res) {
                nearest[i] = res.geoObjects.get(0);
                nearest[i].properties.set('balloonContentHeader', landmarks[i]['title']);
                nearest[i].properties.set('balloonContentBody', landmarks[i]['description']);
                nearest[i].properties.set('balloonContentFooter', landmarks[i]['price']);

                nearest[i].options.set('preset', 'twirl#buildingsIcon');
                myMap.geoObjects.add(nearest[i]);
            },
            function (err) {
                alert('Ошибка');
            }
        );
    }

Всё работает здорово - геокодер находит адреса, ставит их на карту и по клику на иконку открывается описание пункта на карте. НО! Почему то у всех точек описания ОДИНАКОВЫ - берётся последнее описание из массива. Т.е. оно как будто бы одно для всех балунов.

Подскажите, пожалуйста, в чём может быть проблема.

Спасибо.

2 комментария
загрузка данных Json
mik-8ya
8 июля 2016, 06:43

Загружаю данные об объектах из файла json, все работает. Вопрос можно в этот файл добавить название объекта, время работы, телефон и т.д.

Попробовал по аналогии с ответом по поиску организаций не получилось.

Если есть возможность полное описание и пример

спасибо

3 комментария
Построение маршрута по своим точкам. Рисование линий по точкам.
quexxx
8 июля 2016, 08:53

Всем приветствие!

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

var myLineString = new ymaps.geometry.LineString([[50.657083, 90.575066]]);
geoObject = new ymaps.GeoObject({ geometry: myLineString });
myMap.geoObjects.add(geoObject);

myMap.geoObjects.events.add('click', function (e) {
    myLineString.insert(myLineString.getLength(), e.get('target').geometry.getCoordinates());
		
		
Тут рассчеты..		

});

И вот все ничего. Но нужно замкнуть маршрут, например по ссылке вне карты, то есть вернуть пользователя в начальную точку от последней куда указал он:

myLineString.insert(myLineString.getLength(), [50.657083, 90.575066]);

Все расчеты работают только в событии при кликах на карте. Как в данном случае можно закрыть маршрут не кликав по карте и добавив отрезок расстояния с последней точки пользователя до начальной конкретно заданной?

16 комментариев
Добавление в Listbox массив ListBoxItem
k.hedsartus
8 июля 2016, 13:53

Не могу в ListBox добавить items

var ListBoxControlName = [];

// Заполняю массив объектами ListBoxItem
for(var i=0; i<u.length; i++) {
    var e = new ymaps.control.ListBoxItem({ data: { content: u[i].name}});
    ListBoxControlName.push(e);
 }

// Создаю листбокс
var myListBox = new ymaps.control.ListBox({
        data: { content: 'Выбрать маршрут' },
        items: ListBoxControlName        
});

// Добавляю на карту
myMap.controls.add(myListBox, {float: 'right'});

Помогите пожалуйста, уже миллион способов перепробовал. Листбокс остается пустым. Массив заполняется данными - это точно.

4 комментария
ListBox,ListBoxItem
Почему иногда масштабирует карту на самое дальное расстояние?
forsomeprojects
8 июля 2016, 17:23

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

Имеем карту с кластерами.

function init() {
    var bigMap = new ymaps.Map('bigMap', {
            center: [55.82, 37.64],
            zoom: 10
        }, {
            searchControlProvider: 'yandex#search'
        }),
        objectManager = new ymaps.ObjectManager({
            clusterize: true,
            gridSize: 32,
        }),
        myPlacemark0 = new ymaps.Placemark([59.924194, 30.350233], {
            hintContent: 'Вы находитесь здесь',
            iconContent: 'Я',
        }, {
            balloonPanelMaxMapArea: 0,
            preset: 'islands#blueStretchyIcon',
            iconCaptionMaxWidth: '70'
        });

    objectManager.objects.options.set({
        preset: 'islands#greenDotIcon',
        //balloonPanelMaxMapArea: 'Infinity'
    });
    objectManager.clusters.options.set('preset', 'islands#greenClusterIcons');
    bigMap.geoObjects.add(objectManager);
    //bigMap.geoObjects.add(myPlacemark0);
    $.ajax({
        url: 'db/data.json',
        error: function() {
            alert('Error on load data!');
        }
    }).done(function(data) {
        objectManager.add(data);
        bigMap.setBounds(bigMap.geoObjects.getBounds()); // <-- Этим методом устанавливаем масштаб
    });
}

ymaps.ready(init);

Иногда карта масштабируется нормально (захватывает все точки), а иногда на самое дельнее расстояние.

В чём может быть проблемма?
Заранее спасибо.

2 комментария
кластеризация,масштаб
Как получить все координаты точек маршрута?
Владислав Умрихин
8 июля 2016, 18:28

Вот между городов например 5000 точек, которые соединяются линиями, как получить все координыты этих точек и вывести анпример через console.log?

14 комментариев
Не работает segment.getCoordinates()
terrabud.com.ua
8 июля 2016, 19:45

Добрый день!

Появилась такая задача: нужно получить массив всех координат сегмента (route.Segment). Для этого есть

segment.getCoordinates();

Она прекрасно работает в случае прокладки обычного автомобильного маршрута, например:

ymaps.route([
            'Москва, Курский вокзал',
            'Москва, Парк Горького',
            'Москва, метро Сходненская'
        ], {
            multiRoute: false,
            routingMode: 'auto',
            mapStateAutoApply: true
        }).done(function (route) {

            myMap.geoObjects.add(route);
            var way, segments;

            for (var i = 0; i < route.getPaths().getLength(); i++) {
                way = route.getPaths().get(i);
                segments = way.getSegments();
                for (var j = 0; j < segments.length; j++) {
                    var coords = segments[j].getCoordinates();
                    console.log('coords', coords);

                }
            }

        }, function (error) {
            alert(error.message);
        });


Но если указать мультимаршрут и тип: транспорт, то работать эта конструкция перестает. При этом, по-идее, должен добавиться перебор маршрутов или выбор первого из списка, см. ниже.

Если попробовать применить .getPaths() прямо к результату .route, то такого метода там не находится. В случае с перечислением маршрутов — просто не работает, ошибок никаких не выдает.

Собственно:

ymaps.route([
            'Москва, Курский вокзал',
            'Москва, Парк Горького',
            'Москва, метро Сходненская'
        ], {
            multiRoute: true,
            routingMode: 'masstransit',
            mapStateAutoApply: true
        }).done(function (myRoute) {
            
            myMap.geoObjects.add(myRoute);
            var way, segments;

            myRoute.getRoutes().each(function (route) {
                //console.log('myroute', myRoute);
                console.log('route', route);
                for (var i = 0; i < route.getPaths().getLength(); i++) {
                    way = route.getPaths().get(i);
                    segments = way.getSegments();
                    for (var j = 0; j < segments.length; j++) {
                        var coords = segments[j].getCoordinates();
                        console.log('coords ' + i + ' and ' + j, coords);

                    }
                }
            });
            
        }, function (error) {
            alert(error.message);
        });

Если убрать перебор forEach() для маршрутов и убрать параметр multiRoute, то перестает работать routingMode: 'masstransit' (по мануалу multiRoute должен быть указан как true).
 

Собственно, есть ли возможности подружить методы route.Segment, такие как .getIndex(), .getCoordinates() и прочие в случае мультимаршрута? Кто сталкивался?

upd: Решено:
 

var route = routes.getRoutes().get(0);
           
            for (var i = 0; i < route.getPaths().getLength(); i++) {
                way = route.getPaths().get(i);
                
                way.properties.getAll().coordinates);
                segments = way.getSegments();
                for (var j = 0; j < segments.getLength(); j++) {
                    console.log('segmenr', segments.get(j).geometry.getCoordinates());
                }
            }

Нет комментариев