在进行GIS项目开发中,常使用Geoserver作为开源的地图服务器,Geoserver是一个JavaEE项目,常通过Tomcat进行部署。而GeoWebCache是一个采用Java实现用于缓存WMS-Tile(瓦片)的开源项目。当客户端请求一张新地图和Tile时,GeoWebCache将拦截这些调用然后返回缓存过的Tiles。如果找不到缓存再调用服务器上的Tiles,从而提高地图展示的速度。最新版本的GeoServer已经完成了GeoWebCache的内嵌。

然而,在实际的生产环境中,地图缓存服务器应当是独立部署的结点,这样的优势是可以避免集群结点开启缓存配额后的文件锁冲突;另一方面,缓存切片及耗费CPU内存等资源,配置独立的地图缓存服务器可减少切片请求对地图服务器资源的占用。

由于矢量切片(vector tile)的流行,越来越多的主流地图网站都采取了矢量切片地图的设计方案,其中mapbox基于prototype提出的mvt格式的矢量切片方案收到了较为广泛地的认可。在服务器端,能够完成矢量切片本地发布、调用的方式目前大致有三种:

(1)    ArcGIS系列,在ArcGIS10.5PRO等最新版本中已经支持了矢量切片的发布,但其是商业软件,非开源,在实际项目研发使用相对困难。

(2)    Mapbox studio支持本地数据的上传和发布,但其处理速度很慢,且许多地理数据涉密或体量较大,不适合采取这种方式。

(3)    GeoServer2.11版本以后,安装矢量切片插件geoserver-2.11-SNAPSHOT-vectortiles-plugin便可以完成矢量切片的制作与发布。这种方式纯开源,相对实用性较高,本文主要针对这一方案进行探讨。

采取GeoServer作为矢量切片的服务器使用简单方便,利用内置的GeoWebCache可以将矢量切片完成类似栅格瓦片(png/jpeg)的本地化缓存,以提升地图服务的传输效率。但在实际项目研发过程中发现,使用内置的GeoWebCache进行矢量切片预缓存将耗费较大的CPU和内存等资源,影响geoserver服务器的运行效率,因此需要将GeoServer与GeoWebCache进行分布部署。目前网络上对这方面的研究主要停留在将GeoWebCache作为栅格瓦片缓存服务器的独立部署,没有对其在矢量瓦片方面的应用进行说明。

1.GeoServer部分

矢量瓦片地图服务的发布依旧在安装了GeoServer的服务器中完成,其发布过程与正常发布过程无差异。虽然新版本中依旧会内嵌GeoWebCache,但这里我们仅仅是发布服务,实际调用中并不使用内嵌的GeoWebCache进行矢量瓦片的缓存。

2.GeoWebCache部分

这里将GeoWebCache安装在与上述分离的另一台服务器中,将其安装在Tomcat的Webapps中即可。安装好后,在webapps中打开geowebcache/WEB-INF/web.xml,在其中完成缓存文件地址的配置。值得注意的是,网上的教程均采取添加一个<context-param>的方式完成缓存地址配置,但笔者在实际测试中发现,不能随意进行缓存地址的添加,其默认地址为C:\Users\Administrator\AppData\Local\Temp\geowebcache。因此,只可以在这个文件夹或者其子文件夹中进行设置,作为缓存文件地址。

修改好web.xml文件的配置后,重启tomcat,在上述缓存文件地址中就可以发现geowebcache.xml这个文件了。geowebcache.xml用于地图服务拦截与缓存的设置,在其中的<layers>标签中添加:

