文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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. 用Eclipse Maven 创建 Web 3.0 项目问题 正确的处理步骤

    在Eclipse 安装好Maven插件后,创建Maven webapp项目,在工程 properties -> project facets 界面中将 Dynamic Web Module 修改 ...

  2. 2.数码相框-编码(ASCII/GB2312/Unicode)介绍,并使LCD显示汉字字符(2)

    在上章-学习了数码相框的框架分析(1)了 本章主要内容如下: 1)熟悉ASCII/GB2312/Unicode编码 2)写应用程序,使LCD显示汉字和字符 大家都知道,数据传输的是二进制,而字符和汉字 ...

  3. Spark DataFrame写入HBase的常用方式

    Spark是目前最流行的分布式计算框架,而HBase则是在HDFS之上的列式分布式存储引擎,基于Spark做离线或者实时计算,数据结果保存在HBase中是目前很流行的做法.例如用户画像.单品画像.推荐 ...

  4. 去掉chrome浏览器中input获得焦点时的带颜色边框呢

    可以设置表单控件的outline属性为none值, 来去掉Chrome浏览器中输入框以及其它表单控件获得焦点时的带颜色边框. css代码如下: input{outline:none}

  5. java线程优先级

    java的线程优先级分为1-10 这10个等级 1为最强,最优先 10为最弱 如果大于10或者小于1则会抛异常 源代码为: public final void setPriority(int newP ...

  6. spring-boo hello world程序

    作为一个程序猿,使用了spring好多年,现在有了spring-boot,也想尝尝鲜. 初听spring-boot,觉得很神秘,实际上就是集合了很多组件,再加上一些boot开发的启动和粘合程序. 个人 ...

  7. CodeForces-747A

    从sqrt(n)枚举到1,一旦满足一定是差最小的数. AC代码: #include<cstdio> #include<cmath> int main(){ int n; whi ...

  8. keepalived双机热备nginx

    nginx目前是我最常用的反向代理服务,线上环境为了能更好的应对突发情况,一般会使用keepalived双机热备nginx或者使用docker跑nginx集群,keepalived是比较传统的方式,虽 ...

  9. ubuntu14.04 安装redis 2.8.9

    ubuntu14.04安装前准备工作,为了保证安装顺利,请先执行apt-get update 然后安装make 和gcc(已安装的可忽略) apt-get install make apt-get i ...

  10. 决策树学习笔记(Decision Tree)

    什么是决策树? 决策树是一种基本的分类与回归方法.其主要有点事模型具有可得性,分类速度快.学习时,利用训练数据,根据损失函数最小化原则建立决策树模型:预测时,对新数据,利用决策树模型进行分类. 决策树 ...