Клуб API Карт

geometry.pixel.Point

nolan23
23 апреля 2012, 10:09

ошибка в строке

new ymaps.geometry.pixel.Point(position, {})

 

объект pixel - undefined.

в чем проблема?

20 комментариев
Подписаться на комментарии к посту

А зачем он вам нужен?

Вы всегда можете запросить модуль напрямую ymaps.load или параметр load в подключении скрипта.

Модуль так и называется geometry.pixel.Point

привет, это я)))

решил тебя больше по мылу не дергать)))

 

вот 

var placemark = new ymaps.geoObject.overlayFactory.interactiveGraphics.createOverlay(

new ymaps.geometry.pixel.Point(position, {}),

{},

this.icons[iconId] );

на самом деле как-то удручает, что показать 1000 объектов без кластеризации - это проблема. Я уж как ни пробовал - время первого формаитрования карты какое-то чудовищное (меньше 10 !!! секунд пока не получалось. и это на более менее сносном компе). Да, я понимаю, что потом оно будет летать, но юзер этого просто не поймет - он уйдет со страницы не дождавшись.

кстати, в описании пакетов нет geometry.pixel

Мы работаем над этим :)

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

сделал вот так

var placemark = new ymaps.Placemark(

points[i][lat], points[i][lng]], { },

{

overlayFactory: ymaps.geoObject.overlayFactory.interactiveGraphics,

iconImageHref: theIcon.src,

iconImageSize:[theIcon.size.width, theIcon.size.height],

iconImageOffset: [theIcon.anchor.x, theIcon.anchor.y]

}); 

 

1600 точек -10794мс o_O


ты что-то не то делаешь.

for (var i = 0; i < 1600; ++i) {
            var geoObject = new ymaps.GeoObject({
                geometry: {
                    type: 'Point',
                    coordinates: [Math.random() * 100 - 50, Math.random() * 100 - 50]
                }
            }, {
                preset: 'twirl#blueIcon',
                overlayFactory: ymaps.geoObject.overlayFactory.staticGraphics
            });
            geoMap.geoObjects.add(geoObject);

        }

Полные геобьекты 3 секунды

 

var img=ymaps.option.presetStorage.get("twirl#darkorangeIcon").iconImageHref;
        for (var i = 0; i < 1600; ++i) {

            var geo = new ymaps.geometry.pixel.Point([Math.random() * 1000, Math.random() * 1000]);
            var over = ymaps.geoObject.overlayFactory.interactiveGraphics.createOverlay(geo, {}, {
                imageHref: img,
                imageOffset: [-10, -40],
                imageSize: [37, 42],
                contentOffset: [6, 6],
                contentSize: [16, 16]
            });
            over.setMap(geoMap);
        }

Полные оверлеи - 1.6сек

Если interactiveGraphics заменить на staticGraphics будет 0.5 сек.

 

припиши плиз, как ты грузишь модуль geometry.pixel.Point

я замучался

 - не работает.

 

ymaps.load('geometry.pixel.Point');

 

Uncaught TypeError: Object [object Object] has no method 'get'

c.util.augment.createOverlaycombine.xml:1

 

Покажи страницу

