OpenLayers: popup для кластеров

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

OpenLayers: popup для кластеров

Сообщение J_Mnemonic »

Добрый вечер всем! Создаю нижепреведённым образом маркеры. Кластеризованные. Подскажите пожалуйста, как мне прикрутить popup теперь к ним? Искал примеры, нашёл тут http://openlayers.org/dev/examples/popupMatrix.html, но они как я понимаю он не подходит к моему случаю. Так как сами маркеры там создаются другим способом. (Я совсем совсем новичёк)
Мой кусок кода:

Код: Выделить всё

            // Определяем тип кластеризации маркеров
            var strategies = [];
            // простой тип
            strategies.push(new OpenLayers.Strategy.Cluster());
            // создаём слой маркеров
            var markersLayer = new OpenLayers.Layer.Vector("Markers", { styleMap: stylemap, strategies: strategies});

            // Обрабатываем результат того, что вернул сервис
            if (result && result.length > 0) {
                features = [];
                for (var i = 0; i < result.length; i++) {

                    // определяем координаты и переводим их в нужную нам систему проецирования
                    var longitude = parseFloat(result[i].X);
                    var latitude = parseFloat(result[i].Y);
                    var marker = new OpenLayers.Geometry.Point(longitude, latitude).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
                    var importance = 2; // статус (1-есть связь, 2-отклонение, 3-нет связи)
                    var feature = new OpenLayers.Feature.Vector(marker, { importance: importance, code: result[i].Code, Name: result[i].Name });
                    features.push(feature); // 
                }
                map.addLayer(markersLayer);
                markersLayer.addFeatures(features);
            }
Буду очень признателен, если ещё подскажете как выводить в popup список входящих в него объектов.
J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers: popup для кластеров

Сообщение J_Mnemonic »

Неужели никто не поможет?
Может я глупость какую спросил или не так задал вопрос? Вы скажите, я постараюсь подробнее объяснить проблему...
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers: popup для кластеров

Сообщение Denis Rykov »

J_Mnemonic писал(а):Неужели никто не поможет?
А почему вы так удивляетесь? Во-первых, это форум и тут никто никому ничего не должен, а во-вторых, сколько времени прошло с момента вашего первого сообщения? Что касается вашего вопроса: базовый пример, показывающий работу с попапами для векторного слоя тут, кластер - это обыкновенная фича, у которой есть свойство cluster. Пример работы с этим свойством здесь. Таким образом, вам необходимо на основе данных свойства cluster сформировать нужный текст и вывести его в попап, ничего сложного.
Spatial is now, more than ever, just another column- The Geometry Column.
J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers: popup для кластеров

Сообщение J_Mnemonic »

Денис, знаю что никто никому ничего не должен, просто очень хотелось верить что кто, всё же вроде Вас, согласится помочь. :) Спасибо большое за это! Кстати вчера пока ждал ответа, вроде разобрался с кластерами, но вот с попапом спасибо - щас буду копать\применять )
J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers: popup для кластеров

Сообщение J_Mnemonic »

вот токо теперь странная штука. после того как кликаю на объект, перестаёт работать зум...
ощущение такое что фокус где то остался...
не сталкивались с таким?

Код: Выделить всё

            selectControl = new OpenLayers.Control.SelectFeature(markersLayer,
                { onSelect: showInformation, onUnselect: onFeatureUnselect });

            map.addControl(selectControl);
            selectControl.activate();
        }

        function onPopupClose(evt) {
            selectControl.unselect(selectedFeature);
        }

        function onFeatureUnselect(feature) {
            map.removePopup(feature.popup);
            feature.popup.destroy();
            feature.popup = null;
        }

        function showInformation(feature) {
            selectedFeature = feature;
            popup = new OpenLayers.Popup.FramedCloud("chicken",
                                     feature.geometry.getBounds().getCenterLonLat(),
                                     null,
                                     "",
                                     null, true, onPopupClose);
            var popupText = "<Label>";
            if (feature.cluster) {
                for (var i = 0; i < feature.cluster.length; i++) {
                    popupText = popupText + feature.cluster[i].attributes.importance + "-<a href=''>" + feature.cluster[i].attributes.Name + "</a><br>";
                }
                popupText = popupText + "</Label>"
            }

            popup.contentHTML = popupText;
            popup.autosize = true;
            popup.closeOnMove = true;
            feature.popup = popup;
            map.addPopup(popup);
        }
J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers: popup для кластеров

Сообщение J_Mnemonic »

всё. разобрался.
дело было в popup.closeOnMove = true;
убрал его и заработало.
J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers: popup для кластеров

Сообщение J_Mnemonic »

А можно всё таки продолжить тему?
Странное дело. Сделал всё как в примере:
Denis Rykov писал(а): Что касается вашего вопроса: базовый пример, показывающий работу с попапами для векторного слоя тут
всё работает, но если при открытом попапе сделать зум, этот попап уже невозможно закрыть (хотя в примере работает). Причём судя по отладке onPopupClose вызывается при этом. Если открывать после зума попапы, то они успешно открываются\закрываются. проблема именно с теми, которые открыты были во время зума.

Код: Выделить всё

        function onFeatureSelect(feature) {
            selectedFeature = feature;
            var popupText = "<div style='font-size:.8em'><Label></Label></div>"
            
            popup = new OpenLayers.Popup.FramedCloud("chicken",
                                     feature.geometry.getBounds().getCenterLonLat(),
                                     null,
                                     "",
                                     null, true, onPopupClose);
            popup.contentHTML = popupText;
            selectedFeature.popup = popup;
            map.addPopup(popup);
        }

        function onFeatureUnselect(feature) {
            map.removePopup(feature.popup);
            feature.popup.destroy();
            feature.popup = null;
            selectedFeature = undefined;
        }

        function onPopupClose(evt) {
            test1.value = selectedFeature;
            selectControl.unselect(selectedFeature);
            selectedFeature = undefined;
        }
Отличие от примера пожалуй лишь в том, что у меня кластеризация...
J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers: popup для кластеров

Сообщение J_Mnemonic »

да, дело действительно в кластеризации... убрал её и всё заработало... но теперь надо значит делать костыль?
Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя