文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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处理自定义规格矢量切片方案的更多相关文章

  1. 矢量切片应用中geoserver与geowebcache分布式部署方案

    在进行GIS项目开发中,常使用Geoserver作为开源的地图服务器,Geoserver是一个JavaEE项目,常通过Tomcat进行部署.而GeoWebCache是一个采用Java实现用于缓存WMS ...

  2. GIS技术在医疗行业的应用:利用切片地图发布技术解决dmetrix数字病理切片在线浏览

    最近一直在研究切片地图发布技术,解决各种矢量和栅格数据的切片地图制作和发布问题.这块的技术在土地评估和调查类公司中应用较多,因为他们经常需要使用各地地图,传统的文件管理方式很难适应工作现状,如果将各种 ...

  3. Python进阶:自定义对象实现切片功能

    2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇.合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动.原系列的单篇就不删除了,毕竟也是 ...

  4. VS Code项目中共享自定义的代码片段方案

    VS Code项目中共享自定义的代码片段方案 一.问题背景 项目中注释风格不统一,如何统一注释风格 一些第三方组件库名称太长,每次使用都需要找文档,然后复制粘贴 部分组件库有自己的Snippets插件 ...

  5. Taurus.MVC 微服务框架 入门开发教程:项目集成:4、默认安全认证与自定义安全认证。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  6. 由项目浅谈JS中MVVM模式

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.    背景 最近项目原因使用了durandal.js和knock ...

  7. [SSH 3]以网上商城项目浅谈spring配置

    导读:在做ITOO项目的时候,就用到了容器+反射,从而运用了依赖注入和依赖查找.如果看过WCF端的配置文件,那么对于这个spring的配置就很容易理解.本篇博客,是对于自己做的一个小项目中所运用到的s ...

  8. 从市场运营角度谈Uber中国的第一批用户是怎么来的

    声明:这篇文章是从http://www.010lm.com/redian/2016/0312/1206875.html转来的,分享给大家. 1)首先告诉用户Uber是做什么的?即培养用户品牌意识. 我 ...

  9. js架构设计模式——由项目浅谈JS中MVVM模式

    1.    背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...

随机推荐

  1. 本地Git搭建并与Github连接

    本地Git搭建并与Github连接 git 小结 1.ubuntu下安装git环境 ubuntu 16.04已经自带git ,可以通过下列命令进行安装与检测是否成功安装 sudo apt-get in ...

  2. bzoj 1171 大sz的游戏& 2892 强袭作战 (线段树+单调队列+永久性flag)

    大sz的游戏 Time Limit: 50 Sec  Memory Limit: 357 MBSubmit: 536  Solved: 143[Submit][Status][Discuss] Des ...

  3. Java反射获取字节码以及判断类型

    一.获取类的字节码的三种方法: 1.使用Class.class   Class<?> c1=String.class; 2.使用实例.getClass()   String s= Clas ...

  4. iOS微信内存监控

    WeTest 导读 目前iOS主流的内存监控工具是Instruments的Allocations,但只能用于开发阶段.本文介绍如何实现离线化的内存监控工具,用于App上线后发现内存问题. FOOM(F ...

  5. C语言_结构体变量指针做函数参数的使用案例

    # include <stdio.h> # include <stdlib.h> # include <string.h> # include <malloc ...

  6. R语言-时间序列

    时间序列:可以用来预测未来的参数, 1.生成时间序列对象 sales <- c(18, 33, 41, 7, 34, 35, 24, 25, 24, 21, 25, 20, 22, 31, 40 ...

  7. C++中结构体与类的区别(struct与class的区别)

    转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据 ...

  8. HDP2.0.6+hadoop2.2.0+eclipse(windows和linux下)调试环境搭建

    花了好几天,搭建好windows和linux下连接HDP集群的调试环境,在此记录一下 hadoop2.2.0的版本比hadoop0.x和hadoop1.x结构变化很大,没有eclipse-hadoop ...

  9. MySQL参数log_bin_trust_function_creators介绍

    MySQL的有个参数log_bin_trust_function_creators,官方文档对这个参数的介绍.解释如下所示: log_bin_trust_function_creators Comma ...

  10. dojo中取查询出来的地市维表数据的id

    1.页面中引入隐藏域 <input type="hidden" id="area_desc"/> 2.通过在属性中设置 onchange:funct ...