GeoJSON ↔ TopoJSON

双向转换 GeoJSON 与 TopoJSON:量化坐标 (quantization)、抽出共享弧段 (arcs)、Delta 编码;相邻面共享的弧段越多体积越省,并支持拓扑分析

即使按紧凑序列化计,这份 TopoJSON 也比原 GeoJSON 大 104.3%:量化后的整数位(以及 transform.scale 的定宽小数)比原始坐标更占空间,而本输入又没有可共享的弧段。TopoJSON 的省体积要靠相邻面共享同一段弧来实现,零星小几何或已是整数/短小数的坐标通常不划算。
输入 0.48 KB · 输出 0.50 KB(紧凑,即实际会保存的体积)· 比率 104.3% · 页面为便于阅读做了缩进,显示为 1.42 KB,比率不计缩进
{
  "type": "Topology",
  "objects": {
    "main": {
      "type": "GeometryCollection",
      "geometries": [
        {
          "type": "Polygon",
          "arcs": [
            [
              0
            ]
          ],
          "properties": {
            "name": "A"
          }
        },
        {
          "type": "Polygon",
          "arcs": [
            [
              1
            ]
          ],
          "properties": {
            "name": "B"
          }
        },
        {
          "type": "LineString",
          "arcs": [
            2
          ],
          "properties": {
            "name": "line"
          }
        }
      ]
    }
  },
  "arcs": [
    [
      [
        0,
        0
      ],
      [
        50000,
        0
      ],
      [
        0,
        99999
      ],
      [
        -50000,
        0
      ],
      [
        0,
        -99999
      ]
    ],
    [
      [
        50000,
        0
      ],
      [
        49999,
        0
      ],
      [
        0,
        99999
      ],
      [
        -49999,
        0
      ],
      [
        0,
        -99999
      ]
    ],
    [
      [
        0,
        99999
      ],
      [
        50000,
        0
      ],
      [
        49999,
        0
      ]
    ]
  ],
  "transform": {
    "scale": [
      0.0002000020000200002,
      0.0001000010000100001
    ],
    "translate": [
      0,
      0
    ]
  },
  "bbox": [
    0,
    0,
    20,
    10
  ]
}
格式与算法说明

TopoJSON 结构:objects.<name>.geometries[].arcs 引用 arcs[];transform.scale/translate 定义量化坐标系;每条弧段以 Delta 编码存 [[dx,dy],...]。

量化覆盖所有位置:规范 §2.1.2 要求拓扑里的每个位置都是量化后的整数,Point / MultiPoint 的 coordinates 同样是量化位(绝对值,不做 Delta)。若这里留原始经纬度,任何按规范读取的消费者都会再乘一次 scale —— 1e5 级量化下点位会被搬走四个数量级。

弧段共享:本实现识别"整段 ring/line 完全相同"(正/反向)作为共享,不做逐边合并;如需最大化共享请用 topojson-server (tj -q)。

反向弧:~idx(按位取反)表示反向遍历,与 TopoJSON 官方规范一致。

量化:quantization=1e5 意味着 bbox 内每轴最多 10⁵ 级;小文件常用 1e4。它必须是 2 ~ 10⁸ 之间的整数:q=1 会除以 0 让全部坐标塌成一个点,q≤0 会让 scale 变负、图形沿轴翻折成镜像 —— 这些以前都会静默产出一个「看着正常的拓扑」。某一维范围为 0 时该维按 1:1 保留,并在上方提示。

展平:GeoJSON 的 GeometryCollection 会被展平为同一层的多个几何(properties 平铺复制),并在提示里给出多出的要素数。geometry: null 的要素会被丢弃并计数 —— TopoJSON 没有空几何类型,回转时它们不会回来。

读出侧:对象名选不到、arcs 缺失、transform 只有一半、弧索引越界或非整数、环凑不出合法 LinearRing,都会直接报错并指认位置;越界索引以前会被当成一条空弧,静默吐出一个 "coordinates": [[]] 的面。弧段拼接处的断点、缺收尾点的环会在提示里计数。单个对象(非集合)也包成 Feature 输出,与 topojson-client 的 feature() 一致。

体积比率:按紧凑序列化(不带缩进的 JSON.stringify,也就是真会存进文件的大小)计;右侧输出与「复制」为便于阅读带缩进,不计入比率。本工具不做逐边弧段合并,只有输入里存在完全相同的整段 ring/line(相邻面共享边界)时才会省体积;坐标本来就是短小数又没有共享边界时,量化整数反而更占地方 —— 这种情况会在上方直接提示「比原 GeoJSON 大」。

关于 GeoJSON ↔ TopoJSON 工具

GeoJSON ↔ TopoJSON 是云海百宝箱提供的一个免费在线工具。双向转换 GeoJSON 与 TopoJSON,量化坐标 (quantization)、抽出共享弧段 (arcs)、Delta 编码;相邻面共享的弧段越多体积越省 该工具完全在浏览器中运行,无需下载安装任何软件,跨平台支持 Windows、Mac、Linux 及移动设备,数据在本地处理不上传服务器。

与 GeoJSON ↔ TopoJSON 配合常用的同类工具: GIS 坐标工具箱、坐标转换、在线地图加载、地图测距工具、坐标格式互转、坐标批量转换

GeoJSON ↔ TopoJSON 使用方法

  1. 在输入框中输入或粘贴需要处理的内容
  2. 选择相应的处理选项或参数
  3. 点击"处理"或"转换"按钮获取结果
  4. 点击"复制"按钮可一键复制结果到剪贴板

相关工具推荐