vue3结合openlayers,geoserver实现GIS一张图(WebGIS)

一.前言

        不知不觉一年又要过去了,接触开发也就是这几个月的事情,感觉时间过的真快,今天就是除夕了,祝各位新年快乐呀,话说回来,其实在接触学习WebGIS的过程中还是蛮迷茫的,自己虽然是地信的学生,对于地理方面还有有一些自己的理解,但平时专业课学习的就是arcgis空间分析,遥感图像处理,WebGIS的部分并不是太重视,可能是因为没有那么多时间,毕竟这需要扎实的前端技能,不是一朝一夕就可以说明白的,当然了我会继续钻研下去的,大家一起加油。

 二.言归正传

A.演示


        我做的这个一张图展示的数据是有关江苏的行政境界面,线,点,还有乡道,县道,国道,水系线,水系面等

 

B.过程概述


(1)获取并处理相关数据

        这个数据是我在做第12届全国大学生GIS大赛的时候直接就地取材,下面是对应的博客https://blog.csdn.net/weixin_73810008/article/details/135921780?spm=1001.2014.3001.5502,我处理出我需要的数据并导出到相应的文件夹中


 

(2)通过QGIS将数据导入对应数据库 

        其实这里我是走了弯路的,arcgis好像也可以直接与数据库继续连接,但是好像要把什么文件配置到指定地点,而且它对postgresql版本也有限制,我觉得用的不舒服,所以直接采用QGIS导入,但前提是电脑已经下载了QGIS和postgresql。

建立数据库

建立数据库连接

 

导入数据 

        最好导入的数据坐标系都是3857,因为市面上除了高德百度的地图的坐标系进行了偏移,其它基本都是基于Web墨卡托投影,也就是我们熟知的3857,将所有需要的数据导入完成后,刷新数据库,看对应的表有没有进入数据库中


 

(3)运行geoserver 

        先创个新的工作空间,再添加新的存储仓库到这个空间中,再根据自己需要选择矢量数据源,具体的geoserver操作大家可以查询,这里不过多赘述

 


 

(4)发布地图服务 

        点击相应位置,发布数据库中需要的图层   


 

(5)WebGIS开工 ,代码演示

        启动vue项目,下载需要的ol包,通过点击单选框变换需要展示的图层

<template>
  <div id="map">
    <ul id="transform">
        <li v-for="layerName in layerNames" :key="layerName">
            <input type="radio" :value="layerName" v-model="selectedLayer" @change="switchLayer($event.target.value)">
            <label>{{ layerName }}</label>
        </li>
    </ul>
  </div>
</template>

<script setup>
    import mapboxgl from 'mapbox-gl';
    import 'mapbox-gl/dist/mapbox-gl.css';
    import { Map, View } from 'ol';
    import { fromLonLat} from 'ol/proj';
    import XYZ from 'ol/source/XYZ';
    import TileLayer from 'ol/layer/Tile';
    import TileWMS from 'ol/source/TileWMS'
    import {defaults,FullScreen,MousePosition,ScaleLine} from 'ol/control'    
    import { onMounted } from 'vue';
    import { ref } from 'vue';

    //mapboxgl.accessToken = 'pk.eyJ1IjoiY3VkODUiLCJhIjoiY2xrYnFncXZhMGc1cTNlbmFrNHN1N2cxeCJ9.69E3f8nMJkvqQDRhLSojVw';

    let activeLayer = ref(null);
    let selectedLayer=ref('')
    var map

    const layerNames = ['JsXd','JsXiand','JsSd','JsGd', 'JsWaterLine','JsWaterSurface','JsABP','JsABoundaryL','JsAdministrativeInterface']

    function switchLayer(layerName) {
        if (activeLayer.value) {
            let layerArray = map.getLayers().getArray()
            map.removeLayer(layerArray[1]);
        }
        const newLayer = createTileLayer(layerName);
        map.addLayer(newLayer);
        activeLayer.value = newLayer;
    }
    function createTileLayer(layerName){
        return new TileLayer({
            source:new TileWMS({
                url:'http://localhost:8080/geoserver/gis/wms',
                params:{'LAYERS':`gis:${layerName}`,'TILED':true},
                serverType:'geoserver',
                transition:0
            })
        })
    }
    onMounted(()=>{
        let baseMap = new TileLayer({
            source:new XYZ({
                url:'https://api.mapbox.com/styles/v1/mapbox/streets-v12/tiles/256/{z}/{x}/{y}?access_token=pk.eyJ1IjoiY3VkODUiLCJhIjoiY2xrYnFncXZhMGc1cTNlbmFrNHN1N2cxeCJ9.69E3f8nMJkvqQDRhLSojVw'
            })
        })
        map = new Map({
            layers:[baseMap],
            target:'map',
            view:new View({
                zoom:10,
                center:fromLonLat([118.7915619,32.0615513],'EPSG:3857')
            }),
            controls:defaults().extend([
                new FullScreen(),
                // new MousePosition(),
                new ScaleLine()
            ])
        })
    })
