OpenLayers 3 和 Geoserver:在标记单击时创建弹出窗口
OpenLayers 3 and Geoserver: Create popup on marker click
我有一个 OpenLayers 3 地图,其中包含来自我的 Geoserver 的 WMS 图层。我正在尝试使用来自 WFS GetFeature 方法的弹出窗口内容数据在标记单击(从 WMS 层)上创建一个弹出窗口 window。我有一个 JsFiddle here.
代码相当简单并且基于其他 SO 帖子。
var baselayer = new ol.layer.Tile({
source: new ol.source.OSM()
});
var layer1 = new ol.layer.Tile({
source: new ol.source.TileWMS({
url: 'http://88.99.13.199:8080/geoserver/agristats/wms',
params: {
'LAYERS': 'agriculture:megaladimosia',
'STYLES': 'point',
'TILED': true
},
serverType: 'geoserver'
})
});
var map = new ol.Map({
layers: [baselayer, layer1],
controls: ol.control.defaults().extend([
new ol.control.ScaleLine({
units: 'metric'
}),
new ol.control.FullScreen()
]),
target: 'mymap',
view: new ol.View({
center: [2687148, 4556999],
zoom: 6.5
})
});
var element = document.getElementById('popup');
var popup = new ol.Overlay({
element: element,
positioning: 'bottom-center',
stopEvent: false
});
map.addOverlay(popup);
map.on('click', function(evt) {
var feature = map.forEachFeatureAtPixel(evt.pixel, function(feature, layer) {
return feature;
});
if (feature) {
var coord = feature.getGeometry().getCoordinates();
var props = feature.getProperties();
var info = "<h2>bvnvb</h2>";
// Offset the popup so it points at the middle of the marker not the tip
popup.setOffset([0, -22]);
popup.show(coord, info);
} else {
var url = layer1
.getSource()
.getGetFeatureInfoUrl(
evt.coordinate,
map.getView().getResolution(),
map.getView().getProjection(), {
'INFO_FORMAT': 'application/json',
'propertyName': 'total_budget'
}
);
reqwest({
url: url,
type: 'json',
}).then(function(data) {
var feature = data.features[0];
var props = feature.properties;
console.log(props.total_budget);
var info = "<h2>" + props.total_budget + "</h2>";
console.log(info);
popup.show(evt.coordinate, info);
});
};
});
然而,这总是给我一个错误 Uncaught TypeError: popup.show is not a function。
我添加了 ol-popup js 和 css 文件,但仍然没有。如果有人能提供帮助,我将不胜感激。
根据您的 JsFiddle,我发现了两个问题:
- ID 为 "popup" 的元素尚未在您的 HTML
中定义
ol.Overlay
上没有 "show" 方法
尽管您的 JsFiddle 使用的是 4.6.5,但您在问题中提到了 OpenLayers 3。我已经用 4.6.5 尝试了下面的解决方案,它应该也适用于 3。
- 添加 "popup" 元素
<div id="popup"></div>
- 将
popup.show
的用法替换为 popup.setPosition(ol.Coordinate)
,并将弹出窗口的内容更新为 element.innerHTML
popup.setPosition(evt.coordinate);
element.innerHTML = info;
例如,这是一个更新的 JsFiddle:
http://jsfiddle.net/swnykzgq/1/
以下是来自 OpenLayers 的一些 Overlay 示例:
https://openlayers.org/en/latest/examples/overlay.html
我有一个 OpenLayers 3 地图,其中包含来自我的 Geoserver 的 WMS 图层。我正在尝试使用来自 WFS GetFeature 方法的弹出窗口内容数据在标记单击(从 WMS 层)上创建一个弹出窗口 window。我有一个 JsFiddle here.
代码相当简单并且基于其他 SO 帖子。
var baselayer = new ol.layer.Tile({
source: new ol.source.OSM()
});
var layer1 = new ol.layer.Tile({
source: new ol.source.TileWMS({
url: 'http://88.99.13.199:8080/geoserver/agristats/wms',
params: {
'LAYERS': 'agriculture:megaladimosia',
'STYLES': 'point',
'TILED': true
},
serverType: 'geoserver'
})
});
var map = new ol.Map({
layers: [baselayer, layer1],
controls: ol.control.defaults().extend([
new ol.control.ScaleLine({
units: 'metric'
}),
new ol.control.FullScreen()
]),
target: 'mymap',
view: new ol.View({
center: [2687148, 4556999],
zoom: 6.5
})
});
var element = document.getElementById('popup');
var popup = new ol.Overlay({
element: element,
positioning: 'bottom-center',
stopEvent: false
});
map.addOverlay(popup);
map.on('click', function(evt) {
var feature = map.forEachFeatureAtPixel(evt.pixel, function(feature, layer) {
return feature;
});
if (feature) {
var coord = feature.getGeometry().getCoordinates();
var props = feature.getProperties();
var info = "<h2>bvnvb</h2>";
// Offset the popup so it points at the middle of the marker not the tip
popup.setOffset([0, -22]);
popup.show(coord, info);
} else {
var url = layer1
.getSource()
.getGetFeatureInfoUrl(
evt.coordinate,
map.getView().getResolution(),
map.getView().getProjection(), {
'INFO_FORMAT': 'application/json',
'propertyName': 'total_budget'
}
);
reqwest({
url: url,
type: 'json',
}).then(function(data) {
var feature = data.features[0];
var props = feature.properties;
console.log(props.total_budget);
var info = "<h2>" + props.total_budget + "</h2>";
console.log(info);
popup.show(evt.coordinate, info);
});
};
});
然而,这总是给我一个错误 Uncaught TypeError: popup.show is not a function。 我添加了 ol-popup js 和 css 文件,但仍然没有。如果有人能提供帮助,我将不胜感激。
根据您的 JsFiddle,我发现了两个问题:
- ID 为 "popup" 的元素尚未在您的 HTML 中定义
ol.Overlay
上没有 "show" 方法
尽管您的 JsFiddle 使用的是 4.6.5,但您在问题中提到了 OpenLayers 3。我已经用 4.6.5 尝试了下面的解决方案,它应该也适用于 3。
- 添加 "popup" 元素
<div id="popup"></div>
- 将
popup.show
的用法替换为popup.setPosition(ol.Coordinate)
,并将弹出窗口的内容更新为element.innerHTML
popup.setPosition(evt.coordinate);
element.innerHTML = info;
例如,这是一个更新的 JsFiddle: http://jsfiddle.net/swnykzgq/1/
以下是来自 OpenLayers 的一些 Overlay 示例: https://openlayers.org/en/latest/examples/overlay.html