Всплывающее окно в открытых слоях слоя WFS

#popup #openlayers #layer

Вопрос:

доброе утро.

Для работы со слоем wfs лучше использовать листовки или открытые слои?

У меня есть код с openlayers, который возвращает WFS с геосервера. Но я не могу показать атрибуты во всплывающем окне. кто-нибудь может мне помочь? Спасибо

Комментарии:

1. Есть ли у вас данные, отображаемые из источника WFS, как в openlayers.org/en/latest/examples/vector-wfs.html и вы хотите нажать на функцию, как в openlayers.org/en/latest/examples/icon.html и отображать атрибуты?

2. Верно. Я могу показать WFS на карте, но я не знаю, как щелкнуть по точке и отобразить значения атрибутов.

3. Такое решение, как codesandbox.io/s/vector-wfs-forked-kh80i будет работать с любым векторным слоем независимо от источника. Чтобы избежать сторонних библиотек, он использует всплывающее окно, определенное CSS, как в openlayers.org/en/latest/examples/popup.html

4. Я не знаю, как получить из слоя WFS функции, которые будут отображаться во всплывающем окне

5. map.forEachFeatureAtPixel() openlayers.org/en/latest/apidoc/… находит векторные объекты там, где вы нажали. Если у вас несколько векторных слоев, вы можете использовать функцию фильтра слоев, чтобы ограничить ее вашим слоем WFS.

Ответ №1:

Вы можете попробовать ol-ext ol/Overlay/PopupFeature для отображения атрибутов объектов во всплывающем окне. См. Пример: https://viglino.github.io/ol-ext/examples/popup/map.popup.feature.html

Комментарии:

1. Я разместил свой код по этой ссылке. Вы не могли бы мне помочь?

2. Здравствуйте, добрый день. Вы можете помочь мне с кодом? Я перешел по указанной вами ссылке. Внутри всплывающего окна отображается «не определено». Я не знаю, что это может быть. Спасибо

Ответ №2:

Следуя примеру https://viglino.github.io/ol-ext/examples/popup/map.popup.feature.html, У меня есть этот код, в котором мой слой WFS содержит атрибуты идентификатора и имени, однако он ничего не показывает во всплывающем окне

     var vectorSource = new ol.source.Vector({
            format: new ol.format.GeoJSON(),
            url: function(extent) {
            return 'http://localhost:8080/geoserver/teste/wfs?service=WFSamp;'  
              version=1.1.0amp;request=GetFeatureamp;typename=teste:MYLAYERamp;'  
              'outputFormat=application/jsonamp;srsname=EPSG:4326amp;'  
              'bbox='   extent.join(',')   ',EPSG:4326';
            },
            strategy: ol.loadingstrategy.bbox
        });
 
 
        var vector = new ol.layer.Vector({
            source: vectorSource,
            style: new ol.style.Style({
                stroke: new ol.style.Stroke({
                    color: 'rgba(0, 0, 255, 1.0)',
                    width: 2
                })
            })
        });
               
        var layers = [
            new ol.layer.Tile({source: new ol.source.OSM()}),
            vector,
        ];
        var map = new ol.Map({
            layers: layers,
             interactions: ol.interaction.defaults({ altShiftDragRotate:false, pinchRotate:false }),
            target: 'map',
            view: new ol.View({
                center: ol.proj.fromLonLat([-46.444137, -23.713596]),
                zoom: 12
            })
        });
        
  var select = new ol.interaction.Select({
    hitTolerance: 5,
    multi: true,
    condition: ol.events.condition.singleClick
  });
 map.addInteraction(select);

  var popup = new ol.Overlay.PopupFeature({
    popupClass: 'default anim',
    select: select,
    canFix: true,
    template: {
        title: 
          function(f) {
            return f.get('nome') ' (' f.get('id') ')';
          },
        attributes: // [ 'id', 'nome' ]
        {
          'nome': { title: 'Nome' },
          'id': { title: 'Id' },
        
        }
    }
  });
 map.addOverlay (popup);
 

