openlayers 从 wms 获取属性

Posted

技术标签:

【中文标题】openlayers 从 wms 获取属性【英文标题】:openlayers get attribute from wms 【发布时间】:2016-11-01 09:17:50 【问题描述】:

我在 OpenLayers 中从 Geoserver 提供一个 wms 图层,并在单击地图时尝试从该图层中的对象中提取特定属性。

我正在像这样定义我的 wms 层:

oas = new OpenLayers.Layer.WMS(
"oas",
"http://www.bwgeoserver.com/geoserver/UK_Admin/wms",
    
      "LAYERS": 'wealthmap_bdy',
      transparent: 'true',
      extractAttributes: 'true'
    ,
    
      buffer: 0,
      opacity: 1,
      displayOutsideMaxExtent: true,
      isBaseLayer: false
    
    );
map.addLayer(oas);

图层在地图上显示正常。我正在使用代理服务器并且不存在跨域问题,因为我可以在弹出窗口中选择并显示所有属性。 “OA11Code”绝对是wms层上的一个字段,在弹窗中与其他属性显示ok。

但是当我尝试使用此代码从所选对象中提取此属性时:

oaPicker = new OpenLayers.Control.WMSGetFeatureInfo(
             url: 'http://www.bwgeoserver.com/geoserver/UK_Admin/wms',
             title: 'identify features on click',
             layers: [oas],
             queryVisible: true
         );

oaPicker.events.register('getfeatureinfo', this, selectid);
map.addControl(oaPicker);
oaPicker.activate();

function selectid(e) 
    var val = e.features[0].attributes.OA11Code;

我在 Firefox 调试器中收到错误提示:

“类型错误:e.features[0] 未定义”。

我想要的只是能够在地图上单击,从 wms 层中提取属性值,将其分配给 javascript 变量并对其进行处理。任何帮助将不胜感激。

【问题讨论】:

你能在你的selectid(e) 函数中测试e 的值吗?可以使用浏览器调试器拦截对您的地理服务器的getfeatureinfo 请求和响应吗?如果这些不是结论性的,Geoservers 日志也可以提供一些见解。 【参考方案1】:

默认情况下,GeoServer 将为 GetFaeureinfo 请求返回纯文本,但解析可能有点困难(特别是如果任何功能可能为空或包含特殊字符)。

更好的解决方案是将info_format 参数设置为application/json,这样您就可以得到像this 这样易于解析的JSON 响应。

【讨论】:

感谢您对此问题的回复。看来问题确实是由于返回的对象的格式。我使用以下行更改了格式:oaPicker.infoFormat = 'application/vnd.ogc.gml'。这成功了。

以上是关于openlayers 从 wms 获取属性的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 Open Layers 3 中自动计算的 TileWMS 请求属性

Angular4 添加 WMS (openlayers)

OpenLayers3 在放大时不刷新 WMS

OpenLayersVUE+OpenLayers+ElementUI加载WMS地图服务

Openlayers 3 forEachLayerAtPixel 只获取层

使用 Openlayers 的 WFS 请求中出现奇怪的错误