项目角度谈矢量切片运用以及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+标签库,算是很 ...
随机推荐
- yii2自带的backend,frontend不够用,添加一个后台模块怎么做?
在复杂项目里,高级模板中的fontend.backend application明显不够,可以再添加另外的application. 例如添加一个seller application .步骤如下: 1, ...
- elasticsearch red status fix 红色状态修复
问题描述: spring cloud项目有用到elasticsearch,启动时进行健康校验,发现es一直是down的,导致在eureka显示也是down 问题定位:查看actuator源码发现,如果 ...
- 情景linux--如何优雅地退出telnet
情景linux--在脚本中如何优雅地退出telnet 情景 telnet命令是TELNET协议的用户接口,它支持两种模式:命令模式和会话模式.虽然telnet支持许多命令,但大部分情况下,我们只是使用 ...
- JS分号 惹的坑
JS中会自动清除句子和句子之间的空格以及tab缩进, 这样就可以允许用户编写的代码更加随性和更加可读, 在该行代码解析的时候如果该行代码可以解析, 就会在该行代码最后自动填写分号,如果该行代码无法解析 ...
- C语言结构体定义的几种方法
什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...
- 解决Sublime text 3 中文文件名显示方框
在sublime text 3中,Preference, Settings-User,最后加上一行 "dpi_scale": 1.0 覆盖操作系统设置的DPI. 这是我的Setti ...
- Java Web项目(Extjs)报错七
1.Java Web项目(Extjs)报错七 具体报错如下:
- Java之Iterator
Java之Iterator 1.实例源码 /** * @Title:IteratorJava.java * @Package:com.you.model * @Description:Iterator ...
- DOS批处理命令递归删除给定的文件(夹),兼VC工程清理小工具
使用dos批处理命令递归删除指定的文件(夹): (下面内容针对清理VC工程!自己按说明任意修改) 2014-06-10修改:删除前增加了[y,n]询问: echo off rem 递归删除当前文件下指 ...
- C#数据缓存介绍及Caching通用帮助类整理
C#缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 以下为 ...