<wmsLayer>

      <!--地图名称,这个会在前端调用的时候中用到-->

      <name>vectorTile:BJ_LN</name>

      <!--图片格式,要与geoserver发布服务时所选的格式保持一致-->

      <mimeFormats>

           <string>image/jpeg</string>

                       <string>image/png</string>

                       <string>application/x-protobuf;type=mapbox-vector</string>

                       <string>application/json;type=geojson</string>

      </mimeFormats>

      <!--使用的瓦片格网坐标系,这里也要与geoserver发布服务时所选坐标系保持一致-->

      <gridSubsets>

               <gridSubset>

         <gridSetName>EPSG:4326</gridSetName>

        </gridSubset>

        <gridSubset>

         <gridSetName>EPSG:900913</gridSetName>      

        </gridSubset>

      </gridSubsets>

      <!--wms服务地址,其中vectorTile为geoserver地图服务的工作空间-->

      <wmsUrl>

           <string>http://10.5.201.111:8090/geoserver/vectorTile/wms?service=WMS</string>

      </wmsUrl>

      <wmsLayers>vectorTile:BJ_LN</wmsLayers>

</wmsLayer>

3.WEB前端调用部分

支持矢量切片地图服务的前端框架很多,这里笔者主要介绍利用openlayers3和mapbox-gl两种前端框架对上述发布的服务进行调用的方式。

(1)   OL3:(目前支持EPSG:4326/ EPSG:900913两种投影方式的geoserver服务)

var lyr ="vectorTile:BJ_LN";

var vector = newol.layer.VectorTile({ 

                       // 矢量切片的数据源 

                       source: new ol.source.VectorTile({ 

                                   projection: projection4326, 

                                   format: new ol.format.MVT(), 

                                   tileGrid:ol.tilegrid.createXYZ({ 

                                               extent:ol.proj.get('EPSG:4326').getExtent(), 

                                               maxZoom: 19 

                                   }),   

                                   // 矢量切片服务地址 

                                   tileUrlFunction:function(tileCoord){ 

                                               return 'http://10.5.201.29:8080/geowebcache/service/tms/1.0.0/' 

                                                          +lyr+'@EPSG%3A4326@pbf/'+(tileCoord[0]-1) 

                                                          +'/'+tileCoord[1] + '/' + (Math.pow(2,tileCoord[0]-1)+tileCoord[2]) +'.pbf'; 

                                   }            

                       })

            });

(2)   mapbox-gl:(目前仅支持EPSG:900913一种投影方式的geoserver服务)

"sources":{ 

      "composite": { 

           "url":"mapbox://mapbox.mapbox-streets-v5", 

           "type":"vector" 

      }, 

      "os": { 

           "type":"vector", 

           "scheme": "tms", 

           "tiles": [ 

        "http://10.5.201.29:8080/geowebcache/service/tms/1.0.0/vectorTile:BJ_LN@EPSG:900913@pbf/{z}/{x}/{y}.pbf"

 ] 

       }, 

},

4.geoserver和geowebcache的CORS跨域问题处理

在前端初次调用矢量切片地图服务时,多会报错:“已阻止跨源请求:同源策略禁止读取位于 http://xxx.xxx.com 的远程资源。(原因:CORS 头缺少 ‘Access-Control-Allow-Origin‘)”

这里需要我们对服务器的Tomcat以及geoserver和geowebcache进行CORS(跨域资源共享)配置,具体操作见http://www.bubuko.com/infodetail-2041942.html.上述文章仅仅介绍了geoserver的CORS配置,参照其方式可以对geowebcache进行配置。

