# 四.topojson
前言
TopoJSON 和 GeoJSON 一样,本身只是一种文件格式、一种地理数据标准。而为了对 TopoJSON 数据做操作,需要用到一个叫 topojson 的 js 库。
相对于 GeoJSON 有很大优势:消除了大量冗余(比如边界地理数据重复等),使得描述同一地理的 TopoJSON 文件比 GeoJSON 文件体积小了很多;就绘制而言,使用 TopoJSON 可以做到仅绘制外围轮廓、共享边境不重复绘制、查找相邻地区等
要注意的是地图绘制都是基于 GeoJSON 的,TopoJSON 并不能直接用于绘图,它总是要转换成 GeoJSON 格式才能被用于绘图。
# 1.topojson.topology
将 GeoJSON 格式的数据对象转换成 TopoJSON 格式的对象。
第一个参数是包含 GeoJSON 数据的对象,第二个可选参数是指转换过程中处理坐标时的精度。
const topology = topojson.topology({ geo: geoJSON }, 1e6)
要注意的是第一个参数并不能直接传 GeoJSON 数据作为参数,而是需要这种 key-value 的形式,这个 key 会被用于在返回的 topology 对象中进行索引,具体使用看后面。
一个返回的 topology 对象(TopoJSON 对象)通常包含以下几个属性:
- arcs
- bbox
- objects - 几何对象集合
- transform
- type: “Topology”
# 2.topojson.feature
将 TopoJSON 对象中的几何对象转换成 GeoJSON,返回的是 Feature 或 FeatureCollection 几何对象。
第一个参数是要转换的 TopoJSON 对象,第二个参数是该对象内具体的某个几何对象。
const geo_data = topojson.feature(topology, topology.objects.geo)
返回的这个 geo_data 就能当成普通的 GeoJSON 数据来使用。
# 3.topojson.merge
简单点说就是获得 objects 包含的几何体组成的整体的外轮廓。返回的是一个 GeoJSON 的 MultiPolygon 几何对象。
const geo_outline = topojson.merge(topology, topology.objects.geo.geometries)
# 4.topojson.mesh
获得 objects 构成的整体的完整轮廓线,包括外轮廓和内部共享边界线,但是是一个整体的线,所以没有线条重复的情况。返回的是一个 GeoJSON 的 MultiLineString 对象。
如果不传 objects 参数,那就是处理整个 topology。
可选的 filter 参数是一个函数,它又接收两个参数。这个 filter 参数通常用来过滤不共享的外轮廓或者被共享的内部边界线。
const geo_interior = topojson.mesh(
topology,
topology.objects.geo,
(a, b) => a !== b
)
2
3
4
5
a !== b 会过滤掉外轮廓;a === b 则会过滤掉内部被共享的线。
# 5.topojson.neighbors
会返回一个数组,数组中的子数组对应着 objects 中相应索引的几何对象的相邻几何对象,但是只是包含相邻对象的索引。
const neighbors = topojson.neighbors(topology.objects.geo.geometries)