热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GEOServer-OpenLayer-矢量切片3:PBF格式格式展示(tms服务)

0前言在上一篇博客中,本文通过参考GeoServer示例代码,实现了GeoJSON格式的矢量切片展示。但在主要存在以下两个方面的问题,PBF格式的矢量切片不能成功展示自定义

0 前言

在上一篇博客中,本文通过参考GeoServer示例代码,实现了GeoJSON格式的矢量切片展示。但在主要存在以下两个方面的问题,

  1. PBF格式的矢量切片不能成功展示
  2. 自定义坐标系统和格网方案描述混乱

该篇博客将对其进行进一步的改进和说明。

1 PBF格式切片展示

1.1 问题原因:

  1.  可能是由于 行列号计算错误或行列号与格网方案不匹配
  2.  也可能是WMTS服务在支持PBF格式时,默认的行列号计算方法和Geoserver不兼容

1.2 解决方法:

本文没有具体探究PBF格式行列号计算方法,只是通过改用tms服务,并手工计算行列号的方式修正了PBF展示异常的问题。主要还是参考了“矢量切片”一文。

1.3 实例代码

function initMVT()
{  
//图层名
  var layerName = 'VTPK:Line2_VTPK';
//投影1 Geoserver和OpenLayer都支持的4326坐标系
var projection4326 = new ol.proj.Projection({code: 'EPSG:4326',units: 'degrees',axisOrientation: 'neu'});
//切片资源1 基于4326坐标系统
var source4326 = new ol.source.VectorTile
({
format: new ol.format.MVT(),
projection: projection4326,
//切片格网直接有4326坐标系统的坐标范围与缩放大小指定,因此每一级的都是固定的
tileGrid: ol.tilegrid.createXYZ({extent: ol.proj.get('EPSG:4326').getExtent() , maxZoom: 22}),
tilePixelRatio:1,
  tileUrlFunction: function(tileCoord)
{
return '/geoserver/gwc/service/tms/1.0.0/'+layerName+'@EPSG%3A4326@pbf/'+(tileCoord[0]-1)
+ '/'+tileCoord[1] + '/' + (Math.pow(2,tileCoord[0]-1)+tileCoord[2]) + '.pbf';
}
  })
//控制器
var defaultView = new ol.View
({
projection: projection4326,
center: [114.15, 22.65],
zoom: 12
});
//地图样式
var initStyle = new ol.style.Style({stroke: new ol.style.Stroke({color: 'rgb(163,204,25)',width: 5})});
//图层
var vectorTile = new ol.layer.VectorTile
({
style: initStyle,
projection: projection4326,
source: source4326
  });
//地图
  map = new ol.Map
({
target: 'map',
layers: [vectorTile],
view:defaultView,
controls:[new ol.control.Zoom()],
});
}

1.4 代码说明

1. 格网方案创建,在此实例中本文采用了更为通用ol.tilegrid.createXYZ()方法构建格网方案,这里只需要提供格网范围和切片层数连个参数就可以,进而大大的简化了ol.tilegrid.WMTS()方法构建的参数量。

  1.  createXYZ的调用:ol.tilegrid.createXYZ({extent: ol.proj.get('EPSG:4326').getExtent() , maxZoom: 22}),
  2. ol.tilegrid.WMTS的调用:new ol.tilegrid.WMTS ({ tileSize: [256, 256], origin: [-180.0, 90.0],  resolutions: resolutions, matrixIds: gridNames })

2. tileUrlFunction回调,在此实例中本文没有使用还有{z}/{y}{x}占位符的静态URL,而改用了调用tileUrlFunction回调拼接一个切片满足wms服务格式URL。

  1.  WMS服务的URL格式(模拟):http://localhost:8080/geoserver/gwc/service/tms/1.0.0/VTPK:Line2_VTPK@EPSG%3A4326@pbf/11/3346/1281.pbf
  2. WMTS服务的URL格式(模拟):http://localhost:8080/geoserver/gwc/service/wmts?format=application/x-protobuf;type=mapbox-vector&styles=&tileMatrixSET=EPSG:4326&request=GetTile&layer=VTPK:Line2_VTPK&TILEMATRIX=EPSG:4326:18&TileROW=214193&TILECOL=49042

而为什么在tileUrlFunction中这样计算行列号,通过参考“矢量切片”一文,并利用OpenLayer自身的TileDebug图层进行了如下测试。

为了简化测试过程,方便结果查看,测试用例使用了调用的时PNG格式栅格切片,TileDebug的图层创建代码下:

