调研报告之矢量切片

标签: Gis 分类: Gis 创建时间:2019-12-12 07:21:31 更新时间:2023-10-20 11:23:28

前言

什么是矢量切片呢?

(1) 矢量切片的优点是:

  • 数据在客户端渲染(例如,OpenLayers),而不是在服务器端。
    这允许不同的地图应用程序使用不同的样式去渲染一个地图,而不需要事先在服务器端(比如GeoServer)进行预先的样式配置。

  • 矢量切片的大小通常比图片瓦片小,这可以使得数据传输得更快以及使用更低的带宽。
    GeoServer内嵌的GeoWebCache可以有效地存储矢量切片数据。由于样式由客户端配置,而不是在服务器配置,因此GeoWebCache只需要存储一个矢量切片就能在客户端配置不同的样式。由于在客户端上可以获取到矢量数据,所以不需要相应地增加带宽,就可以绘制分辨率很高的地图。

  • 客户端可以本地访问实际的要素信息(属性信息和几何信息),所以可以进行非常复杂和精细的要素渲染。

(2) 矢量切片的缺点:
矢量切片的主要缺点是需要对地理数据进行预处理,以便客户端能够完成所需的绘图(类似于图像瓦片地图的预处理数据)。考虑到这一点,矢量切片只能用于渲染。(怪叔叔:虽然是矢量格式,但是它们不可编辑,矢量切片是为了读取和渲染优化的格式,如果想在客户端编辑要素,最适合的是使用OGC的WFS服务)。

(3) 使用场景:
矢量切片最适合的应用方向在于对渲染速度有要求的前提下对图层style的定制化需求

1.数据格式

早期的矢量切片主要是pbf格式,后来mapbox干脆就直接命名成了mvt数据格式。

1.Pbf数据格式说明

使用mapbox,避免不了的就是要了解一种新的数据格式pbf。Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。

Google 内部:Protocol Buffer;
外部替代品:Protobuf、Thrift、Avro

比起 XML 和 JSON,Protobuf 更小、更快,也更简洁,很适合做数据存储或 RPC 数据交换格式。只需要定义一次数据结构,就可以利用各种不同语言或者从各种不同数据流中对结构化数据进行轻松读写。mapbox使用javascript实现并开源了编解码protocol buffers的工具。

A low-level, fast, ultra-lightweight (3KB gzipped) JavaScript library for decoding and encoding protocol buffers, a compact binary format for structured data serialization. Works both in Node and the browser. Supports lazy decoding and detailed customization of the reading/writing code.

mapbox自己的矢量切片数据格式就使用了这种数据格式进行传输。(不得不说,mapbox真是提供了不少的好东西,turf.js也是他们提供的)

参考文章:
1.Protocol Buffer Basics 使用Java语言进行的Protocol 数据创建和解析,算是官方的数命
2.What are protocol buffers 什么是protocol buffers,算是官方的说明
3.GitHub 标星 6.2k+!前 Google 工程师出品,最佳开发工具大全! 1.大数据处理工具:MapReduce,替代品:Apache Hadoop、Spark。1.序列化工具:Google 内部:Protocol Buffer;外部替代品:Protobuf、Thrift、Avro。3.大型集群管理系统:Google 内部:Borg;外部替代品:Kubernetes、Apache Mesos、HashiCorp Nomad。4.其他开发工具。
4.mapbox/pbf mapbox开源的读写pbf格式的javascript工具,支持nodejs和浏览器加载
5.mapbox/vt-pbf
6.mapbox.gl源码解析——基本架构与数据渲染流程 从源码的角度解析了mapbox 读取和解析 pbf 文件的过程
7.mapbox/geobuf Geobuf 是地理数据的紧凑二进制编码,Geobuf 将 GeoJSON 数据几乎无损地压缩到 protocol buffers 中。
8.OSM和PBF数据格式说明
9.Zh-hant:PBF Format 维基百科上关于pbf文件的说明,根据 Google Protocol Buffers 定义了一些地图数据相关的东西

2.MVT数据格式

2.服务发布

通过数据库的形式将数据发布为mvt数据格式。

1.静态切片

参考文章:
1.基于TileStrata发布矢量瓦片服务 这里使用的是node进行服务的发布,使用openlayers加载的pbf格式的矢量瓦片

2.PostGIS+SpringBoot

参考文章:
1.用PostGIS生成mvt格式的矢量瓦片
2.postgreSQL+postGIS+NodeJS 路径查询:从一无所知到略知一二
3.基于PG与PostGIS搭建实时矢量瓦片服务
4.基于PostGIS动态矢量切片实践 这里还提供了后端代码,可以下载查看。
5.GIS动态矢量切片(MVT——MapBox Vector Tile) 采用postgis的函数ST_AsMVT、ST_AsMVTGeom、ST_TileEnvelope函数,实现此功能,简单讲 ST_TileEnvelope 函数用于计算行列并返回对应的矩形范围,ST_AsMVTGeom返回图层中对应行的坐标,ST_AsMVT返回二进制的Mapbox Vector Tile数据。环境:Postresql 12.x + Postgis + Spring Boot

3.Geoserver

参考文章:
1.GeoServer官方教程:矢量切片 这是使用Geoserver进行矢量切片的方案。
2.GeoServer发布矢量切片及其调用方式(mapbox/leaflet) 这里提供了使用
3.GeoServer 发布矢量切片服务

4.ArcGIS

参考文章:
1.ArcGIS 10.4矢量切片介绍
2.MVT地图服务 这是飞渡提供的在ArcGIS Pro中进行切片,然后使用他们的DTS平台加载VTPK矢量数据的步骤。
3.ArcGIS+deck.gl矢量切片三维化表示建筑白模 这里是 ArcGIS API + deck.gl 生成的建筑物白膜
4.创建矢量切片包 (数据管理)

5.自定义数据格式

我在一个大神那里,得到了一个这样的操作思路,就是他将数据库中的数据,借助于ArcGIS Object工具,导出为自定义的数据格式,包括了.data、.index、.prj 这三个文件,然后编写了jar程序,通过这个程序读取文件,然后返回mvt切片,这样就可以不用安装postgis等数据库了,可以借助于redis这类的数据直接返回mvt的切片了。

6.其他

参考文章:
1.Vector Tiles from Large Databases on the Fly 这是一个开源的矢量切片服务器。
2.pg_tileserv A very thin PostGIS-only tile server in Go. Takes in HTTP tile requests, executes SQL, returns MVT tiles.

3.数据加载

数据加载的方式主要就是借助于前端的地图引擎进行加载,主要的mapbox自然是支持的,还有就是openlayer也支持。

1.Openlayer加载pbf

2.Mapbox加载

3.Cesium加载

参考文章:
1.Cesium 加载矢量瓦片 mapbox vector tile
2.矢量切片的原理以及加载(mbtiles+cesium) 矢量切片最适合的应用方向在于对渲染速度有要求的前提下对图层style的定制化需求
3.pbf-mapbox 这是Mars3d提供的使用Mapbox.js结合Cesium进行Pbf渲染的例子,他们还提供了借助于openlay进行pbf格式的数据的加载。但是我发现了一个问题,就是其实虽然加载了pfb,但是实际上使用的是栅格方式进行的渲染,因为如果是矢量方式渲染的话,放大之后,起码不应该失真的,这个例子中,放大之后,会导致出现锯齿的问题。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。