GeoServer发布地图服务并在OpenLayers中显示:shp的WMS服务和GeoTIFF的WTMS服务

2023-11-16

GeoServer发布的地图服务结构如下:

  1. 必须创建一个工作区,该工作区下可以存放多组无关数据。也就是说,工作区的作用就类似于一个文件夹,仅仅用于分类。
  2. 在工作区下添加数据存储。数据存储即一组相关数据。通常,一个地区的地图可能是单个文件构成,也可能是多个文件构成,但这都算是一组相关数据,即一个数据存储。一个工作区下可以添加多个数据存储。
  3. 每个数据存储下往往有一个或多个图层。例如山东地图,这个数据存储是多个shp构成,导入后,每个shp都是一个图层,每个图层都可单独进行发布。只有被发布的图层才能在数据的Layer Preview下进行查看。

所以,发布地图的过程为:创建工作区→添加数据存储→发布图层。

注意由于图层只能一个一个发布,无法一次性发布多个,所以当需要发布一个新的图层时,可以选择图层→添加新的资源:

然后选择已有的数据存储,就可以查看图层列表了:

 

创建数据源时,有3个选择:

  1. 矢量数据源:保存基础形状数据,放缩不产生失真。
  2. 栅格数据源:保存栅格化图片数据,放缩会失真。
  3. 其他数据源

因此,对于路径类的数据,往往都是矢量数据;对于瓦片类的数据,往往都是栅格数据。

 

 

发布WMS服务:矢量数据shp

矢量数据中,使用较多的是shapefiles,也就是:

上面的Directory of spatial files(shapefiles)用于选择有多个.shp文件的文件夹。

下面的Shapefile用于选择单个.shp文件。

然后在图层列表中进行发布。

通常,坐标参考系会自动填入:

若没有自动填入,则可以手动选择一个。

注意边框和经纬度边框需要点击一下计算:

计算后会填入具体的坐标值。

然后发布即可。

发布后,点击数据→Layer Preview,在右侧找到目标图层,点OpenLayers,即可弹出新页面查看。

 

 

发布WMTS服务:栅格数据GeoTIFF

栅格数据中,使用较多的是GeoTIFF:

GeoTIFF是一种地图源数据,地图每一级都由1个.tif和1个.tfw构成:

选择添加GeoTIFF,然后选择工作区,自定义数据源名称,选择URL。URL即具体的.tif文件:

每次只能选择一个tif,所以对于多级地图,需要多次重复添加栅格数据源,将每一个tif都添加进来。

保存后,会跳转到新建图层页面,刚才添加的tif已经添加到了图层列表中。

点击发布:

跳转到发布页面。其边框坐标会自动计算,不用点击。

点击Tile Caching选项卡:

修改最下方的zoom levels:

这里定义为4/17,是因为地图最低等级为4级,最高等级为17级。将Published zoom levels和Cached zoom levels修改为一致即可。

保存。

这样,就将第4级地图的tif发布为图层了。重复上述步骤,将其他各级地图的tif也加入数据源并发布为图层。

然后对这些地图源数据进行切图,将各级地图切为瓦片:

点击左侧的Tile Caching下的Tile Layers:

找到刚才发布的图层,点右侧的Seed/truncate:

注意其中的Zoom start和Zoom stop,将其都设为与当前地图等级相同即可(4级地图都设为04,5级地图都设为05,6级地图都设为06……)

然后点Submit,会跳转到提交页面,GeoServer就会生成切图。

切图的生成路径为:

GeoServer安装目录/data_dir/gwc/工作区_图层名

其他地图等级的图层也按照相同方式切片。

然后将其他地图的切片文件夹复制到第4级的切片文件夹下:

然后就可查看地图了:

选择一种图片格式,会打开一个预览页面(后面要用到)

然后可以用鼠标中键进行放缩。

第一次由于要生成更多的缓存细节,会稍微慢一点。

于是切片服务WMTS就发布完成了。

 

OpenLayers中加载WMTS地图服务

要在OpenLayers中加载,则首先查看页面右侧的服务能力,点击WTMS下的1.0.0:

会弹出一个窗口,显示XML文件内容:

其中,有多个<ows>标签的href属性都标明了WMTS的服务地址。记下这个服务地址,后面要用到

然后回到前面打开的预览页面,在页面上点右键:

选检查,会弹出开发者工具。查看左侧Elements标签下的内容,打开<head>标签下的最后一个<script>标签:

该<script>就是GeoServer生成的地图Demo页面主要内容。

在内容上点左键会全部选中,然后在代码上点右键,在弹出菜单中选择Copy→Copy outerHTML,会将内容全部复制。

然后将这些js内容粘贴到一个文本文档中,后面要用到

新建一个页面:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<link rel="stylesheet" href="v5.2.0-dist/ol.css">
		<script src="v5.2.0-dist/ol.js"></script>
	</head>
	<body>
		<div id="map"></div>
		<script></script>		
	</body>
</html>

