Клуб API Карт

geometry.LineString._renderingStageBasePixels: неизвестное значение опции coordRendering

Пост в архиве.

При использовании geoQuery таким образом:

 

myMap.events.add('boundschange', function(e) {

visible = ymaps.geoQuery(e.getMap().geoObjects).searchIntersect(e.getMap());

});

 

В результате получаю следующую ошибку:

 

geometry.LineString._renderingStageBasePixels: неизвестное значение опции coordRendering

 

 

Для воспроизведения ошибки вот тестовый скрипт:

https://www.dropbox.com/s/ghoz0leiz8af0ee/ymap.html

 

Добавьте 100 точек, и подвигайте\удаляйте\приблизте карту.

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

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

var rectangle = new ymaps.Rectangle(e.getMap().getBounds(), {}, {visible: false});

e.getMap().geoObjects.add(rectangle);

var visible = ymaps.geoQuery(e.getMap().geoObjects).searchIntersect(rectangle);

e.getMap().geoObjects.remove(rectangle);

Помогло, но частично. Переодически, всеже, появляется эта ошибка.

Вот скрипт с тестовым эвентом.

https://www.dropbox.com/s/ghoz0leiz8af0ee/ymap.html

 

Добавьте 700 точек(ошибка появляется и со 100 точками, но не так быстро как с 700).

Решил определять нахождение точки на экране таким образом:

var visible = new ymaps.GeoObjectCollection();

var curBounds = e.getMap().getBounds();

 

e.getMap().geoObjects.each(function(point) {

if (point.geometry.getCenter()[0] > curBounds[0][0] && 

point.geometry.getCenter()[0] < curBounds[1][0] &&

point.geometry.getCenter()[1] > curBounds[0][1] && 

point.geometry.getCenter()[1] < curBounds[1][1])

{

visible.add(point);

}

});

 

Это корректный вариант(я понимаю что проверяется именно центр геообъекта, т.е. если он большой, например большая окружность, то пока центр не будет на экране то условие не сработает, но это меня устраивает)? И существует ли функция которая это делает? Что-то типа inBounds(coords, bound), которая проверяет вхождение координат в заданную область?

 

И дополнительно обнаружил, что при добавлении геообъекта с карты в коллекцию не на карте, то она удаляется с коллекции карты. Т.е. геобъект может принадлежать одной коллекции единовременно? И правильно ли так делать, или правильнее удалить геообъект с карты, а потом добавить в нужную коллекцию?

e.getMap().geoObjects.remove(point);

visible.add(point);

По поводу коллекций - да, элемент может принадлежать только одной коллекции. Откреплять объект от предыдущей коллекции специально не надо - это и так будет сделано автоматически при добавлении элемента в новую коллекцию.

Вариант корректный только если у вас не очень большие масштабы и если вы не оперируете значениями около нулевого мередиана. Правильнее тут использовать глобальные пиксельные координаты для расчета попаданий.

Так у вас в скрипте все равно ищется пересечение с объектом e.getMap().

visible = ymaps.geoQuery(e.getMap().geoObjects).searchIntersect(e.getMap()).remove(tmp_rectangle);

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

visible = ymaps.geoQuery(e.getMap().geoObjects).searchIntersect(tmp_rectangle));

 

Благодарен! Прошу прощение за мою невнимательность.

PS 

В моей задаче вот таких кружков около 7 тыс по всей России и карта начинает кушать много памяти и тормозить(особенно на IE) и размер и цвет кружка нужно пересчитывать каждый раз, т.к. эти велечины зависят от того какие точки на экране.

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


Какой из вариант поиска геообъектов видимых на текущей карте самый быстрый? geoQuery или через глобальные пиксельные координаты?

И есть ли смысл удалять с карты не видимые на данный момент геообъекты в другую коллекцию? 

Через глобальные пиксельные координаты должно быть чуть быстрее.

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

Удалять невидимые геообъекты есть смысл. Необязательно при этом их перекладывать в другую коллекцию.