javascript - OpenLayers 3 和 Geoserver : Create popup on marker click

标签 javascript popup openlayers openlayers-3 geoserver

我有一个 OpenLayers 3 map ,其中包含来 self 的 Geoserver 的 WMS 图层。我正在尝试使用来自 WFS GetFeature 方法的弹出窗口内容数据在标记单击(从 WMS 层)上创建一个弹出窗口。我有一个 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 发现了两个问题:

  1. 您的 HTML 中尚未定义 ID 为“popup”的元素
  2. ol.Overlay 上没有“显示”方法

尽管您的 JsFiddle 使用的是 4.6.5,但您在问题中提到了 OpenLayers 3。我已经在 4.6.5 上尝试了下面的解决方案,它也应该适用于 3。

  1. 添加“弹出”元素
<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 的一些叠加示例: https://openlayers.org/en/latest/examples/overlay.html

    关于javascript - OpenLayers 3 和 Geoserver : Create popup on marker click,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50657456/

    相关文章:

    javascript - 如果找到/返回有效的 JSON,则禁用带有 jQ​​uery 单击事件的 href 链接

    java - 在 Web Dynpro Java 的弹出窗口中显示所选行

    javascript - UIWebView-stringByEvaluatingJavaScriptFromString : fill textbox in iFrame content?

    javascript - MYSQL - 检查变量是否存在,如果存在则更新

    javascript - 与 location.reload 同时调用函数以在 Javascript 中显示正确的消息

    html - jQuery.noConflict() 不适用于弹出框

    javascript - 添加事件点击到标记 openlayers

    javascript - openlayers 3 vector.getSource().clear() 上烦人的闪光

    javascript - 使用 GeoWebCache 时出现“粉红色瓷砖”

    javascript 回调函数 onreadystatechange,在一个简单的 ajax 示例中