Клуб API Карт

Оверлей-изнанка регионов. TypeError: child.getParent is not a function(…)

aga@itgro.ru
22 апреля 2016, 09:37
coordinates = [];
            map.geoObjects.each(function(collection) {
                return collection.each(function(region) {
                    coordinates.push.apply(coordinates, region.geometry.getCoordinates());
                  }
                });
            });
            center = map.getGlobalPixelCenter();
            size = map.container.getSize();
            d = 512;

            coordinates.push([[center[0] - size[0] - d, center[1] - size[1] - d], [center[0] + size[0] + d, center[1] - size[1] - d], [center[0] + size[0] + d, center[1] + size[1] + d], [center[0] - size[0] - d, center[1] + size[1] + d], [center[0] - size[0] - d, center[1] - size[1] - d]]);

            try {

                overlay = new ymaps.geometry.pixel.Polygon(coordinates,'evenOdd',{},{
                    fillColor: '#6699ff'
                });

            } catch (_error) {
                e = _error;
                console.log(e); //TypeError: child.getParent is not a function(…)

            }

            try {
                map.geoObjects.add(overlay);
            } catch (_error) {
                e = _error;
                console.log(e);
            }

            console.log(overlay); //PixelPolygonGeometry {_coordinates: Array[402], _fillRule: "evenOdd", _convex: undefined, _metaData: Object, _bounds: null}_bounds: null_convex: undefined_coordinates: Array[402]_fillRule: "evenOdd"_metaData: Object__proto__: Object


            return map.geoObjects.each(function(object) {
                return console.log(object); //GeoObjectCollection (регионы)
            });

Пытаюсь закрасить всю карту кроме регионов, как в этом примере: http://dimik.github.io/ymaps/examples/regions/ 
Массив координат строится как надо, но при попытке создать новый Polygon по координатам ловится ошибка TypeError: child.getParent is not a function(…)

8 комментариев
Подписаться на комментарии к посту
А где именно в примере пиксельная геометрия добавляется на карту?
dimik,

try {
map.geoObjects.add(overlay);
} catch (_error) {
e = _error;
console.log(e);
}

Или вопрос про регионы?
aga@itgro.ru,
Да, вы тут добавляете пиксельную геометрию, коллекцию геообъектов. Пиксельная геометрия это не геообъект
dimik,
Теперь такой код:

overlayPolygon = new ymaps.geometry.pixel.Polygon(coordinates, 'evenOdd', {}, {
fillColor: '#6699ff'
});
overlayObject = new ymaps.GeoObject(overlayPolygon, {}, {});
map.geoObjects.add(overlayObject);
return map.geoObjects.each(function(object) {

return console.log(object); //GeoObjectCollection {geometry: null, properties: DataManager, state: DataManager, options: Object, events: EventManager…}
 GeoObject {geometry: null, properties: DataManager, state: DataManager, options: Object, events: EventManager…}
});

Как видно, объект добавляется на карту, но визуальных изменений никаких нет. 
aga@itgro.ru,
Если вы используете последнюю версию АПИ, надо взять пример для 2.1


Этот пример – мой скромный вклад в решение задачи маскирования областей на карте. Изучать, где именно вы ошиблись при его копировании, или разбираться в ваших измененных версиях я не готов.
dimik,
Я попытался вычленить из вашего примера только небольшую нужную часть - закрашивание областей, без остального функционала. Это укладывается в 3 функции - берем координаты имеющихся полигонов, что-то с ними делаем (насчет примера: что такое d=512?), и строим новый полигон из этих координат. С первым и третьим я вроде бы и разобрался, но посередине для меня творится какая-то магия, с которой мне не разобраться без вашей помощи - MaskOverlay._createGeometry. Думаю, ошибка в моем коде где-то там, потому что остальное кое-как описано в документации к API
aga@itgro.ru,
Все, что нужно для построения маски находится в 2-х модулях (файлах) На каждый метод написана JSDoc-документация. Все методы взяты из документации. Ничего "вычленять" из них не надо. "d" это константа размером в 2 тайла – маска должна быть больше размера контейнера карты, чтобы при сдвиге слоя пользователем, хватило времени ей перерисоваться.
dimik,
Спасибо, так понятнее