矢量切片应用中geoserver与geowebcache分布式部署方案
在进行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分布式部署方案的更多相关文章
- Memcached常规应用与分布式部署方案
		
1.Memcached常规应用 $mc = new Memcache(); $mc->conncet('127.0.0.1', 11211); $sql = sprintf("SELE ...
 - Window Redis分布式部署方案 java
		
Redis分布式部署方案 Window 1. 基本介绍 首先redis官方是没有提供window下的版本, 是window配合发布的.因现阶段项目需求,所以研究部署的是window版本的,其实都 ...
 - Redis 中常见的集群部署方案
		
Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...
 - 项目角度谈矢量切片运用以及Geoserver处理自定义规格矢量切片方案
		
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1. 背景 矢量切图方案目前已经是很常见的一个方案,在2016年时团队 ...
 - Memcache分布式部署方案
		
基础环境 其实基于PHP扩展的Memcache客户端实际上早已经实现,而且非常稳定.先解释一些名词,Memcache是danga.com的一个开源项目,可以类比于MySQL这样的服务,而PHP扩展的M ...
 - 一文读懂 Redis 分布式部署方案
		
为什么要分布式 Redis是一款开源的基于内存的K-V型数据库,因为内存访问速度快,一般被用来做系统的缓存. Redis作为单机部署能够支持业务简单,数据量不大的系统需求,但在实际应用中,一旦系统规模 ...
 - zookeeper分布式部署方案
		
版本:http://apache.fayea.com/zookeeper/zookeeper-3.4.8/环境:debian 7/8说明:最低配置3台步骤:1.下载zookeeper-3.4.8并解压 ...
 - Linux-Memcache分布式部署方案(magent代理解决单点故障)
		
Memcached的特点 Memcached作为高速运行的分布式缓存服务器具有以下特点. 1. 协议简单:memcached的服务器客户端通信并不使用复杂的MXL等格式, 而是使用简单的基于文本的协议 ...
 - memcached缓存分布式部署方案
		
一.分布式方案介绍 比较流行的两种方案: 1.取余分布: 计算key的哈希值,与服务器数量取余,得到目标服务器.优点:实现简单,当某台服务器不可用时,故障转移方便:缺点:当增减服务器时, Key与服务 ...
 
随机推荐
- libvirt虚拟机管理常用指令
			
创建虚拟机 virt-install virt-install --connect qemu:///system -n $NAME -r $MEM -f $DISK -s $DISK_SIZE --v ...
 - 开发效率优化之Git分布式版本控制系统(一)
			
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从Git分布式版本控制系统来阐述开发效率优化 一,企业 ...
 - leetcode.矩阵.73矩阵置零-Java
			
1. 具体题目 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: 输出:[ [ [1,1,1], [1,0,1], [ ...
 - grafana初体验
			
1.centos版下载安装 wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.0.4-1.x86_6 ...
 - 桩服务开发2---与python结合
			
from mitmproxy import httpdef request(flow): request_data=flow.request print(request_data) 进入py目录,在终 ...
 - Shell内置命令——declare
 - Exist/In 使用
			
exists表示()内子查询语句返回结果不为空说明where条件成立就会执行主sql语句,如果为空就表示where条件不成立,sql语句就 不会执行.not exists和exists相反,子查询语句 ...
 - Codeforces 1167E 尺取法
			
题意:给你一个长度为n的数组,以及数组中的数的取值范围1 - m,问有多少个区间[l, r],使得删除了数组中数值为[l, r]的数之后,数组是非递减的. 思路:我们记录一下每一个数出现的最左端和最右 ...
 - Fiddler,对数据进行抓包,拦截,修改等操作
			
转载....... 一.fiddler设置fiddler默认是只能抓取http网络格式的,所以我们要先设置下使fiddler可以获取到https网络格式 首先tools→options→https进去 ...
 - 数据结构(c语言版,严蔚敏)第1章绪论
			
第1章严蔚敏