Клуб API Карт

Края карты как в API 1.x

Евгений Белоусов
13 августа 2012, 15:12

Доброго времени суток.

 

Мне необходимо показывать метку на краю карты если ее расположение не в писывается в видимую убласть карты. в API 1.x для расчета края я использовал методы getLeft, getRight, getTop и getBottom.

Как это можно реализовать на API 2.x?

 

Спасибо за внимание.

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

область в АПИ 2.0 представляет собой обычный массив с двумя индексами (точками - левой нижней и правой верхней)

[ [lb_lat, lb_lng], [rt_lat, rt_lng] ]

Евгений Белоусов
13 августа 2012, 17:17

в том-то и дело, что 2 точки, а не 4.

Из-за этого, так же, образовалась проблема при определении вхождения точки в видимую область карты: Создаю прямоугольник, передавая ему map.getBounds(). но ни в объекте прямоугольника, ни в его геометрии нет метода contains

из 2-х легко получить 4-ре

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

Евгений Белоусов
13 августа 2012, 17:48

как получить 4?

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

var rect = new ymaps.geometry.Rectangle(this.getMap().getBounds());rect.setMap(this.getMap());console.log(rect.geometry); // undefined

 

    getBoundsRect : function (bounds) {        if(!bounds) {            return;        }        var lowerCorner = bounds[0],            upperCorner = bounds[1],            rectangle = new ymaps.Polygon([[                lowerCorner,                [lowerCorner[0], upperCorner[1]],                upperCorner,                [upperCorner[0], lowerCorner[1]]            ]]);        return rectangle;    }

 

Евгений Белоусов
13 августа 2012, 18:06

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

В прямоугольник добавим contains. Пока используйте http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/geometry.Polygon.xml

там contains есть.

Евгений Белоусов
13 августа 2012, 18:22

не работает.

ошибка: 

Cannot call method 'toGlobalPixels' of undefined; combine.xml:32944
this.options.get("projection").toGlobalPixels(position, this._map.getZoom()),

Код:

var poly = getBoundsRect(this.getMap().getBounds());poly.geometry.setMap(this.getMap());if(poly.geometry.contains(point)) { ... }

А так работает (но не подходит, т.к. виден на карте):

var poly = getBoundsRect(this.getMap().getBounds());this.getMap().geoObjects.add(poly);if(poly.geometry.contains(point)) { ... }
Евгений Белоусов
13 августа 2012, 18:34

пришлось прибегнуть к извращениям

var poly = getBoundsRect(this.getMap().getBounds());poly.geometry.setMap(this.getMap());
poly.geometry.options.set({'projection': ymaps.projection.wgs84Mercator});
if(poly.geometry.contains(point)) { ... }

Правильнее будет так:

 

poly.geometry.options.setParent(map.options);

И если вам не нужен геообъект полигона, то можете создавать геометрию напрямую.

Напиши, пожалуйста, пример правильного создания геометрии без геообъекта, в нее тоже map.options нужно передавать?

Вот так для гео геометрий. Т.е. геометрий которые работают в контексте конкретной карты (ее опций по умолчанию и ее системы координат).

var geom = new ymaps.geometry.Polygon([[[1, 2], [3, 4], [5, 6]]]);
geom.setMap(myMap);
geom.options.setParent(myMap.options);
console.log(geom.getBounds());

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

var geom = new ymaps.geometry.base.Polygon([[[1, 2], [3, 4], [5, 6]]]);
console.log(geom.getBounds());

 

Евгений Белоусов
14 августа 2012, 11:22

 а планируется ли добавить события типа drag?

Евгений Белоусов
14 августа 2012, 11:23

отбой, нашел actiontick :)

 

geom.setMap(myMap);
geom.options.setParent(myMap.options);

Геометрия не может сама брать опции из карты?

вторая строчка выглядит лишней

Нет не может. В случае использования геообъектом, она берет опции из него. Опции с картой в общем случае не связаны. Можно их не свзывать с опциями карты по setParent, а просто определить все значения через geom.options.set