#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; })
вы можете получить доступ к слою объектов…