当前位置:   article > 正文

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

vue3 openlayer

一.前言

        不知不觉一年又要过去了,接触开发也就是这几个月的事情,感觉时间过的真快,今天就是除夕了,祝各位新年快乐呀,话说回来,其实在接触学习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包,通过点击单选框变换需要展示的图层

  1. <template>
  2. <div id="map">
  3. <ul id="transform">
  4. <li v-for="layerName in layerNames" :key="layerName">
  5. <input type="radio" :value="layerName" v-model="selectedLayer" @change="switchLayer($event.target.value)">
  6. <label>{{ layerName }}</label>
  7. </li>
  8. </ul>
  9. </div>
  10. </template>
  11. <script setup>
  12. import mapboxgl from 'mapbox-gl';
  13. import 'mapbox-gl/dist/mapbox-gl.css';
  14. import { Map, View } from 'ol';
  15. import { fromLonLat} from 'ol/proj';
  16. import XYZ from 'ol/source/XYZ';
  17. import TileLayer from 'ol/layer/Tile';
  18. import TileWMS from 'ol/source/TileWMS'
  19. import {defaults,FullScreen,MousePosition,ScaleLine} from 'ol/control'
  20. import { onMounted } from 'vue';
  21. import { ref } from 'vue';
  22. //mapboxgl.accessToken = 'pk.eyJ1IjoiY3VkODUiLCJhIjoiY2xrYnFncXZhMGc1cTNlbmFrNHN1N2cxeCJ9.69E3f8nMJkvqQDRhLSojVw';
  23. let activeLayer = ref(null);
  24. let selectedLayer=ref('')
  25. var map
  26. const layerNames = ['JsXd','JsXiand','JsSd','JsGd', 'JsWaterLine','JsWaterSurface','JsABP','JsABoundaryL','JsAdministrativeInterface']
  27. function switchLayer(layerName) {
  28. if (activeLayer.value) {
  29. let layerArray = map.getLayers().getArray()
  30. map.removeLayer(layerArray[1]);
  31. }
  32. const newLayer = createTileLayer(layerName);
  33. map.addLayer(newLayer);
  34. activeLayer.value = newLayer;
  35. }
  36. function createTileLayer(layerName){
  37. return new TileLayer({
  38. source:new TileWMS({
  39. url:'http://localhost:8080/geoserver/gis/wms',
  40. params:{'LAYERS':`gis:${layerName}`,'TILED':true},
  41. serverType:'geoserver',
  42. transition:0
  43. })
  44. })
  45. }
  46. onMounted(()=>{
  47. let baseMap = new TileLayer({
  48. source:new XYZ({
  49. url:'https://api.mapbox.com/styles/v1/mapbox/streets-v12/tiles/256/{z}/{x}/{y}?access_token=pk.eyJ1IjoiY3VkODUiLCJhIjoiY2xrYnFncXZhMGc1cTNlbmFrNHN1N2cxeCJ9.69E3f8nMJkvqQDRhLSojVw'
  50. })
  51. })
  52. map = new Map({
  53. layers:[baseMap],
  54. target:'map',
  55. view:new View({
  56. zoom:10,
  57. center:fromLonLat([118.7915619,32.0615513],'EPSG:3857')
  58. }),
  59. controls:defaults().extend([
  60. new FullScreen(),
  61. // new MousePosition(),
  62. new ScaleLine()
  63. ])
  64. })
  65. })
  66. </script>
  67. <style scoped>
  68. #map{
  69. position: relative;
  70. }
  71. #transform{
  72. list-style: none;
  73. position: absolute;
  74. top:10px;
  75. right:10px;
  76. z-index: 1;
  77. width: auto;
  78. background-color: rgba(255, 255, 255, 0.8);
  79. border: 1px solid #ddd;
  80. border-radius: 4px;
  81. box-shadow: 0 2px 4px rgba(0,0,0,0.2);
  82. }
  83. #transform li{
  84. margin-bottom: 5px;
  85. }
  86. #transform li:last-child{
  87. margin-bottom: 0;
  88. }
  89. #transform input[type="radio"]{
  90. margin-right: 5px;
  91. }
  92. #transform label {
  93. cursor: pointer;
  94. user-select: none; /* 防止文本被选择 */
  95. }
  96. /* .ol-full-screen{
  97. border-radius: 5px;
  98. } */
  99. </style>

 

三.总结


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

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

      

         

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/193930?site
推荐阅读
相关标签
  

闽ICP备14008679号