OpenLayer+Geoserver WMS服务获取要素属性,并转为JSON。

本文介绍了如何使用OpenLayers结合GeoServer的WMS服务获取要素属性,通常属性以HTML或XML格式返回。为了实现更灵活的数据展示,文章展示了如何将这些属性文本解析成JSON对象,便于自定义显示样式。文中提供了地图点击事件处理和`createJson`函数的代码示例。

WMS服务下的要素属性的获取,并转换为Json

说明

GeoServer的WMS服务下点击要素可以获得属性,但一般来说是html(xml)格式的,虽然可以获得要素属性,但是格式无法灵活自定义。这里采用将获得的xml文本进行解析,转换为json对象,以便后期自由定义显示风格

通过点击要素获取属性html文本,并解析为json

地图点击部分的代码:

map.on("click", function(e) {
      if (e.dragging) return;
      //因为WFS没有加载入Map,所以用Map.getFeaturesAtPiexl的方法不可用<--此方法可以设定容差
      //只能用vectorSource的getFeatures的方法,而getFeaturesAtCoordinate不能设定容差
      //只能用getFeaturesInExtent的方法<----此方法不可行,识别的features乱七八糟
      //用wms的getFeatureInfoUrl方法,获取XML,再解析转换成Json来处理。
      var cord = e.coordinate;
      var pixel = e.pixel;
      //map获取feature,html格式
      //layerGroupTest为ol/layer/Tile类型
      var url = layerGroupTest
        .getSource()
        .getGetFeatureInfoUrl(
          e.coordinate,
          map.getView().getResolution(),
          "EPSG:4326",
          { INFO_FORMAT: "text/html", FEATURE_COUNT: 50 }
        );
      if (url) {
        Axios.get(url).then(function(response) {
          //解析XML,生成Json
          var str = stringify(response.data);
          var jsonObject = createJson(response.data);
          me.elJsonObject = jsonObject;
          console.log(jsonObject);
        });
      }
    });

createJson的代码:

var createJson = function (str) {
    var xmlData = createXml(str);

    var jsonObject = {};
    jsonObject["layers"] = [];
    var tables = xmlData.getElementsByTagName('table');
    for (var i = 0; i < tables.length; i++) {
        var layerJson = {};
        var element = tables[i];
        // console.log(element);
        //图层名
        var layerName = element.getElementsByTagName('caption')[0].textContent.toString();
        layerJson["layername"] = layerName;
        //属性
        var featureJson = []; //最外层
        var kvs = element.getElementsByTagName('tr');
        //第1个为Key值,以后多个为分别的Value值
        var keys = kvs[0].children;
        //创建一个存储Keys的对象
        var featureKeys=[];
        for(var j=0;j<keys.length;j++){
            featureKeys.push(keys[j].textContent);
        }
        layerJson["featureKeys"]=featureKeys;
        //从第2个开始
        for (var j = 1; j < kvs.length; j++) {
            var kvsJson = {};
            var values = kvs[j].children;
            for (var k = 0; k < keys.length; k++) {
                kvsJson[keys[k].textContent] = values[k].textContent;
            }
            featureJson.push(kvsJson);
        }
        layerJson["featureInfos"] = featureJson;
        jsonObject["layers"].push(layerJson);
    };
    return jsonObject;
}
var createXml = function (str) {
    if (document.all) {//IE浏览器
        var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = false;
        xmlDoc.loadXML(str);
        return xmlDoc;
    }
    else {//非IE浏览器
        return new DOMParser().parseFromString(str, "text/xml");
    }
}

Json数据相对自由 ,可以根据需要展示出来。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值