项目角度谈矢量切片运用以及Geoserver处理自定义规格矢量切片方案
文章版权由作者李晓晖和安科网共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。
1. 背景
矢量切图方案目前已经是很常见的一个方案,在2016年时团队基于Sharpmap开发了支持不同坐标系、不同切图参数、任意矢量数据(点、线、面)的工具。也着手开发了支持矢量切图浏览器前端配图的工具。在当时研究之前,也写过一篇初步研究的文章:WebGIS中矢量切图的初步研究(http://www.cnblogs.com/naaoveGIS/p/4982549.html)。
2.实际项目中的问题
但是回过头看这两年的运用场景,着实很少。究其原因大致几个方面:
a.大数据量情况下,基于要素绘制的矢量切片虽然在前端可以实现更好的交互效果,但是项目中由于矢量数据量级往往达不到,完全可以直接处理为一个文本一次性加载于前端展示。
b.即使大数据量情况下,基于WMS或者WMTS以图片形式展示要素也是基本方案。对于交互,虽然会多一次后台查询,但是项目产品往往没有互联网产品的极致交互要求。
c.矢量切图的实施比较耗时,需要对图层要素分别切图、分别设置样式,实施成本太大。而基于arcmap等工具统一配图再一次性切图,实施效率会大大提高。虽然各图层样式我们可以设置默认样式,但是难免遇到各种新增或修改。而且由于工具需要提前分别切好各矢量图层,非常耗时。
d.矢量切片的更新问题。同样由于我们对数据需要提前切片缓存,导致数据更新后,又得重新切片,没法做到实时。
3.解决思路
在项目的实际运用中,我们最需要解决的是瓦片预处理导致的切图耗时和无法实时更新问题。只有实施问题解决了,才能更好的推动在大数据量情况下使用矢量切片。
回到2016年,当时已经预研到Geoserver和一些开源工具可以支持矢量切片,但是为什么最后还是选择自己开发工具了呢?
a.当时Geoserver最新的版本是2.8,矢量切片支持的不是很好,面的切片上边界会不重合。
b.开源工具TileStache,不仅仅是安装不方便,而且只支持了WGS84坐标系(包含墨卡托投影)。
所以只好让团队专人着手开发了矢量切片工具。
再回到现在2018年,Geoserver已经出到了2.12版本,矢量切片的面处理问题已经解决。所以目前采用Geoserver方案是更为便捷的方案,它可以很好的解决上面提到的实施问题和更新问题。
a.可以通过udig等提前配置好图层的样式,形成模板,方便部署配置样式。
b.Geoserver可以在Geowebcache中配置好对矢量切片格式的支持,并且可以分别设置是否预处理,或者实时切片。这样,减少工程实施时需要预处理的耗时。
c.数据的更新问题,可以通过设置缓存的时效性进行控制,避免之前重新切图。
4.GeoWebCache的进一步介绍
同样,在很早之前的一篇文章中,我对GeoWebCache做了一个预研:利用GeoWebCache实现WebGIS地形图展示的缓存优化(http://www.cnblogs.com/naaoveGIS/p/4195008.html)。这里,我做进一步补充。
a.下载对应插件。

注意安装时,tomcat得是8系列。如果本地已经装有jdk1.7,则需要再装一个jdk1.8,然后在tomcat8的bin目录下的setclasspath.bat文件中,直接写定jdk的指向路径:

b.官网地址:http://geowebcache.org/docs/current/concepts/index.html
c.GeoWebCache的导航页包含功能:


点击TMS(Tile Map Server),可以查看服务列表:
d.预览功能

e.切图功能
点击seed this layer。

f.查看正在切图的进程

5.Geoserver发布自定义规格矢量切片步骤
5.1增加自定义GridSets
5.1.1创建GridSets

默认的GridSet中只包含了4326和900913坐标系。点击,create gridsets,我们以2379坐标系来示例。
5.1.2各参数配置

a.通过查找选定坐标系。
b.填写瓦片大小。
c.切图比例尺。这里提供两种填写方式,以分辨率填写,或以比例尺填写。
5.1.3切图范围配置
这个配置十分重要,在我们切图中,有原点这个概念,而gridsets中我们没有发现与切图原点有关的配置项。而其实,这个切图范围,我们便可以将其视作原点配置。
假设此时原点为:-5123200,10002100。
我们便将切图范围设置为:

5.1.4Geoserver中产生的配置文件
在Geoserver的GWC文件夹中,我们可以看见保存gridsets后生成的对应配置文件:

5.2图层关联上gridsets
最后,我们点击图层栏,选择tilecaching
5.2.1选择切图格式
当安装了矢量切图插件后,在切图格式上便可以选择矢量切片相关格式。目前插件提供的矢量切片有三种格式:geojson、topojson、pbf。Geojson可读性高,topojson比前者小一些,但是不可读。而pbf格式压缩性更好,同样也不可读。Pbf在插件中为type=mapbox-vector,格式为x-protobuf。意思是,其数据组织采用的mapbox提供的mvt格式,该格式对地图不同级别下的要素会采用道格拉斯-普克算法进行抽稀,然后再以谷歌提供的pbf格式进行存储。所以,pbf压缩性更好,但是同样是不可读的。

5.2.2添加切图参数
把我们设置好的gridsets加入,并选定好需要切图的级别。

5.2.3其他参数
5.2.3.1Metatiling factors

我们向GWC发布的范围请求,会被以该设置切割成多个小瓦片。这个方案可以提高瓦片的命中率,但是也会导致瓦片过多等问题。
5.2.3.2缓存时效

5.2.3.3瓦片间隙

6.OL加载矢量切片服务
6.1代码编写

其中,TILEMATRIXSET对应我们设置的GRIDSETS名称,而TILEMATRIX对应各个级别时的切片级别名称。
6.2效果展示

7.遗留问题
虽然目前已经展示出矢量切片,但是其切片又明显位移:

如果我们是基于已有的4326或者900913坐标系,则不会有这个问题。但是基于自定义坐标系和切图参数时便发生了偏移。
如果只谈解决思路:因为是线性偏移,我们可以代码中对不同级别设置不同的切图原点。但是这是非常不科学的。
个人推测,这可能与DPI有关系,及每英寸的像素数有关系。我们的地图是ArcGIS发布,其切图参数使用的DPI是96,换算出来的屏幕一像素所代表的实际地理位置为:
1英寸=2.54厘米
1英寸=96像素
那么屏幕的一像素具有(2.54/96=2.6458E-4)厘米/像素。
但是,我们Geoserver中默认的是:

将该配置修改后,重启Geoserver,偏移问题依然存在。
不知道各位读者遇到过该问题否,是否有其他解决思路。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^
