瓦片边界可视化工具
发布于2024-06-10 22:22:55,更新于2024-08-08 02:47:33,标签:life gis map 文章会持续修订,转载请注明来源地址:https://meethigher.top/blog本文涉及的核心内容
一、瓦片基础
1.1 瓦片概念
地球是一个球,那么如何将一个三维的球展示在平面上呢?墨卡托投影就是将三维球表示在二维面上的方法之一,也是应用得最广泛的方法。我们平时看到的谷歌地图、百度地图、OpenStreetMap,都是使用的墨卡托投影。
墨卡托(Mercator)投影的过程其实非常简单,就是将地球用一个圆柱框起来,从球心发射出一条直线,它与球的交点,投影后的位置,就是这条线与圆柱的交点,此时圆柱展开成平面,就是投影后的结果了。
我们一般看到的墨卡托投影地图都是无法完整显示的,一般都只截取了85度纬度以内的部分,否则会是一个无穷高的图
处理成平面后的固定大小的块(正方形),就叫做瓦片(Tiles),可以独立处理、传输和存储。上面的示例图,只是展示了某一层级的瓦片,实际上瓦片还会有层级之分。如下图。
在空间上分层、在平面上分片,这就是瓦片技术了。
瓦片的数量,按层级划分如下。每个瓦片都是一个正方形。下面是层级、边长、该层级瓦片数量的关系
总结就是
- 边长=2^层级
- 该层级瓦片数量=边长*边长
层级 | 边长 | 该层级瓦片数量 |
---|---|---|
0 | 1 | 1*1 |
1 | 2 | 2*2 |
2 | 4 | 4*4 |
3 | 8 | 8*8 |
4 | 16 | 16*16 |
5 | 32 | 32*32 |
6 | 64 | 64*64 |
7 | 128 | 128*128 |
8 | 256 | 256*256 |
9 | 512 | 512*512 |
10 | 1024 | 1024*1024 |
11 | 2048 | 2048*2048 |
12 | 4096 | 4096*4096 |
13 | 8192 | 8192*8192 |
14 | 16384 | 16384*16384 |
15 | 32768 | 32768*32768 |
16 | 65536 | 65536*65536 |
17 | 131072 | 131072*131072 |
18 | 262144 | 262144*262144 |
19 | 524288 | 524288*524288 |
1.2 瓦片分类
瓦片主要分为两类
- 栅格瓦片(Raster Tiles)
- 矢量瓦片(Vector Tiles)
栅格瓦片是将图像或地图以固定大小的正方形(通常是256x256像素或512x512像素)进行切割,每个瓦片包含了一部分图像数据。
矢量瓦片是将地图数据以矢量形式进行切割,每个瓦片包含了一部分地图的矢量数据,如点、线、多边形等。
特点 | 栅格瓦片 (Raster Tiles) | 矢量瓦片 (Vector Tiles) |
---|---|---|
数据类型 | 位图图像(JPEG、PNG) | 矢量数据(GeoJSON、MVT) |
存储方式 | 固定大小的图像块 | 矢量数据的切片 |
渲染方式 | 直接展示 | 动态渲染后展示 |
文件大小 | 每个瓦片大小固定 | 取决于数据复杂度,每个瓦片大小不一 |
优点 | 渲染速度快,适用于复杂图像 | 放大不失真,样式和数据动态调整,更新便捷 |
缺点 | 放大失真,数据更新不便 | 渲染需要更多计算资源,不适用于复杂图像 |
使用场景 | 静态地图、图像浏览 | 动态地图、交互式地图 |
MVT是Mapbox公司提出的一种矢量瓦片格式,用于高效地存储和传输地理空间数据。每个MVT文件包含一个地图的矢量数据切片,通常以固定大小的矩形区域(瓦片)进行分割。
MVT(Mapbox Vector Tile)特点如下:
- 高效存储:
- 使用Protobuf(Protocol Buffers)进行二进制编码,比传统的JSON或GeoJSON格式更紧凑,显著减少存储空间和传输数据量。
- 灵活渲染:
- 矢量数据可以在客户端根据需求动态绘制,允许自定义样式(如颜色、线条粗细等),提供更高的灵活性。
- 多层支持:
- MVT文件支持在同一个瓦片中存储多个图层(如道路、建筑、河流等),每个图层包含不同类型的地理要素(点、线、面)。
MVT 结构示例
1 | { |
1.3 瓦片索引
瓦片索引(Tile Indexing)是地图瓦片系统中的一种编码方式,用于标识和定位瓦片。瓦片索引通常使用三种主要的坐标:缩放级别(Z)、行号(Y)和 列号(X)。这些坐标用于标识特定的瓦片。
- z(缩放级别):
- 定义:表示地图的缩放级别。
- 范围:通常从0开始,数字越大表示缩放级别越高(地图更详细)。
- 获取:根据您需要的地图详细程度来选择。常见的范围是0-20。
- x(列):
- 定义:在给定缩放级别下,瓦片在水平方向上的索引。
- 范围:从0到2^z - 1。
- 获取:基于经度计算得出。
- y(行):
- 定义:在给定缩放级别下,瓦片在垂直方向上的索引。
- 范围:从0到2^z - 1。
- 获取:基于纬度计算得出。
瓦片索引的常见编码规范如下
TMS(Tile Map Service):
- Z 表示缩放层级,XY 的原点在左下角,X 从左向右,Y 从下向上
常用XYZ 坐标系统:
- Z 表示缩放层级,XY 的原点在左上角,X 从左向右,Y 从上向下
- 该坐标表示方式是标准的Web瓦片坐标系统,通常用于Google Maps和OpenStreetMap等地图服务,也用于Postgresql的Postgis扩展中的函数(如st_tileenvelope)
直观对比,如下
二、瓦片边界可视化
2.1 实现
原理就是在加载的瓦片图层上面,再覆盖一层透明的带有瓦片描述的图层即可。
不多赘述了,源码地址为meethigher/visible-tile-boundaries: visible tiles boundaries demo
2.2 参考
clockworkmicro/tile-boundaries: Tile-boundaries adds tile boundaries to your Leaflet map
Tiles à la Google Maps: Coordinates, Tile Bounds and Projection | No code | MapTiler
三、换个角度看自研
之前我一直在抨击“遥遥领先”不要脸,换皮开源、魔改开源,却说完全自研。但是最近改观了。
这几天我在访问leaflet的官方文档,因为要写这个瓦片可视化的小工具。
之前一直没有弹窗,但是今天2024年06月10日突然来了个弹窗,内容如下
我第一时间查看该页面的修改时间,发现是2024年04月01日更新,但是我最近访问还是第一次弹窗出来这个,可能是缓存的原因?算了这个先不纠结。
弹窗内容的大致含义是,leafet的创建者是乌克兰人,leaflet的维护者希望借此获取大众对乌克兰的支援,否则leatlet就没有未来了,这将会影响到使用leaflet的每一个人。
我作为旁观者,更多的是感叹。照这样子看来,世界上并没有纯粹的技术,全都是夹杂着各种复杂的因素在里面,不可避免的是夹杂着政治因素的。
从政治角度来看,管他是不是真自研呢,管他是不是抄作业呢。只要不受限于对方就够了,也就是说,现在那些自研走的方向,师夷长技以制夷,完全正确!