//资源
var source= new ol.source.XYZ
(
{
projection: projection4326,
tileGrid: ol.tilegrid.createXYZ({extent: projection4326.getExtent() , maxZoom: 22}),
  tileUrlFunction: function(tileCoord)
{
return '/geoserver/gwc/service/tms/1.0.0/'+layerName+'@EPSG%3A4326@png/'+(tileCoord[0]-1)
+ '/'+tileCoord[1] + '/' + (Math.pow(2,tileCoord[0]-1)+tileCoord[2]) + '.png';
}
}
);
//图层
var layer= new ol.layer.Tile
(
{
source:source,
projection: projection4326
}
);
//测试图层
  var layer_Debug = new ol.layer.Tile
(
{
source: new ol.source.TileDebug
({
projection: 'EPSG:3857',
tileGrid: source.getTileGrid()
})
}
)

firebug获取的结果来看:


从图层结果中可以分析出以下结果:

  1. Open Layer中直接通过CreateXYZ方法创建的格网方法与Geoserver中默认的格网方案在z,y,x的取值方法上存在不同
  2. Z值----geoserver.z=openlayer.z-1
  3. X值----geoserver.x=openlayer.x
  4. Y值----geoserver.y=pow(2,geoserver.z)+openlayer.y
显然这个规律满足tileUrlFunction中的计算方法

2 其他坐标系统和格网方案的地图展示

2.1  格网方案和坐标系统

  1.  格网方案:表示切片层数、每层个数、每层分辨率等各种切片准则的集合,相当于框架式房屋的架子,它决定了每一张切片应该放置在什么位置
  2.  坐标系统:是数据自身相对于显示世界的位置关系
  3.  两者联系: 格网方案必须指定坐标系统,才能从经纬度或其他地理坐标计算出切片的行列号。

2.2 OpenLayer中的格网方案和坐标系统

  1. 格网方案:
    1. 作用:构建Source
    2. 使用方式:不能通过OpenLayer创建有具体数值的格网方案
  2. 坐标系统:
    1. 构建Source、构建View、构建Layer
    2. 使用方式:
      1. 直接调用 内置的WGS84或墨卡托坐标系统
      2. 通过Pro4J定义新的坐标系统

2.3 在GeoServer中的格网方案和坐标系统

  1. 格网系统:
    1. 内置格网方案:EPSG:4236、GoogleCRS84Quad、 GlobalCRS84Pixel、GlobalCRS84Scale、EPSG:900913 共计5个默认格网,前四个基于WGS84坐标系,最后一个基于墨卡托坐标系。
    2. 通过GirdSet面板,定义新的格网方案。
  2. 坐标系统:提供绝大部分的坐标系统

2.4 简单总结

  1.  Geoserver可以为地图服务提供很多坐标系统,但OpenLayer只有两个坐标系统,若遇到不是WGS84和墨卡托的坐标则必须通过ProJ4库定义
  2.  Geoserver可以为地图服务提供四个默认的格网方案,当地图服务的坐标系统不是WGS84和墨卡托坐标系统的地图服务时,必须定义新的格网系统
  3.  OpenLayer中通用的格网方案一般由CreateXYZ方案创建,但这个格网方案和Geoserver所创建格网方案,可能存在一定的不对应,因此必须通过tileUrlFunction回调进行一定的处理。
  4. 地图展示失败的且没有任何提示信息的绝大部分原因基本都是格网方案以及坐标系统不匹配引起。因此一定要仔细检查以下对应关系。
    1.  地图服务的发布坐标系统一定和Geoserver使用的格网方案的坐标系统一致
    2.  OpenLayer中Source,View 以及layer对象中的坐标系统应与地图服务发布的坐标系统一致
    3. OpenLayer中的格网方案,一定要和GeoServer使用的切片方案一致。

2.5 实例代码

function initMVT2000()
{  
//图层名
  var layerName = 'VTPK:Line2_VTPK';
//投影2 Geoserver支持但OpenLayer不支持的4490(即国家2000)坐标系
proj4.defs("china2000","+proj=longlat +ellps=GRS80 +no_defs");
var projection4490 = new ol.proj.get('china2000');
projection4490.setExtent([-180,-90,180,90]);
//切片资源2 基于4490坐标系统
var source4490 = new ol.source.VectorTile
({
format: new ol.format.MVT(),
projection: projection4490,
//切片格网直接有4326坐标系统的坐标范围与缩放大小指定
tileGrid: ol.tilegrid.createXYZ({extent: projection4490.getExtent() , maxZoom: 22}),
tilePixelRatio:1,
  tileUrlFunction: function(tileCoord)
{
//这里使用的是tms服务而不是wmts服务
//注意URL中的格网名应该是Geoserver中配置给切片的格网名而不是坐标系名
return '/geoserver/gwc/service/tms/1.0.0/'+layerName+'@CGSC2000@pbf/'+(tileCoord[0]-1)
+ '/'+tileCoord[1] + '/' + (Math.pow(2,tileCoord[0]-1)+tileCoord[2]) + '.pbf';
}
  })
//控制器
var defaultView = new ol.View
({
projection: projection4490,
center: [114.15, 22.65],
zoom: 12
});

//地图样式
var initStyle = new ol.style.Style({stroke: new ol.style.Stroke({color: 'rgb(163,204,25)',width: 5})});
//图层
var vectorTile = new ol.layer.VectorTile
({
style: initStyle,
projection: projection4490,
source: source4490
  });
//地图
  map = new ol.Map
({
target: 'map',
layers: [vectorTile],
view:defaultView,
controls:[new ol.control.Zoom()],
});
}