Комментарии:

1. Вот рабочий пример: codepen.io/viglino/pen/WNpaeag

2. Вам не нужно устанавливать шаблон всплывающего окна, если его нет, он будет отображать все атрибуты. При исправлении вы можете попытаться установить заголовок всплывающего окна и атрибуты, которые вы хотите видеть во всплывающем окне с помощью шаблона…

3. Спасибо @ViglinoJean-Марк. Я последовал этому примеру codepen.io/viglino/pen/WNpaeag и сумел увидеть всплывающее окно. Один вопрос: можно ли во всплывающем окне показать изображение или ссылку на страницу с маской или даже рамкой?

4. Вы также можете использовать шаблон для форматирования атрибутов в виде HTML-изображения или ссылки: « var popup = new ol. Наложить. PopupFeature({ popupClass: ‘аним по умолчанию’, исправление: true, выбор: выбор, шаблон: { атрибуты: { ‘img’: { формат: функция(val) { возврат ‘<img src=»‘ val ‘» />’; }} } } }); «

5. @ViglinoJean-Марк Спасибо. Я попытаюсь и скажу, сработало это или нет. Спасибо, что поделились своим кодом и помогли мне с вопросами.

Ответ №3:

Это всплывающий код. У меня есть 3 слоя: слой 1, слой 2 и слой 3. Для слоя 1 идентификатор, который я хочу показать как идентификатор. Для слоя 2 я хочу показать идентификатор в виде КОДА, а для других слоев я не хочу показывать атрибут идентификатора. Как я должен изменить шаблон? Спасибо

  var popup = new ol.Overlay.PopupFeature({
    popupClass: 'default anim',
    select: select_interaction,
    canFix: true,
    template: {
        title: 
            function(f) {
                return f.get('NAME') ' (' f.get('ID') ')';
            },
        attributes: 
        {
            'ID': { title: 'ID' },
            // with prefix and suffix
            'POP': { 
                title: 'População',  // attribute's title
                before: '',           // something to add before
                format: ol.Overlay.PopupFeature.localString(),  // format as local string
                after: ' hab.'        // something to add after
            }, 
        }
    }
});
 

Комментарии:

1. @ViglinoJean-Марк, ты можешь мне помочь?

2. Вы должны использовать функцию, которая возвращает шаблон, который вы хотите использовать, в зависимости от атрибутов объекта…

3. @ViglinoJean-Марк, я не понял. Можно ли создать шаблон для каждого слоя? Если да, то как? спасибо тебе, я

Ответ №4:

@пользователь12538529
Вы должны создать функцию и вернуть шаблон для каждого случая:

 // Create templates
var templateID = { ... }; 
var templateCODE = { ... };
// Popup with a template function
var popup = new ol.Overlay.PopupFeature({
    popupClass: 'default anim',
    select: select_interaction,
    canFix: true,
    template: function(feature) {
      var prop = feature.getProperties();
      // Test if has property ID
      if (prop.hasOwnProperty('ID')) return templateID;
      // or property CODE
      else if (prop.hasOwnProperty('CODE')) return templateCODE;
    }
});
 

Комментарии:

1. Спасибо. Вместо тестирования атрибута, например идентификатора, КОДА, могу ли я проверить, является ли он layer1, layer2, layer3 и т. Д.? Потому что в нескольких слоях у меня есть идентификатор, но в одном я покажу его как идентификатор, в другом-как код, а в других я, возможно, захочу его не показывать. Я хотел бы создать шаблон для каждого слоя, который я собираюсь добавить. Это возможно?

2. У вас есть доступ только к объекту, а не к слою, но вы можете зарегистрировать слой при добавлении: layer.getSource ().on('addfeature', function (f){ f.layer = layer; }) вы можете получить доступ к слою объектов…