在该空白页面中做了几个工作:

  • 引入OpenLayers库。这里引入的是本地库文件,根据自己的实际情况修改。
  • 添加了一个<div>,其id为map
  • 添加了一个空白<script>。

注意作为地图容器的<div>没有设置大小,这样默认会平铺。可以为其设置widthheight样式来控制<div>的大小。

将前面文本文档中保存的js代码粘贴到<script>标签中。

js代码较长,其结构大致如下:

<script>

    function init() {

       // 显示坐标

       function ScaleControl(opt_options) {

           ...

       };

       ol.inherits(ScaleControl, ol.control.Control);

       ScaleControl.prototype.setMap = function(map) {

           ...

       }

       // 显示坐标结束

 

       // 基本属性

       var gridsetName = 'EPSG:4326';

      var gridNames = ['EPSG:4326:3', 'EPSG:4326:4', 'EPSG:4326:5', 'EPSG:4326:6', 'EPSG:4326:7', 'EPSG:4326:8', 'EPSG:4326:9', 'EPSG:4326:10', 'EPSG:4326:11', 'EPSG:4326:12', 'EPSG:4326:13', 'EPSG:4326:14', 'EPSG:4326:15'];

       var baseUrl = '../service/wmts';

       var style = '';

       var format = 'image/png';

       var infoFormat = 'text/html';

       var layerName = 'shandong:L04';

       var projection = new ol.proj.Projection({

           code: 'EPSG:4326',

           units: 'degrees',

           axisOrientation: 'neu'

       });

       var resolutions = [0.087890625, 0.0439453125, 0.02197265625, 0.010986328125, 0.0054931640625, 0.00274658203125, 0.001373291015625, 6.866455078125E-4, 3.4332275390625E-4, 1.71661376953125E-4, 8.58306884765625E-5, 4.291534423828125E-5, 2.1457672119140625E-5];

       baseParams = ['VERSION', 'LAYER', 'STYLE', 'TILEMATRIX', 'TILEMATRIXSET', 'SERVICE', 'FORMAT'];

 

       params = {

           ...

       };

      

       // 构建layersource

       function constructSource() {

           ...

       }

      

       // 构建layer

       var layer = new ol.layer.Tile({

           source: constructSource()

       });

      

       // 构建view

       var view = new ol.View({

           ...

       });

      

       // 构建map

       var map = new ol.Map({

           controls: ol.control.defaults({

              attribution: false

           }).extend([

              new ol.control.MousePosition(),

              new ScaleControl()

           ]),

           layers: [layer],

           target: 'map',

           view: view

       });

       map.getView().fit([112.49999999999864, 21.943045533437925, 134.99999999999838, 40.97989806961972], map.getSize());

      

       // 设置左上角STYLE

       window.setParam = function(name, value) {

           ...

       }

       // 设置左上角STYLE结束

 

       // 单击地图事件

       map.on('singleclick', function(evt) {

           ...

       });

       // 单击地图事件结束

    }

</script>

删掉上面蓝色的代码部分:

  • 删掉显示坐标
  • 删掉new ol.Mapcontrols属性。
  • 删掉设置左上角STYLE
  • 删掉单击地图事件

使用前面记下的服务地址替换baseUrl:

整个<script>只定义了一个init()函数,但并没有调用。在<script>最后添加:

init();

保存,在浏览器中打开页面即可看到地图。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GeoServer发布地图服务并在OpenLayers中显示:shp的WMS服务和GeoTIFF的WTMS服务 的相关文章

随机推荐

  • Pandas50个高级高频操作

    01 复杂查询 实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据 接下来为大家介绍如何发挥Pandas数据筛选的无限可能 随心所欲地取用数据 1 逻辑运算 Q1成绩大于36df Q1 gt 36 Q1成绩不小于60分 并且是C
  • 构造函数&类属性和实例属性&析构函数

    1 构造函数 概念 构造函数包括 new 和 init 构造函数 也被称为构造器 指的是当创建对象的时候 被自动调用的函数 注意 在Python中 以 xxx 方式命名的函数被称为魔术函数 魔术方法 这类函数在使用的时候无需手动调用 在进行
  • 海得服务器虚拟机,海得PLC远程编程调试流程

    原标题 海得PLC远程编程调试流程 海得PLC远程编程调试流程 1 HINET智能网关LAN口默认IP地址是192 168 1 1 工业智能网关 2 假定PLC的IP地址是192 168 10 2 并且要求不能改变 海得plc 3 将HIN
  • 消息队列:Ubuntu16.04安装和Web页面管理RabbitMQ(楼主亲测、真实有效)

    RabbitMQ 总来来说 RabbitMQ的安装还是有一些难度的 不同的方式 安装的方法也是完全不一样 还要解决蛮多依赖 加上现在有些网站 极其不负责 很多博文都没有经过测试检验就直接发出来的 楼主来亲测一下 希望能对大家有好的帮助 一
  • C++ templates之“模板的模板参数”

    定义 指一个模板 它本身的参数类型就是模板 在英语原文中是 template template parameter 例如 template
  • hdu 5792 World is Exploding 2016 Multi-University 5

    Problem acm hdu edu cn showproblem php pid 5792 题意 给一个序列 V 问有多少个由下标组成的四元组 a b c d 满足 a b c d a lt b c lt d Va lt Vb Vc g
  • 在centos7安装anaconda步骤,亲测。

    在centos7上安装anaconda碰到很多的坑 分享出来 也免得以后自己忘记 第一步 首先anaconda官网下载linux安装包 网址为 https www anaconda com 或者在清华镜像下载 https mirrors t
  • konisGraph学习。复杂查询优化记录

    最近有需求是查两个公司之间的投资关系 比如 a和b之间有哪些直接投资和间接投资 例如 a gt b a gt e gt b a gt c gt d gt b b gt f gt a 需求是查出7跳以内的ab之间的投资关系 v的标签是comp
  • inline内联函数的作用和几点注意

    一 关键字inline必须与函数定义体放在一起才能使函数成为内联 仅将inline放在函数声明前面不起任何作用 二 定义在类声明之中的成员函数将自动地成为内联函数 以上可参考 http blog 163 com jinyongming bl
  • 矩阵求导 两种布局 及常用基础公式

    一 矩阵求导的两种形式 刚开始看矩阵求导这一块的时候发现一模一样的两个公式 在不同地方结果老是不一样 给我看懵了好一阵子 后来才发现原来有两种布局模式 都是可以的 矩阵求导的布局方式有两种 分子布局和分母布局 下面以 小写字母 小写粗体字母
  • stm32晶振配置不一致导致 Invalid Rom Table 至芯片锁死解决方案

    参考博文 Invalid ROM Table原因及解决办法 STM32芯片锁死问题 概述 在调试STM32时 出现如下的现象 软件写好之后首次下载程序至芯片时成功 但程序未能正常运行 之后再下载程序时便报错 Invalid ROM Tabl
  • RPC 服务优雅停机、优雅重启,你的服务重启够优雅吗?

    关注公众号 1024个为什么 及时接收最新推送文章 背景 由于最近上线比较频繁 就遇到了一个小概率的数据不一致的问题 具体过程如下 很明显 是服务没有做到优雅停机 导致的两个服务的数据不一致 优雅停机 优雅重启 本质到底是什么 优雅重启涵盖
  • 【最简单】STM32+ESP8266+MQTT+EMQX完成数据上传和点灯环节

    首先要吐槽一点 那就是网络上的这方面资料杂七杂八 而且很多都是一模一样的 然后我作为一个学生 没有多大的本事 就是想实现最基本的功能 然后在此基础上慢慢拓展 所以那些十分庞大的工程或者一些IoT物联网平台的官方SDK对于我来说是比较难看懂的
  • js、vue、vue3.0、时间格式转换函数

    时间戳转换时间格式 时间戳转任意时间格式 调用方法 gt this getDate 1626137166000 m d H i this getDate 1626137166000 等等 getDate function date form
  • c++ string中的data()和c_str() 区别与联系

    c str 返回的是const char 类型的指针 无法修改指针指向字符串的值 data 有两种版本 一种返回的是const char 类型的指针 此时与上面的c str 用法完全一致 网上有说c str返回的会加上 0 可能不同版本不一
  • 电路基础(2)电阻电路的等效变换

    1 电路的等效变换 两端网络 任何一个复杂的电路 向外引出两个端钮 且从一个端子流入的电流等于从另一端子流出的电流 则称这一电路为二端网络 或一端口网络 两端电路等效 两个两端电路 端口具有相同的电压 电流关系 则称它们是等效的电路 两电路
  • WordPress BuddyPress 存在越权漏洞RCE(CVE-2021-21389)

    一 漏洞描述 BuddyPress 是一个用于构建社区站点的开源 WordPress 插件 在 7 2 1 之前的 5 0 0 版本的 BuddyPress 中 非特权普通用户可以通过利用 REST API 成员端点中的问题来获得管理员权限
  • 错误,调试

    有些也写在了开发工具 xcode中 http article ityran com archives 1143 1 编译iPad真机时 选择了 Architetures Standard armv6 BaseSDK iPhoneDevice
  • 神经网络算法的基本原理,神经网络算法都有哪些

    神经网络算法的三大类分别是 神经网络算法的三大类分别是 1 前馈神经网络 这是实际应用中最常见的神经网络类型 第一层是输入 最后一层是输出 如果有多个隐藏层 我们称之为 深度 神经网络 他们计算出一系列改变样本相似性的变换 各层神经元的活动
  • GeoServer发布地图服务并在OpenLayers中显示:shp的WMS服务和GeoTIFF的WTMS服务

    GeoServer发布的地图服务结构如下 必须创建一个工作区 该工作区下可以存放多组无关数据 也就是说 工作区的作用就类似于一个文件夹 仅仅用于分类 在工作区下添加数据存储 数据存储即一组相关数据 通常 一个地区的地图可能是单个文件构成 也