</script>
    
<style scoped>
    #map{
        position: relative;
    }
    #transform{
        list-style: none;
        position: absolute;
        top:10px;
        right:10px;
        z-index: 1;
        width: auto;
        background-color: rgba(255, 255, 255, 0.8);
        border: 1px solid #ddd;
        border-radius: 4px;
        box-shadow: 0 2px 4px rgba(0,0,0,0.2);
    }
    #transform li{
        margin-bottom: 5px;
    }
    #transform li:last-child{
        margin-bottom: 0;
    }
    #transform input[type="radio"]{
        margin-right: 5px;
    }
    #transform label {
        cursor: pointer; 
        user-select: none; /* 防止文本被选择 */
    }
    /* .ol-full-screen{
        border-radius: 5px;
    } */
</style>

 

三.总结


         这篇文章我淡化操作步骤,相信大家对应软件的使用是没问题的,所以我只提供核心的代码和思路,希望对大家有所帮助。

        像这样一个简单的项目就把前后端以及GIS软件等等有机结合到一起,我学习WebGIS也是瞎子摸象,笔者希望这篇文章可以给读者有一定的启发。大家也可以一起交流,互相学习进步。希望可以收藏点赞加关注。

      

         

  • 26
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue3是最新版本的Vue.js框架,是一种现代的JavaScript框架,用于构建交互式和响应式的应用程序。OpenLayers是一个很受欢迎的用于Web地图应用程序的JavaScript库。 Vue3和OpenLayers两者结合使用可以创建出高级的Web地图应用程序,因为Vue3拥有丰富的生态系统和丰富的组件库,能够轻松地集成OpenLayers的功能和样式。Vue3非常适合用于开发Web应用程序,因为它提供了许多工具和功能来优化应用程序的性能和开发体验。 通过Vue3,您可以轻松地将OpenLayers与其他Vue组件集成在一起,以创建具有高级功能和交互性的地图应用程序。Vue3的响应式数据绑定特性可以轻松地更新OpenLayers层和标记等地图元素。Vue3还提供了一种方便的方法来管理地图事件,您可以方便地为每个地图事件创建自定义处理程序和生命周期钩子。 总之,Vue3和OpenLayers结合使用可以为您带来一个强大的Web地图应用程序框架,提高开发和设计的效率,并在可扩展性和性能方面提供更好的解决方案。 ### 回答2: Vue3是一种现代web应用程序框架,可以用于构建基于数据驱动的单页面应用程序。OpenLayers则是一种开源JavaScript库,用于在Web上呈现交互式地图和地理空间数据。 Vue3和OpenLayers结合可以为开发人员提供一种强大的工具,用于构建可视化地图和地理空间数据的应用程序。Vue3可以通过其组件系统便于地组织代码和数据,并且可以使用其响应式数据绑定来更新UI。OpenLayers可以允许开发人员轻松地创建交互式地图,并使用其丰富的API来操作地图的样式和数据。 与以前版本的Vue相比,Vue3的主要优势是其重新设计的响应式API。Vue3的响应式API更加高效和灵活,使得开发人员可以更轻松地处理大量数据的更改。在开发地图应用程序时,这非常重要,因为大量的地理空间数据会随时间而变化。Vue3的新特性还包括更简单的编译器、更好的渲染性能和更好的TypeScript支持。 熟练使用Vue3和OpenLayers可以使开发人员轻松构建功能强大且可定制的地图应用程序。使用组件化的方法来管理应用程序代码,可以使应用程序更容易维护和扩展。OpenLayers强大的功能可以使开发人员制定定制的地图风格和数据显示,从而为用户提供更丰富的交互体验。总而言之,Vue3和OpenLayers结合是开发地图应用程序的绝佳选择。 ### 回答3: Vue3-OpenLayers是基于Vue3框架的客户端Web地图库。该库结合Vue3的响应式数据流和OpenLayers的强大地图功能,提供了一个简单易用、灵活可定制的地图开发框架。通过Vue3-OpenLayers,开发者可以较为轻松地搭建起自己的地图应用,实现各种地图需求。 Vue3-OpenLayers库的主要特点包括: 1. 基于Vue3响应式系统,便于数据更新和管理; 2. 提供了完整的OpenLayers组件库,如地图层、控件、交互等,方便使用; 3. 支持灵活的地图样式配置和自定义功能开发; 4. 支持OpenLayers的各种地图源,如瓦片、WMS、WMTS等等。 Vue3-OpenLayers库的使用对于有Vue3开发经验的开发者而言较为友好,借助Vue3的响应式能力,实现地图数据和业务逻辑的跟随变化响应,并且组件化的设计模式方便了多层级嵌套的地图应用开发。同时,开发者还可以利用Vue3提供的组件化构建特性,设计出符合自己需求的定制化地图组件。 总之,Vue3-OpenLayers是一款强大的地图库,它将Vue3和OpenLayers优势结合起来,为地图应用开发者提供了更为简单、灵活的地图开发解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值