var placemark = new ymaps.geoObject.overlayFactory.interactiveGraphics.createOverlay(


new - тут лишний. Это фабрика.

Плюс из this.icons[iconId] надо оторвать префикс icon. Просто imageHref и так далее.

api-maps.yandex.ru/2.0.7/release/combine.xml?modules=fpfDisiFfygVfAfqhTm2ovm9m6ncm1g6g0lKlJhJj7j6kaksfZn7n6mgmhlVltkbkhnMktkug3lUnYnWklkgf1fQf5i5f4fYf6fTmBmFmCfWfSf3fPgBg4nKnRnOfwhthrholDhsn4n0n5nZn3n1iqgigxgamsiiiEfCoomjeejrgWoAj1nqjZj0gUgpjRjQjSgjoEm5ofodpepfpupipqoXpphGgOozoDnam7ndoqoUoVfUnSkAlXlYgRgZgNinkpkoknkrkqh8ogiofrhxjljkidn9gQgwjphwlGghgliwfEgygLlHlFnJj8ntnHnDnrnGnCj4j3nvnInEh2h5fXf0i3gblAfzlyh1h0h4fvmcgSmfmemdgtpnpmpoh3hZftlMjhjilalolho3o5kekkgPkmkZk3k6k5k4gYg1ivhBlrlnnXjjiOjCjqmqmnf2lLgufRiWgAmDnomigoihgEjIirigg9gDiklskxj9nLlwkzkfnQlvkykdkjnPlukwkckinNkPkLkOkMkNk7kVkQkUkTkRfNgnjDlBfulWlzlxizixgqiylqlmlEhqn2jwokmpd6h9npgcm3oKoHoGoIoJoCoBosorotoeocoWpwpvpzpApMpNpLpBpCpDpEpWpPpOpQpVphpgg7oFnboRpcpbpdoSoTm8oyoplOl0lZhdhbhchVhUl3ijitiuf7jTjUjVjWjMjOjKjYjPjXjLhDhFicmlgXg5mkgmfxgMgHiphylIhzhvhapso6jEoYnAnynso2nznFo1o0nunBgKmLf8jJhnkWiahXl7l6magTjnpypFpHhHhAhMhCfVlPfBl2lShNl1hEjglQjujaf9oagklfhmk8k0k1k2nVhImrmmmomWmYgFlNnndYhfjckEjHgdk9o4jxleldjvlclpnTfFfIfGkSfLfOfKfMhOhuhSmTmVm4gJh6hYpkcRmPmOdHcFc2cvdybabhbIpXc1plpxa1brbZcVccoQouiZmKi6i2i7iVi4iTjGnhg8obibl8l4gIgGnmimjNfsg2kvgsgeggpao9n8j2nxoZj5jmkFmbl9pTpRpSpUpJhkiYjAjsjfjehhkHmUmQkYiQhehgjbkKlgljlllklbfJiMfHlClRhpifmRiXdsmNbjbvdGdXdcbJc9dJbRdQdkdjbncBcTbDpYbKc6cLcKh7i1cXdWdFcmbycpcHbfcwiUojhPomjBkXmMprnwhlhjhinUmZkBmyiIa2dgbcc8caa9ckdPddcSbBcAcYdTbEbNc0cJbscQdtctdwdfbOcqbddvdqbFdRbobpdlmIi0czmzgzgfiDmGiLmviPcWcUdNb6bwcnducDb2bmcybSdobUcCdLjoiHbWdMdpcxbicsdbb8dzdBb5iNiGm0mXjt:1Uncaught TypeError: Object [object Object] has no method 'getParent'

допиши &mode=debug в подключение скрипта - станет понятнее.

А вообще ты создаешь оверлей и добавляешь его в геообьекты (this.points.add(placemark);)

Не правильно - это оверлей. Ему надо просто дать карту - placemark.setMap(this.map)

Оверлею нужно говорить setMap(map), вы его добавляете в коллекцию геообъектов.
И включите пока mode=debug при подключении API - легче будет отлаживаться.

задал. добавил.

не показывает. ((

в createIcon - менял 

style =  {

                imageHref:  ymaps.option.presetStorage.get("twirl#darkorangeIcon").iconImageHref;,

                imageOffset: [-10, -40],

                imageSize: [37, 42],

                contentOffset: [6, 6],

                contentSize: [16, 16]

            };

не показывает.

у тебя входящие координаты(points[i][this.model.schema.lat]) - строки.

Это фатально.

 

Не показывает потому, что вы оверлею скармливаете пиксельную геометрию у которой в координатах записаны широта и долгота.
А там должны быть глобальные пиксельные координтаты на текущем масштабе.
Получить их можно прогнав геокоординаты через проекцию.
Или можно создать geometry.Point, выставить ей карту через setMap, задать опции, а затем взять у нее через метод
getPixelGeometry пиксельную геометрию, соответствующую геокоординатам и состоянию карты.
Геометрия еще кидает "pixelgeometrychange" при смене масштаба карты. По нему нужно обновлять у оверлеев пиксельные
координаты задавая им новую пиксельную геометрию, которую также получаем через getPixelGeometry или из самого события
event.get("newPixelGeometry").

пиксельная геометрия у меня считается при загрузке точек.

на нужный зум просто умножаю на pow(2, zoom) (с кэшированием).

точки отобразились. но это занимает 5 секунд.

for(var i=0; i < points.length; i++)

{

var iconId = points[i][this.model.schema.icon],

position =  [ parseFloat(points[i][this.model.schema.lat]), parseFloat(points[i][this.model.schema.lng]) ],

wcoord = new ymaps.geometry.pixel.Point([points[i].wcoord.x * this.model.pow2(zoom), points[i].wcoord.y * this.model.pow2(zoom)]);

if (typeof this.icons[iconId] == 'undefined') this.createIcon(iconId);

var placemark = new ymaps.overlay.interactiveGraphics.Placemark( 

wcoord,

{},

this.icons[iconId] );

this.points.push(placemark);

placemark.setMap(this.model.map);

};

http://maps.1cs.su/index.html?mapMode=1&tileMode=1

 

У меня явно побыстрее. Возможно просто быстрее машина. Над производительностью мы еще обязательно поработаем. Увы не успели уделить должное внимание этой теме.

на самом деле все на так плохо)))

если поставить staticGraphics , отключить debug, вырубить firebug, грузить package.standard - то получается 1,5 секунды.

многовато, нго уже приемлемо