云游屋
扫描关注云游屋

云游屋

GeoServer:地图服务与GeoWebCache缓存优化

云游屋2024-05-07地图开发 236

空间数据服务规范


    1. WMS(Web Map Service)

    WMS利用具有地理空间位置信息的数据制作地图,能够根据用户的请求返回相应的地图(包括PNG,GIF,JPEG等栅格形式或者是SVG和WEB CGM等矢量形式)。这个规范有三个常用操作:GetCapabitities 返回服务级元数据,

它是对服务信息内容和要求参数的一种XML描述; GetMap 返回一个地图影像,其地理空间参考和大小参数是明确定义了的;GetFeatureInfo 返回显示在地图上的某些特殊要素的信息。

除此之外,还有一些可选操作:DescribeLayer、GetLegendGraphic 和 GetStyles等,如我们可以设计一个样式文件(.sld)并提交到geoserver,将其作为图层的默认样式,当我们请求WMS服务时,

将用该样式对图层进行渲染 [教程] (创建样式文件通常可以使用QGIS、udig等) [ udig创建样式文件 ] [使用qgis生成SLD样式]



    通过构建不同的URL,我们可以请求不同的操作。


// GetCapabilities(返回服务级元数据):返回一个 XML 文件

http://localhost:8081/geoserver/wms?service=WMS&version=1.1.1&request=GetCapabilities

 

// GetMap(获取影像):返回文件格式有PNG、PNG8、JPEG、GIF、TIFF 和 TIFF8 等

http://localhost:8081/geoserver/urbanlayer/wms?LAYERS=urbanlayer:DIJI&STYLES=&FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap

&SRS=EPSG:3857&BBOX=10008053.503544,5274522.8578226,10039584.01305,5292493.614536&WIDTH=579&HEIGHT=330

 

// GetFeatureInfo(返回要素信息):返回文件格式有TEXT、GML2、GML3、HTML、JSON 和 JSONP 等

http://localhost:8081/geoserver/urbanlayer/wms?REQUEST=GetFeatureInfo&EXCEPTIONS=application/vnd.ogc.se_xml&BBOX=10008053.503544,5274522.857823,10039584.01305,5292493.614536

&SERVICE=WMS&INFO_FORMAT=text/plain&QUERY_LAYERS=urbanlayer:DIJI&FEATURE_COUNT=50&Layers=urbanlayer:DIJI&WIDTH=579&HEIGHT=330&format=image/png&styles=&srs=EPSG:3857&version=1.1.1&x=315&y=147

    操作需要的URL参数说明参阅大佬的博客:李晓晖 - 博客园   [GeoServer中WMS、WFS的请求规范]


  ## GetCapabitities 参数


  ## GetMap 参数


  ## GetFeatureInfo 参数


    2. WFS(Web Feature Service)

    WFS 支持用户在分布式的环境下通过HTTP对地理要素进行插入,更新,删除,检索和发现服务。该服务根据HTTP客户请求返回要素级的GML(Geography Markup Language、地理标识语言)数据,并提供对要素的增加、修改、删除等事务操作,

是对Web地图服务的进一步深入。这个规范有三个常用操作:GetCapabilites 返回Web要素服务性能描述文档(用XML描述);DescribeFeatureType 返回描述可以提供服务的任何要素结构的XML文档;GetFeature 为一个获取要素实例的请求提供服务。

除此之外,还有一些操作如:Transaction 为事务请求提供服务;LockFeature 处理在一个事务期间对一个或多个要素类型实例上锁的请求等。


// GetCapabilities(返回服务描述文档):返回一个 XML 文件

http://localhost:8081/geoserver/wfs?service=wfs&version=1.1.0&request=GetCapabilities

 

// DescribeFeatureType(返回图层描述信息)

http://localhost:8081/geoserver/urbanlayer/ows?service=wfs&version=1.0.0&request=DescribeFeatureType&typeName=DIJI

 

// GetFeature(获取图层要素)

http://192.168.101.14/geoserver/urbanlayer/wfs?request=GetFeature&version=1.1.0&typename=jianfudanhistory&Filter=<Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml">

<Intersects> <PropertyName>the_geom</PropertyName> <gml:Envelope srsName="EPSG:4326">  <gml:lowerCorner>120.1762573834964 30.280899047851562</gml:lowerCorner>   

<gml:upperCorner>120.18999029365265 30.294631958007812</gml:upperCorner> </gml:Envelope></Intersects></Filter>&outputformat=json

    操作需要的URL参数说明同样参阅大佬的博客:李晓晖 - 博客园  [GeoServer中WMS、WFS的请求规范]


    其他:GeoServer通过WFS对feature实现增删改查


    3. WCS(Web Coverage Service)

    网络覆盖服务是面向空间影像数据,它将包含地理位置的地理空间数据作为 “栅格Coverage” 在网上相互交换,如卫星影像、数字高程数据等栅格数据。


    WCS提供如下操作:


GetCapabitities:返回服务级元数据,它是对服务信息内容和要求参数的一种描述。

DescribeCoverage:支持用户从特定WCS服务器获取一个或多个覆盖的详细的描述文档。

GetCoverage:可根据查询要求返回一个包含或者引用被请求的覆盖数据的响应文档。



    4. TMS(Tile Map Service)

    切片地图服务(TMS)定义了一些操作,这些操作允许用户访问切片地图。


    5. WMTS(Web Map Tile Service)

    WMTS,即Web地图瓦片服务(Web Map Tile Service),由OGC(开放地理信息联盟)制定。根据WMTS标准,可以使我们轻松的访问瓦片数据。WMTS提供了一种采用预定义图块方法发布数字地图服务的标准化解决方案,

它最重要的特征是采用瓦片缓存技术缓解WebGIS服务器端数据处理的压力,提高前后端交互响应速度。


    WMTS支持RESTful访问,其操作包括:


GetCapabilities :获取服务元数据,元数据描述该服务的功能和包含的信息

GetTile:获取地图瓦片

GetFeatureInfo:通过在WMTS图层上指定一定的条件,返回指定的地图瓦片内容对应的要素信息

    操作需要的URL参数说明参阅大佬的博客:OpenLayers教程:多源数据加载之WMTS_不睡觉的怪叔叔的博客-CSDN博客

文档解析


图源: WMTS服务初步理解与读取_SuperMap技术控-CSDN博客_wmts地图服务

区分服务

  # WMS 与 WFS


    WMS是由服务器将地图图像发送给客户端,而WFS是服务器将矢量数据发送给客户端。也就是在使用WMS时地图由服务器绘制,在使用WFS时地图由客户端绘制。另外最最重要的,使用WFS可以对WebGIS服务器中的地理数据(存储在空间数据库中)

直接进行增、删、改、查。[来源]


  # WMS 与 WMTS


    👉 摘录自 五分钟学GIS | WMTS服务初步理解与读取


    WMTS服务和WMS服务对客户端请求服务的响应不同,比如在接受客户端请求WMTS服务时,返回给客户端是固定大小的瓦片,客户端根据索引号来获取每一张瓦片,而后拼接成地图进行展示,如图1所示;由于瓦片的规则是固定的,

服务端可以预先缓存对应的瓦片,客户端需要时直接返回即可,因而WMTS是可缓存的。

    而当客户端请求WMS服务时,返回给客户端是一张完整的图片,客户端取到直接展示,如图2所示;客户端可以请求任意区域,正由于这个任意性和服务端只能返回一张指定范围的图片,复用的概率低之又低,当并发增大,

服务端性能就随之大大下降,故WMS仅是重在灵活性。

   互联网时代重在效率,对比于灵活性,大家更喜欢选用可缓存的性能更优的WMTS服务。



参考资源

    WMS 与 WFS:[ 链接1 ]  [ 链接2 ]   


    WMS WFS WCS TMS:[ 链接1 ]     


    WMTS:[ 链接1 ]


QGIS连接地图服务