矢量切片应用中geoserver与geowebcache分布式部署方案的更多相关文章

  1. Memcached常规应用与分布式部署方案

    1.Memcached常规应用 $mc = new Memcache(); $mc->conncet('127.0.0.1', 11211); $sql = sprintf("SELE ...

  2. Window Redis分布式部署方案 java

    Redis分布式部署方案 Window 1.    基本介绍 首先redis官方是没有提供window下的版本, 是window配合发布的.因现阶段项目需求,所以研究部署的是window版本的,其实都 ...

  3. Redis 中常见的集群部署方案

    Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...

  4. 项目角度谈矢量切片运用以及Geoserver处理自定义规格矢量切片方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1. 背景 矢量切图方案目前已经是很常见的一个方案,在2016年时团队 ...

  5. Memcache分布式部署方案

    基础环境 其实基于PHP扩展的Memcache客户端实际上早已经实现,而且非常稳定.先解释一些名词,Memcache是danga.com的一个开源项目,可以类比于MySQL这样的服务,而PHP扩展的M ...

  6. 一文读懂 Redis 分布式部署方案

    为什么要分布式 Redis是一款开源的基于内存的K-V型数据库,因为内存访问速度快,一般被用来做系统的缓存. Redis作为单机部署能够支持业务简单,数据量不大的系统需求,但在实际应用中,一旦系统规模 ...

  7. zookeeper分布式部署方案

    版本:http://apache.fayea.com/zookeeper/zookeeper-3.4.8/环境:debian 7/8说明:最低配置3台步骤:1.下载zookeeper-3.4.8并解压 ...

  8. Linux-Memcache分布式部署方案(magent代理解决单点故障)

    Memcached的特点 Memcached作为高速运行的分布式缓存服务器具有以下特点. 1. 协议简单:memcached的服务器客户端通信并不使用复杂的MXL等格式, 而是使用简单的基于文本的协议 ...

  9. memcached缓存分布式部署方案

    一.分布式方案介绍 比较流行的两种方案: 1.取余分布: 计算key的哈希值,与服务器数量取余,得到目标服务器.优点:实现简单,当某台服务器不可用时,故障转移方便:缺点:当增减服务器时, Key与服务 ...

随机推荐

  1. 类的私有private构造函数 ,为什么要这样做

    通常我们都将构造函数的声明置于public区段,假如我们将其放入private区段中会发生什么样的后果?没错,我也知道这将会使构造函数成为私有的,这意味着什么? 我们知道,当我们在程序中声明一个对象时 ...

  2. dubbo的一些特性理解一下

    还有 启动检查.负载均衡.多协议支持 等 待总结

  3. python之模块导入方法总结

    模块在python编程中的地位举足轻重,熟练运用模块可以大大减少代码量,以最少的代码实现复杂的功能. 下面介绍一下在python编程中如何导入模块: (1)import 模块名:直接导入,这里导入模块 ...

  4. jumpserver3.0安装

    由于来源身份不明.越权操作.密码泄露.数据被窃.违规操作等因素都可能会使运营的业务系统面临严重威胁,一旦发生事故,如果不能快速定位事故原因,运维人员往往就会背黑锅.几种常见的运维人员背黑锅场景:1)由 ...

  5. [轉]Linux kernel <2.6.29 exit_notify() local root exploit分析(2009-1337)

    author : deep_pro目前网上的这个exploit(http://www.milw0rm.com/exploits/8369)的分析是有些问题的(http://forum.evilocta ...

  6. spring security 学习三-rememberMe

    功能:登录时的“记住我”功能 原理: rememberMeAuthenticationFilter在security过滤器链中的位置,在请求走认证流程是,当前边的filter都不通过时,会走remem ...

  7. IDEA中将工程打包成war包及部署到Tomcat流程

    工程打包成war包及部署到Tomcat流程 再IDEA开发工具中,将工程打包成war包流程: 父pom里需要移除内置的tomcat <dependency> <groupId> ...

  8. iptables 防火墙(上)

    iptables 防火墙(上) 1. 防火墙概述 1.1 概念与作用 网络中的防火墙是一种将内部网络和外部网络分开的方法,是一种隔离技术.防火墙在内网与外网通信时进行访问控制,依据所设置的规则对数据包 ...

  9. 编译错误提示PATH_MAX未声明

    解决办法: grep一下,发现PATH_MAX在limits.h中定义,在/scripts/mod/sumversion.c中添加#include <limits.h>即可. #inclu ...

  10. 关于if else 和 三目运算符的效率问题-java

    1.从类型转换上看,因为三目运算符在做判断的时候需要考虑到类型转换的问题,而if else 不需要考虑类型转换. 所以 if else 效率高一点. 2.从总体上看 A:需要考虑到循环自身所占用的时间 ...