项目角度谈矢量切片运用以及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/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

项目角度谈矢量切片运用以及Geoserver处理自定义规格矢量切片方案的更多相关文章
- 矢量切片应用中geoserver与geowebcache分布式部署方案
在进行GIS项目开发中,常使用Geoserver作为开源的地图服务器,Geoserver是一个JavaEE项目,常通过Tomcat进行部署.而GeoWebCache是一个采用Java实现用于缓存WMS ...
- GIS技术在医疗行业的应用:利用切片地图发布技术解决dmetrix数字病理切片在线浏览
最近一直在研究切片地图发布技术,解决各种矢量和栅格数据的切片地图制作和发布问题.这块的技术在土地评估和调查类公司中应用较多,因为他们经常需要使用各地地图,传统的文件管理方式很难适应工作现状,如果将各种 ...
- Python进阶:自定义对象实现切片功能
2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇.合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动.原系列的单篇就不删除了,毕竟也是 ...
- VS Code项目中共享自定义的代码片段方案
VS Code项目中共享自定义的代码片段方案 一.问题背景 项目中注释风格不统一,如何统一注释风格 一些第三方组件库名称太长,每次使用都需要找文档,然后复制粘贴 部分组件库有自己的Snippets插件 ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:4、默认安全认证与自定义安全认证。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- 由项目浅谈JS中MVVM模式
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1. 背景 最近项目原因使用了durandal.js和knock ...
- [SSH 3]以网上商城项目浅谈spring配置
导读:在做ITOO项目的时候,就用到了容器+反射,从而运用了依赖注入和依赖查找.如果看过WCF端的配置文件,那么对于这个spring的配置就很容易理解.本篇博客,是对于自己做的一个小项目中所运用到的s ...
- 从市场运营角度谈Uber中国的第一批用户是怎么来的
声明:这篇文章是从http://www.010lm.com/redian/2016/0312/1206875.html转来的,分享给大家. 1)首先告诉用户Uber是做什么的?即培养用户品牌意识. 我 ...
- js架构设计模式——由项目浅谈JS中MVVM模式
1. 背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...
随机推荐
- <url-pattern>/</url-pattern>和<url-pattern>/*</url-pattern>区别
<url-pattern>/</url-pattern>表示的为只匹配/login和/demo后面不带.xxx的网页 <url-pattern>/*</url ...
- yii pageTitle与Yii::app()->name的区别
我们会在main中修改: 'name'=>'傻逼管理系统', 在视图页中:Yii::app()->name时,会输出 傻逼管理系统:可是当我们用$this->pageTitle时 ...
- 买帽子 (hash)
思路:表示数字i出现的次数,在输入的同时记录每个数字出现的次数.最后从0枚举到1000判断第三个是否存在,存在则记录该数字. #include <stdio.h> #include < ...
- Spring 框架系列之 JDBC 整合实例
微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.Spring框架整合 DAO 模板 JDBC:org.springframework.jdb ...
- [HNOI2014]道路堵塞
题目描述 A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有从城市1到城市N ...
- 如何更改Ubuntu的root密码
安装Ubuntu系统时,只提示了设定用户密码,该密码可用于普通用户暂时获取root的权限,执行一些需要root权限的操作,而没有要求我们设置root密码,在需要用到root密码时,却想不起来,很尴尬啊 ...
- SDVO-DVI-I2C-register
关于DVI视频输出口,微软搞了个SDVO用来保护: #define SDVO_OUTPUT_FIRST (0) #define SDVO_OUTPUT_TMDS0 (1 << 0) ...
- Android 插件化方案(动态加载)总结
1.作用 大多数Android开发人员开始接触这个问题是因为 App 爆棚了,方法数超过了一个 Dex 最大方法数 65535 的上限,因而便有了插件化的概念,将一个 App 划分为多个插件(Apk ...
- RGMII,MII,GMI接口
简介 RGMII(Reduced Gigabit Media Independent Interface)是Reduced GMII(吉比特介质独立接口).GMII和RGMII均采用8位数据接口,工作 ...
- Error:Error #2174
1.错误描述 Error:Error #2174 : 对于每个FileReference,每次只能执行一个下载.上载.加载或保存操作 2.错误原因 Flex中,在做单文件上传时,多次点击"上 ...