基于PostgreSQL+Geoserver+OpenLayers的Webgis台风路径地图服务发布

一、实现效果

实现效果
路径对比图(来源:浙江水利厅http://typhoon.zjwater.gov.cn/default.aspx###):
在这里插入图片描述

二、环境要求

1. PostgreSQL

安装了PostgreSQL之后还需要安装对应版本的空间数据存储拓展(Postgis)才能支撑空间数据的管理,安装的流程不再赘述,网上教程大都可行。

2.GeoServer

GeoServer是OpenGIS Web服务器规范的J2EE实现的社区开源项目,利用GeoServer可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作。获得GeoServer服务的最直接的方法在其官网http://geoserver.org/下载zip压缩包,解压后双击bin目录下的startup.bat文件就可以启动(前提需要安装了JDK)。
在这里插入图片描述
看到如下图的命令行说明GeoServer启动成功
在这里插入图片描述
启动成功后在浏览器输入http://localhost:8080/geoserver/web/即可进入GeoServer地图服务管理界面,点击右上角的登录(默认用户名是admin,密码是geoserver)

3.OpenLayers

OpenLayers使用的是5版本,可以去官网https://openlayers.org/下载压缩包或者直接使用cdn都可以。

4.Qgis

Qgis是跨平台开源的桌面地理信息系统,可以说是目前比较优秀的开源GIS软件,功能强大,基本能够满足要求,使用Qgis的主要原因是利于对底图进行标注,这在第三部分会提到。

三、数据准备

数据准备可以分为两个部分,一个是底图数据,另一个是台风路径数据,底图数据主要包括世界地图、中国行政区划图、九段线、南海诸岛,台风数据主要包括各个时刻台风的经纬度、风力、风速等信息。

1.底图数据发布

底图数据使用的是全国大学生GIS技能大赛试题(台风路径分析)提供的数据,包含了世界地图、中国行政区划、九段线、南海诸岛,这些数据进行了一些处理,原始数据可以在网上下载,处理后的数据上传在csdn底图数据直接下载,可以直接下载。

Geoserver图层发布

数据处理完成后即可使用Gesosever进行地图服务的发布,Geoserver如何发布地图服务可以参考这两位兄弟的教程
geoserver地图发布服务教程(5)—发布postgis数据

搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3

将所有的底图图层都发布之后,可以在图层中看到添加的底图
在这里插入图片描述
点击【Layer Preview】可以对发布的图层进行多种预览(OpenLayers、GML、KML等)
在这里插入图片描述

Geoserver图层符号化

和实现效果相比较,明显不是我们需要的效果,这就是之前提到的使用Qgis进行地图标注的原因。
Geoserver图层风格支持ZIP和SLD两种格式,推荐使用SLD,更加方便快捷,SLD是风格化图层描述器(Styled Layer Descriptor)的简称,Geoserver支持手写SLD也支持使用工具生成(Qgis就可以做到)。

打开安装好的Qgis(安装教程可以参考这位老哥的Qgis安装教程)将文件加载到Qgis中,右键图层选择【属性】,对【符号化】和【标注】进行设置。
在这里插入图片描述

达到想要的效果后,在符号化的左下角点击【样式】下拉框,选择【保存样式】,将其保存为SLD格式
在这里插入图片描述
回到geoserver,点击【Styles】->【Add a new Styles】,设置Name、工作区、风格文件格式、图层的类型后选择对应的SLD文件选择上传,进行Validate后没问题选择保存。
注意要素在Qgis中和在PostgreSQL中的属性大小写是否匹配的问题,SLD中必须和PostgreSQL中匹配。

Style没问题后,点击【图层】,单击【Title】下的对应图层,切换到【发布】,将Styles与图层进行关联,选择自定义的符号化样式。在这里插入图片描述
保存后再次预览,已经进行了符号化,其余图层同上。
在这里插入图片描述

Geoserver图层组发布

发布图层后只能预览单个图层,而底图是所有图层叠加显示,可以同时调用多个图层进行图层的叠加,更好的办法是使用geoserver的图层组,对多个图层进行叠加组合后以单个服务的形式发布。

单击【图层组】->【添加新的图层组】,对Name、工作区、坐标参考系(ESPG4326)进行设置
在这里插入图片描述
然后就可以进行图层的添加,单击【添加图层】,会列出【图层】中可以添加的图层,在这里插入图片描述
分别进行添加,对图层的先后顺序进行设置后就可以保存
在这里插入图片描述
在Layer Preview中多了一个图层组,选择open layers预览,达到了我们的预期
在这里插入图片描述

台风数据

台风数据使用数据库管理软件直接导入数据库中
在这里插入图片描述

2.前端渲染

在html中引入OpenLayers依赖后就可以直接调用WMS服务加载底图并渲染台风路径

OpenLayers调用Geoserver WMS服务
    var map = new ol.Map({
      layers: [
        new ol.layer.Tile({
          //调用geoserver
          source: new ol.source.TileWMS({
            url: 'http://localhost:8080/geoserver/typhoon/wms',
            params: { 'LAYERS': 'typhoon:base_map', 'TILED': true },
            serverType: 'geoserver',
            crossOrigin: 'anonymous',
            transition: 0,
          })
        })
      ],
      target: 'map',
      view: new ol.View({
        projection: 'EPSG:4326',
        center: [120, 33],
        zoom: 4.5,
      }),
      controls: [new ol.control.MousePosition()]
    });
OpenLayers台风路径可视化

台风数据存储在PostgreSQL中,所以还需要从数据库中读取,所以需要一个简单的后端去请求数据库,使用了Ajax异步请求得到数据后再进行渲染。


    // 添加一个绘制的线使用的layer
    var drawLayer = new ol.layer.Vector({
      //layer所对应的source
      source: new ol.source.Vector(),

    })
    //把layer加入到地图中
    map.addLayer(drawLayer);

    $.ajax({
      type: "get",
      dataType: "json",
      url: "http://localhost:8081/api/typhoon/find_typhoon?name=莫兰蒂",
      contentType: "application/json; charset=utf-8",
      success: function (result) {

        for (var i = 0; i < result.data.length; i++) {
          addPoint(result.data[i].lng, result.data[i].lat);
        }
      },
      error: function () {
        console.log("请求失败")
      }
    })
    function addPoint(lng, lat) {
      //创建一个点
      var point = new ol.Feature({
        geometry: new ol.geom.Point([lng, lat]),
      })
      drawLayer.getSource().addFeatures([point])
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值