张春成
2023/05/06阅读:14主题:默认主题
细粒度的中国地理数据分析(五)
细粒度的中国地理数据分析(五)
本文将之前所述的地块分类数据映射在 Mapbox 地图上,它能够以更加清晰的方式展示城市的地块分布。另外本文的经验还说明,我们在考虑数据分析和可视化问题的时候,应该充分考虑如何将它们与现有的 API 和数据分发手段结合起来,既要注意闭门造车,也要注意出门合辙。
本文的映射结果可见我的前端笔记本。
Mapbox with land types[1]
-
细粒度的中国地理数据分析(五)[2] -
面向 TopoJson 的数据流[3] -
地块数据映射[4]
-
面向 TopoJson 的数据流
在前文已经对地块数据进行了充分介绍的基础上,本文工作的内容是将地块数据进行标准化,形成 topoJson 格式的中间数据。通过将 topoJson 中间数据传输到前端,就可以方便地与 Mapbox 地图相结合,对地块的类型进行地图渲染。
Maps, geocoding, and navigation APIs & SDKs | Mapbox[5]
https://github.com/topojson/topojson[6]
在生成 topoJson 数据时,需要处理两类信息,首先是城市边界信息,它是该城市的多边形闭包,如下图中的第 0 号 feature 所示;其次是地块信息,它包含大量的多边形,如下图中第 1 - 5 号 features 所示。需要注意的是对地块信息进行处理时,应该将它们按照地块种类进行整合,形成 MultiPolygon 的 geometry,而非独立的 feature,这样做的原因是地图绘制时可以对这些地块(图中为 3998 个地块)进行统一渲染,从而最大程度地节省系统资源。在完成 topoJson 数据生成及分发后即可使用 Mapbox 提供的 API 进行绘制。

地块数据映射
接下来将呈现地块映射的结果如下图所示,其中每个地块的颜色代表地块种类,深色区域代表市区范围。从图中可以看到,该渲染方式不仅可以呈现地块种类并且能够进行缩放和倾斜,便于用户观察其中的细节。从倾斜图看过去你就会发现,北京向西发展的边界并非是其行政边界,而是西边的群山。而目前该市几乎已经达到了西边的极限。
最后一个问题是为什么原始数据号称区分全国地块,而本文只渲染北京市一个城市?其原因是数据规模。这背后的原理是几何拓扑界的一个公案,那就是
如果用一些曲线“填满”特定的空间,这些曲线的总长度需要有多长?
这个问题的答案是已经被证明的“无限长”,也就是说我们可以把曲线理解成没有宽度、只有长度的几何结构,那么只要我们总能通过增加曲线的卷曲程度,来达到在有限空间内塞入更长的曲线的目的。由此可见,随着地块的无限细分,我们所需要的边界曲线就无限增长。因此面对精细地块分割的数据时,其 topoJson 数据的规模也在不断增长。以本文为例仅北京市的边界信息数据就达到了 27M 的数据规模,因此为了避免数据规模过大,我在此仅展示一个城市,有需要的话才考虑搭建本地服务实现全国数据展示。



参考资料
Mapbox with land types: https://observablehq.com/@listenzcc/mapbox-with-land-types
[2]细粒度的中国地理数据分析(五): #细粒度的中国地理数据分析五
[3]面向 TopoJson 的数据流: #面向-topojson-的数据流
[4]地块数据映射: #地块数据映射
[5]Maps, geocoding, and navigation APIs & SDKs | Mapbox: https://www.mapbox.com/
[6]https://github.com/topojson/topojson: https://github.com/topojson/topojson
作者介绍