2.6 代码说明

1.  坐标系名称

        本例中VTPK:Line2_VTPK采用了EPSG:4490(即国家2000)坐标系统,因为OpenLayer不支持该坐标系统因此必须通过ProJ4定义,这里China2000只是一个自定义名称,具体的坐标系统定义准则字符串可以在http://epsg.io/网页获取

2. 格网名称

       本例通过CreateXYZ创建了一个格网准则,但具体的准则数值是由URL中的CGSC2000常量标志的标志的,而CGSC2000常量所对应的具体格网方案准则已经在Geoserver中成功定义,并配置给了VTPK:Line2_VTPK地图服务。具体情况如图所示:



3 总结

本文主要通过采用了TMS服务的方式,解决了PBF格式矢量切片加载异常的问题,同时,对自定义坐标系统和格网方案的使用进行了进一步的梳理。

但目前仍然没有调试出基于WMTS服务方式的PBF格式矢量切片加载用例,后期也将继续进行测试。

最后十分感谢矢量切片(http://www.cnblogs.com/escage/p/6387529.html)一文作者在该项技术上的前驱探究与总结。


推荐阅读
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • 在本文中,我们将为 HelloWorld 项目添加视图组件,以确保控制器返回的视图路径能够正确映射到指定页面。这一步骤将为后续的测试和开发奠定基础。首先,我们将介绍如何配置视图解析器,以便 SpringMVC 能够识别并渲染相应的视图文件。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 本文详细探讨了 jQuery 中 `ajaxSubmit` 方法的使用技巧及其应用场景。首先,介绍了如何正确引入必要的脚本文件,如 `jquery.form.js` 和 `jquery-1.8.0.min.js`。接着,通过具体示例展示了如何利用 `ajaxSubmit` 方法实现表单的异步提交,包括数据的发送、接收和处理。此外,还讨论了该方法在不同场景下的应用,如文件上传、表单验证和动态更新页面内容等,提供了丰富的代码示例和最佳实践建议。 ... [详细]
  • 在 CentOS 6.5 系统上部署 VNC 服务器的详细步骤与配置指南
    在 CentOS 6.5 系统上部署 VNC 服务器时,首先需要确认 VNC 服务是否已安装。通常情况下,VNC 服务默认未安装。可以通过运行特定的查询命令来检查其安装状态。如果查询结果为空,则表明 VNC 服务尚未安装,需进行手动安装。此外,建议在安装前确保系统的软件包管理器已更新至最新版本,以避免兼容性问题。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 基于Dubbo与Zipkin的微服务调用链路监控解决方案
    本文提出了一种基于Dubbo与Zipkin的微服务调用链路监控解决方案。通过抽象配置层,支持HTTP和Kafka两种数据上报方式,实现了灵活且高效的调用链路追踪。该方案不仅提升了系统的可维护性和扩展性,还为故障排查提供了强大的支持。 ... [详细]
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • 在Kohana 3框架中,实现最优的即时消息显示方法是许多开发者关注的问题。本文将探讨如何高效、优雅地展示flash消息,包括最佳实践和技术细节,以提升用户体验和代码可维护性。 ... [详细]
  • 本文详细解析了微信服务端示例类的功能与应用。其中,`ClientResponseHandler` 类主要用于处理微信支付所需的响应数据,而 `TenpayHttpClient` 则是对 HTTP 请求(包括 GET 和 POST 方法)进行了封装,以便在内部调用时更加便捷和高效。这些工具类在实际开发中起到了关键作用,开发者无需深入了解其底层实现细节,即可轻松集成微信支付功能。 ... [详细]
  • Python 中 json.dumps() 和 json.loads() 的使用方法详解——Python 面试与 JavaScript 面试必备知识
    在 Python 中,`json.dumps()` 和 `json.loads()` 是处理 JSON 数据的核心函数。`json.dumps()` 用于将字典或其他可序列化对象转换为 JSON 格式的字符串,而 `json.loads()` 则用于将 JSON 字符串解析为 Python 对象。本文详细介绍了这两个函数的使用方法及其在 Python 和 JavaScript 面试中的重要性,帮助读者掌握这些关键技能。 ... [详细]
author-avatar
淡月如水夜宿雨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有