言成言成啊 | Kit Chen's Blog

瓦片边界可视化工具

发布于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^层级
  • 该层级瓦片数量=边长*边长
层级边长该层级瓦片数量
011*1
122*2
244*4
388*8
41616*16
53232*32
66464*64
7128128*128
8256256*256
9512512*512
1010241024*1024
1120482048*2048
1240964096*4096
1381928192*8192
141638416384*16384
153276832768*32768
166553665536*65536
17131072131072*131072
18262144262144*262144
19524288524288*524288

1.2 瓦片分类

瓦片主要分为两类

  • 栅格瓦片(Raster Tiles)
  • 矢量瓦片(Vector Tiles)

栅格瓦片是将图像或地图以固定大小的正方形(通常是256x256像素或512x512像素)进行切割,每个瓦片包含了一部分图像数据。

矢量瓦片是将地图数据以矢量形式进行切割,每个瓦片包含了一部分地图的矢量数据,如点、线、多边形等。

特点栅格瓦片 (Raster Tiles)矢量瓦片 (Vector Tiles)
数据类型位图图像(JPEG、PNG)矢量数据(GeoJSON、MVT)
存储方式固定大小的图像块矢量数据的切片
渲染方式直接展示动态渲染后展示
文件大小每个瓦片大小固定取决于数据复杂度,每个瓦片大小不一
优点渲染速度快,适用于复杂图像放大不失真,样式和数据动态调整,更新便捷
缺点放大失真,数据更新不便渲染需要更多计算资源,不适用于复杂图像
使用场景静态地图、图像浏览动态地图、交互式地图

MVT是Mapbox公司提出的一种矢量瓦片格式,用于高效地存储和传输地理空间数据。每个MVT文件包含一个地图的矢量数据切片,通常以固定大小的矩形区域(瓦片)进行分割。

MVT(Mapbox Vector Tile)特点如下:

  1. 高效存储
    • 使用Protobuf(Protocol Buffers)进行二进制编码,比传统的JSON或GeoJSON格式更紧凑,显著减少存储空间和传输数据量。
  2. 灵活渲染
    • 矢量数据可以在客户端根据需求动态绘制,允许自定义样式(如颜色、线条粗细等),提供更高的灵活性。
  3. 多层支持
    • MVT文件支持在同一个瓦片中存储多个图层(如道路、建筑、河流等),每个图层包含不同类型的地理要素(点、线、面)。

MVT 结构示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"layers": [
{
"name": "roads",
"features": [
{
"id": 1,
"geometry": {
"type": "LineString",
"coordinates": [[-122.483696, 37.833818], [-122.483482, 37.833174]]
},
"properties": {
"name": "Main Street"
}
}
]
},
{
"name": "buildings",
"features": [
{
"id": 2,
"geometry": {
"type": "Polygon",
"coordinates": [[-122.483696, 37.833818], [-122.483482, 37.833174], [-122.483396, 37.833202]]
},
"properties": {
"name": "City Hall"
}
}
]
}
]
}

1.3 瓦片索引

瓦片索引(Tile Indexing)是地图瓦片系统中的一种编码方式,用于标识和定位瓦片。瓦片索引通常使用三种主要的坐标:缩放级别(Z)行号(Y)列号(X)。这些坐标用于标识特定的瓦片。

  1. z(缩放级别):
    • 定义:表示地图的缩放级别。
    • 范围:通常从0开始,数字越大表示缩放级别越高(地图更详细)。
    • 获取:根据您需要的地图详细程度来选择。常见的范围是0-20。
  2. x(列):
    • 定义:在给定缩放级别下,瓦片在水平方向上的索引。
    • 范围:从0到2^z - 1。
    • 获取:基于经度计算得出。
  3. 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的每一个人。

我作为旁观者,更多的是感叹。照这样子看来,世界上并没有纯粹的技术,全都是夹杂着各种复杂的因素在里面,不可避免的是夹杂着政治因素的。

从政治角度来看,管他是不是真自研呢,管他是不是抄作业呢。只要不受限于对方就够了,也就是说,现在那些自研走的方向,师夷长技以制夷,完全正确!

发布:2024-06-10 22:22:55
修改:2024-08-08 02:47:33
链接:https://meethigher.top/blog/2024/visible-tile-boundaries/
标签:life gis map 
付款码 打赏 分享
shift+ctrl+1可控制目录显示