在进行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. python-并发编程之进程

    进程 python中创建进程模块为:multiprocessing 开销非常大 是计算机中资源分配的最小单位(内存隔离) 能利用多个CPU 由操作系统控制 同时操作内存之外的数据会产生数据的不安全 进 ...

  2. Spring Data JPA查询关联数据

    1. Query方式@Query("select s from Store s join fetch s.products where s.user.id = :user_id") ...

  3. CTU OPEN 2017 Pond Cascade /// 思维

    题目大意: 给定N F 给定N个水池的大小 每个水池都以流量F开始注水 当位置较前的水池注满后 水会溢出到下一个水池 求 最后一个水池开始溢出的时间 和 所有水池全部注满的时间 1.最后一个n水池开始 ...

  4. hive HQL笔记

    #建表 create table sign_in (uri string , test string) row format delimited fields terminated by '|'; # ...

  5. # Python第十节 传参

    Python第十节 传参 一. 变量和变量名 首先说明变量名和变量的一点差异 例如: var = [1, 2, 3] `var = "Google" 调用变量var的时候, 既可以 ...

  6. 请求一个url的全过程

    最近在进行前端面试方面的一些准备,遇到了一个经典前端问题,一个url从输入到页面加载中间到底发生了什么,以前也认真想过这个问题,但是当时回答的都不全面,现在来好好总结一下: 总体来说分为以下六个步骤: ...

  7. 例行性工作排程 (crontab)

    说白了,就是一些例行工作的日常执行的排序程序 Linux  工作排程的种类:  at,cron 鸟叔说,atd并不是在所有版本都是开启的,但是centos7默认是开启的 [root@localhost ...

  8. JAVA设计模式之迭代器设计模式

    一.迭代器模式简介 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式. 二.迭代器模式的角色与职 ...

  9. java-逻辑处理

    类名是ItemDAO package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...

  10. js手机滚屏效果

    原文地址:https://github.com/yanhaijing/zepto.fullpage 第一步:基于移动端的浏览体验,在头部添加浏览器渲染的分辨率 <meta name=" ...