Vue+OpenLayers学习系列(十一)使用axios加载GeoServer发布的WFS服务

这篇博客讲述了在 OpenLayers 中如何使用 GeoJSON 格式加载图层信息,以及如何结合 Axios 进行异步请求获取数据。作者遇到在创建 VectorSource 时无法通过 `addFeatures` 方法加载数据的问题,但通过直接在构造函数中提供 features 参数成功解决了问题。同时,强调了由于 Axios 请求的异步性质,必须在接收到数据后添加图层到地图中。
摘要由CSDN通过智能技术生成

一、问题

1、之前用下面官网的方法 source.addFeatures() 将查询的图层信息加载到 source 里面,但是不知道为啥,死活出不来,也不报错,就很奇怪。

var source = new VectorSource();
source.addFeatures(new GeoJSON({featureProjection: 'EPSG:3857'}).readFeatures(res.data));

后面偶然间用下列方法试了下,发现可以读取出来:

var source = new VectorSource({  //这样可以出来结果
   features: (new GeoJSON({featureProjection:EPSG:3857'})).readFeatures(res.data)
})

2、axios 请求获取数据,需要将 this.map.addLayer(vectorLayer) 放在获取的数据里面,因为请求是异步,放到外面的话可能 vectorLayer 是空的。

axios({
    methods: "GET",
    url: "http://localhost:8080/geoserver/ocean/ows",
    params : {
       service : 'WFS',
       version : '1.0.0',
       request : 'GetFeature',
       typeName : 'ocean:china',  //图层名称
       outputFormat : 'application/json'
     }
   })
   .then((res)=>{
      var source = new VectorSource({  //这样可以出来结果
         features: (new GeoJSON({featureProjection: 'EPSG:3857'})).readFeatures(res.data)
      }) 
      let vectorLayer = new VectorLayer({
        source: source,
      });
      this.map.addLayer(vectorLayer);
    }).catch(error=>{
	  console.log("请求失败,失败信息:"+ error);
	});

二、完整代码

<template>
  <div id="map" ref="rootmap">
    <el-button @click="addLayers()">添加图层</el-button>
  </div>
</template>
<script>
  import 'ol/ol.css';
  import Map from 'ol/Map';
  import View from 'ol/View';
  import { fromLonLat } from "ol/proj";
  import {Vector as VectorLayer,Tile as TileLayer} from 'ol/layer';
  import {Vector as VectorSource,Stamen} from 'ol/source';
  import {GeoJSON} from 'ol/format';
  import axios from 'axios'

  export default{
    name: 'OlGeoserveAxiosWFS',
    data(){
      return{
          map: null
      };
    },
    methods:{
      addLayers(){
        axios({
            methods: "GET",
            url: "http://localhost:8080/geoserver/ocean/ows",
            params : {
              service : 'WFS',
              version : '1.0.0',
              request : 'GetFeature',
              typeName : 'ocean:china',  //图层名称
              outputFormat : 'application/json'
            }
          })
          .then((res)=>{
            var source = new VectorSource({  //这样可以出来结果
              features: (new GeoJSON({featureProjection:'EPSG:3857'})).readFeatures(res.data)
            })
            let vectorLayer = new VectorLayer({
              source: source,
            });
            this.map.addLayer(vectorLayer);
          }).catch(error=>{
		        console.log("请求失败,失败信息:"+ error);
	        });
      }
    },
    mounted(){     //可以出来结果
        this.map = new Map({
            target: 'map',                          // 关联到对应的div容器
            layers: [
                new TileLayer({                 // Stamen底图
                    source: new Stamen({
                        layer: 'watercolor'
                    })
                }),
            ],
            view: new View({                     // 地图视图
                center: fromLonLat([114.38, 23.09]),
                zoom: 6
            })
        });
    }
  };

</script>

<style>
  #map{
    height:800px;
    width: 1400px;
  }
  /*隐藏ol的一些自带元素*/
  .ol-attribution,.ol-zoom { display: none;}

</style>

三、运行结果

点击上方“添加图层”按钮,可以得出结果。

### OpenLayersGeoServer集成概述 OpenLayers 是一个用于构建地图应用程序的强大 JavaScript 库,而 GeoServer 则是一个开源服务器软件,允许用户发布和编辑地理空间数据。两者结合可以创建功能丰富的 Web 地图应用。 通过 RESTful API 和 WMS/WFS 协议的支持,OpenLayers 可以轻松连接到 GeoServer 发布的地图服务[^1]。这种组合不仅提供了高效的客户端渲染能力,还支持复杂的 GIS 功能和服务端处理逻辑。 #### 使用WMS协议加载GeoServer发布的地图层 为了在 OpenLayers 中显示由 GeoServer 提供的地图图像,通常会采用 WMS (Web Map Service) 方式来获取栅格化的地图切片。下面是一段简单的代码示例展示了如何配置: ```javascript import 'ol/ol.css'; import {Map, View} from 'ol'; import TileLayer from 'ol/layer/Tile'; import OSM from 'ol/source/OSM'; import TileWMS from 'ol/source/TileWMS'; const map = new Map({ target: 'map', layers: [ new TileLayer({ source: new OSM() }), new TileLayer({ source: new TileWMS({ url: 'http://localhost:8080/geoserver/wms', // 替换成实际地址 params: {'LAYERS': 'topp:states'}, serverType: 'geoserver' }) }) ], view: new View({ center: [-97.5634, 35.4676], zoom: 4, projection: 'EPSG:4326' }) }); ``` 这段代码首先引入了必要的库文件并定义了一个基本的地图对象;接着添加了一层来自 OpenStreetMap 的底图以及一层基于 GeoServer 上托管的数据集 `topp:states` 的覆盖物。最后设置了视窗中心位置及缩放级别等参数。 #### 配置Vue项目中的环境变量以便于开发调试 当在一个 Vue CLI 构建的应用程序里集成上述功能时,可以通过设置 `.env.development.local` 文件内的代理规则绕过跨域请求限制问题。这使得开发者可以在本地环境中更方便地测试与远程 GeoServer 实例之间的交互而不必担心 CORS 错误的发生[^2]。 ```bash VUE_APP_API_URL=http://your.geoserver.domain.com/ # For development only PROXY=/api => http://localhost:8080/geoserver/ ``` 在此基础上修改之前提到过的 URL 请求路径即可实现无缝对接: ```diff url: '/api/wms?service=WMS&version=1.1.0&request=GetMap...' // 或者利用axios之类的HTTP工具包自动拼接基础URL axios.get('/api/wms', { params: {...} }) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值