# GeoServer


   当我们在GeoServer发布地图服务后,可以用QGIS连接geoserver服务(无需填写用户名、密码,在连接前确保GeoServer能连接的上



# ESRI / OSM / 天地图 / 高德



天地图矢量图层 https://t6.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=密钥

天地图矢量注记 https://t6.tianditu.gov.cn/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=密钥

高德影像 https://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}

高德矢量 http://wprd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}

高德路网 https://wprd01.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=2&style=8<ype=11

Esri Dark Gray   http://server.arcgisonline.com/arcgis/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}

OpenStreetMap  https://tile.openstreetmap.org/{z}/{x}/{y}.png


ArcGIS连接地图服务

  注:直接使用天地图服务地址是不行的,需要改动一下,加上esri,如 http://t0.tianditu.gov.cn/img_c/esri/wmts?tk=服务端密钥


GeoWebCache

    GeoWebCache(GWC)是一个采用Java实现用于缓存WMS(Web Map Service)Tile的开源项目。当地图客户端请求一张新地图和Tile时,GeoWebCache将拦截这些调用然后返回缓存过的Tiles。

如果找不到缓存再调用服务器上的Tiles,从而提高地图展示的速度。实现更好的用户体验。


    GWC支持多种请求,比如WMS、WMS-C、WMTS、TMS,以及Googl Maps KML 和 Virtual Earth等。


    GeoServer创建缓存的方式有两种,1️⃣ 当用户查看地图时创建浏览的地图范围及相应等级下的部分缓存,主要优点是,它不需要预处理,并且仅缓存已请求的数据,因此也可节省磁盘空间。该方法的缺点是地图查看只会间歇性地加速,

从而降低了用户体验的质量; 2️⃣ 通过Seed创建,缺点是Seed可能是非常耗时和磁盘消耗的过程。


   生成瓦片缓存(一)

    以之前发布的天河路网为例 [ 点击此处跳转 ] ,选择了以application/vnd.mapbox-vector-tile(即矢量瓦片)发布。发布成功后,我们可以看到【geoserver安装目录下 / data_dir / gwc /】目录下新建了一个名为 cite_tianhe 的空文件夹



    当我们使用 leaflet 成功调用该 TMS 服务时 [代码], 我们可以看见目录下有了新文件



     注:pbf文件信息解析


    若是基于Tomcat部署的GeoServer配置GeoWebCache,在浏览器里进入http://localhost:8080/geoserver/gwc ,拉到下面可以看到该路径 



   可以进入./tomcat8/webapps/geoserver/WEB-INF/下的web.xml,添加如下代码对配置进行修改:


<context-param>

        <param-name>GEOWEBCACHE_CACHE_DIR</param-name>

        <param-value>/home/用户名/tomcat8/webapps/geoserver/data/gwc/</param-value>

</context-param>

   生成瓦片缓存(二)

    启动 geoserver 后,进入 http://localhost:8081/geoserver/gwc/ (端口根据自己情况修改



    点击 list 选项,可以看到能够切图的图层:   



    还是用发布的天河路网为例,点击 Seed this layer 



     填写表单进行预切片,即事先进行切片(在点击 Submit 前,为了展示这两种操作的作用,我把 cite_tianhe 文件夹清空了



    切片完成后,我们再来看看 cite_tianhe 文件夹



    可以看出,两种最终效果是一样的(格式不同是因为切片时选择了 image/png



     当我们的数据很大,加载要费很多时间时,我们就该事先进行瓦片切图,这样当客户端用户调用时,就能加快数据加载速度,提高用户体验感,而如果我们只是较小的数据,就可以通过构建URL来自动开启瓦片缓存服务。

为什么这样能实现瓦片缓存呢?原因就在于URL中加上 gwc / service。



其它

    👉 摘录自 GeoWebCache参数之pixelSize(像素大小)


    在 WMS 图层参数中有 bbox、height 和 width 这三个参数可唯一确定所请求的地理视图范围与缩放级别。bbox 指可视的地理范围,由4个边界值可确定中心点,而 bbox 的宽度(实地距离)除以 width(图片距离)即是 Resolution(分辨率)。

但是没有 PPI,是不能确定 Scale (比例尺)的。换句话说,由 Resolution、Center、Width、Height 可唯一确定可视范围,但 Sclae无法确定。


    所以如果之前在定义Gridset中你采用的是分辨率(resolutions),那么这个参数没有什么影响,如果你用的是比例尺(scaleDenominators),那么就要认真对待pixelSize这个参数了,从官方问当中可以看出,可选参数pixe size所对应的默认DPI为90.71428571428572,

但现在的电脑默认的DPI为96,这就使得从GWC传入客户端的图片被缩小了,这样字体也与之变小。所以在Gridset中将pixeSize改为0.26458mm/pixel ,问题解决。


    👉 geoserver矢量瓦片发服务前端展示偏移问题解决


    👉 切图效果失真问题


    👉 独立部署GeoWebCache


结语

    特别鸣谢大佬李晓晖,通过对他的博文(利用GeoWebCache实现WebGIS地形图展示的缓存优化 - 李晓晖 - 博客园)学习后对WebGIS有了更进一步的认识。

————————————————



发表评论