- GIS
- CLI
- 数据可视化
【免费下载链接】mapshaper
Tools for editing Shapefile, GeoJSON, TopoJSON and CSV files
Mapshaper 是一款用于编辑 Shapefile、GeoJSON、TopoJSON 与 CSV 等地理数据的开源工具,同时提供命令行(CLI)与浏览器端 Web UI 两种使用形态。本文基于仓库中 docs/whats-new.md 的官方新特性清单,系统梳理 2026 年 4 月至 9 月 Mapshaper 陆续发布的用户可见功能:从栅格影像的导入、模糊、等高线与 GeoTIFF 导出,到饼图/甜甜圈符号、-repel碰撞疏散、命令文件与变量插值,再到 Web UI 的预览模式、Snip 剪断工具与标签就地编辑。读完本文,你将能够按版本脉络掌握这些新命令的用法、关键参数及其源码级实现原理,并知道在 命令参考、指南 与 CHANGELOG.md 中进一步查阅细节。
完整变更历史(含 bug 修复与内部改动)请参阅仓库根目录的 CHANGELOG.md;本文只聚焦于面向用户的新增能力。
2026 年 9 月:预览模式、标签编辑与饼图符号
Web UI 预览模式(Preview mode)
Web UI 新增了一个预览开关,可以直观展示地图导出后的最终效果。目前带样式的地图只有 SVG 一种导出格式(更多格式在规划中),且预览模式下仍然可以继续编辑地图图层,编辑与预览之间无需中断切换。
预览模式在 v0.7.63 中与新的地图框(Map frame)界面一同引入——地图框用于设定输出的尺寸与地理范围,符号和标签会随地图缩放按比例缩放,这正是预览所见与导出所得一致的基础。相关实现位于 src/furniture/(地图框与比例尺等地图家具)与 src/gui/(界面逻辑)。
标签编辑的全面升级(Improved label editing)
Web UI 的标签工具在 v0.7.62 中替换了旧的图层样式工具,并随之带来四项显著改进:
- 就地编辑:标签文本现在直接在地图上原地修改,不再需要打开独立编辑框。
- 曲线标签:曲线标签沿一条路径排列,而不是锚定在一个点上。通过点击地图逐点创建路径,程序会自动用平滑曲线连接各点(v0.7.64 还专门修正了 Hobby 样条在某些几何形态下“鼓包”的倾向)。
- 区域文本自动换行:区域文本按设定的宽度换行。点击地图放置一个默认尺寸的文本块,或者拖拽以设定宽度(v0.7.67 引入的 area text 类型)。
- 标注线(Callouts):标注线以直线、折线(elbow)或曲线将标签连接到其锚点,并可带箭头;在标签面板的 Callout 区域添加。v0.7.72 又新增了
callout-end=ring,可在锚点处绘制一个空心圆环作为标注线终点。 - 光晕(Halos):光晕在标签文本外圈绘制轮廓线以提升可读性,位于标签面板的 Halo 区域(v0.7.67 起支持)。
标签相关的底层命令是-labels(v0.7.70 新增),负责将点转为标签(-labels text=NAME)或添加单个标签(-labels coordinates=x,y text='...')。font-size=、halo-width=、callout=等标签选项都归入-labels名下,而-style仍接受这些标签选项以保持旧脚本兼容。标签路径导出、软换行、加粗选择等细节参见 标签相关测试 与 样式与符号指南。
饼图与甜甜圈符号(Pie and donut symbols)
-symbols命令新增了pie类型(v0.7.58 引入),用于在地图上绘制饼图统计符号:
values=列表设定每个扇区的大小,可接受数字、字段名或表达式;fills=列表设定各扇区颜色;- 加上
hole=后符号变为甜甜圈:正值按半径计算内孔,负值则从外缘向内量取,得到一圈固定宽度的扇区环带。
从源码 src/symbols/mapshaper-pie-symbols.mjs 可以看到具体实现:第一个扇区从符号顶部开始,其余扇区按顺时针排列;无值或填充色无效的扇区会被跳过,形成饼图上的缺口而不会挤动后续扇区。hole=的处理在getPieRadii()中:hole > 0时内径取该值,hole < 0时内径为outer + hole,且内径不小于外径时回退为普通饼图。整个饼图在底层被构造为一个group类型的 SVG symbol(每个扇区是一个 polygon part),由 src/commands/mapshaper-symbols.mjs 写入记录的svg-symbol字段——这也解释了为什么 pie 类型不支持geographic选项(单个 fill 字段无法表达多扇区配色)。相关用法参见 styles and symbols 指南。
2026 年 8 月:Repel 疏散、等值面与 Clean 改进
-repel命令:消除圆形符号重叠
-repel用于移除或减少圆形符号之间的重叠(v0.7.56 引入,v0.7.57 增加margin=):
max-shift=:把符号限制在其真实位置的给定像素距离之内,防止疏散时漂移过远。polygons=:把符号约束在所在多边形边界内,一个代表某区域的符号不会漂进相邻区域。
从 src/commands/mapshaper-repel.mjs 的源码看,该命令把每个符号布局为覆盖它的圆,在“显示像素空间”中运行一次碰撞求解模拟:所有被目标图层共享同一模拟,因此不同图层的符号也会互相让开。布局比例尺来自目标关联的地图框,或width=选项。padding=与margin=是两种不同的间距语义——padding=是围绕每个符号的边距,一对符号的净间距为两者 padding 之和;margin=则是符号向每个邻居主张的最小间隙,一对取较大者。ticks=与strength=控制求解器的迭代次数与力度。max-shift=、padding=、margin=均接受数字、字段名或表达式(见getPixelValueAccessor())。命令结束后会报告“移动了多少符号、剩余多少可见碰撞”,并给出增大max-shift=或放弃polygons=的建议。-repel需要投影后的单点图层,符号半径来自radius=、svg-symbol或r字段;圆环、饼图与甜甜圈符号(以group形式存在)同样支持。相关测试见 test/symbols-test.mjs。
-contours closed:等值面(Isobands)
-contours命令新增closed标志,用于从栅格生成闭合的多边形等值带(v0.7.54 引入)。生成的每个等值带带有upper与lower两个属性,分别表示该带的上、下边界值。
实现上,src/commands/mapshaper-contours.mjs 在opts.closed分支调用buildClosedContourDataset()(定义于 src/rasters/mapshaper-raster-contour-bands.mjs),把等高线转为闭合多边形带;默认仍会对结果做一次自动平滑以去除栅格阶梯状伪影(no-smoothing可关闭)。关于栅格等高线的完整选项(interval=、levels=、base=、band=、field=)参见 命令参考 与栅格实现文档 docs/development/raster-implementation.md。
-clean命令改进
-clean命令有两项重要更新:
- 新增
close-outer-gaps选项:关闭多边形镶嵌中朝外敞开的裂缝,使其像封闭间隙一样被填充。由于覆盖面上一个狭窄开口不一定是错误,该选项是显式开启的。源码中对应pinchOuterCrackMouths()(src/polygons/mapshaper-close-gaps.mjs),先把裂缝口“捏合”成封闭间隙,再走常规的间隙划分流程(见 src/commands/mapshaper-clean.mjs 中close_outer_gaps分支)。 gap-width=成为设置间隙填充阈值的首选方式:间隙伪影通常是又长又细的细条,因此用宽度参数比旧的面积参数更合适。从 v0.7.53 起-clean默认就应用宽度测试(gap-width=auto等价于旧的gap-fill-area=auto+sliver-control=1组合),gap-fill-area=与sliver-control=已弃用但仍被接受。间隙宽度由其面积与周长估算,因此细长裂缝会被填充,而面积相近但更紧凑的孔洞(如小湖)更可能被保留。-filter-slivers也同步接受了gap-width=。
Web UI Snip 工具:剪断折线
Web UI 新增 Snip 模式,用于把折线要素剪断分开(v0.7.52 引入):悬停在线条上可查看其顶点,点击一个顶点或线段上的任意一点即可将其一分为二。较短的一段会成为新的要素,因此在多部件要素上其余部分保持连接;环(ring)需要点击两次,因为一次剪断仍会留下一整条。设计细节见 docs/development/snip-tool-design.md。
2026 年 7 月:栅格 GeoTIFF 导出、等高线、模糊与世界投影
栅格导出为 GeoTIFF
栅格图层现在可以导出为.tifGeoTIFF 文件(v0.7.49 引入),文件默认压缩(Deflate)。导出实现位于 src/geotiff/mapshaper-geotiff-export.mjs:像素保持源数据类型,保留图层的 nodata 值;没有 EPSG 代码的投影会逐参数写入文件的 geo keys,少数 GeoTIFF 完全无法描述的投影会另写.aux.xml侧车文件,并且 Mapshaper 能正确重新导入该侧车文件。Web UI 中 GeoTIFF 已成为栅格导出的默认格式。参见 文件格式总览 与 栅格指南。
从栅格提取等高线
-contours命令可以从栅格图层追踪等高线——典型场景是从数字高程模型(DEM)生成高程等高线。Mapshaper 会根据数据自动挑选合理的线间距,也可以用interval=自行设定,或用levels=列表指定多个层级;追加+可以保留原栅格图层(-contours +)。追踪出的线默认按自动选取的一个像素间隔做平滑(no-smoothing可跳过),相关实现见 src/rasters/mapshaper-raster-contours.mjs 与 src/commands/mapshaper-contours.mjs。
-blur命令:平滑栅格
-blur命令接受两种半径:
- 像素:
-blur 5px - 真实世界距离:
-blur 500m(v0.7.49 起支持,借助每个地面像素的大小换算)
在运行-contours之前对高程模型做轻微模糊,是获得更平滑、更概括的等高线的有效手段。从源码 src/rasters/mapshaper-raster-blur.mjs 看,模糊采用高斯核的三次 box blur 近似(BOX_BLUR_PASSES = 3,sigma = 半径/2);RGBA 栅格会先对 alpha 做预乘再模糊,避免彩色边缘渗色;存在无效(nodata)像素时会启用加权模糊,使空洞不会污染有效数据。命令本身位于 src/commands/mapshaper-blur.mjs,要求投影后的数据集。
中断与多面体世界投影
-proj命令支持一系列中断与多面体世界投影:
- Goode Homolosine:
igh(陆地方向)、igh_o(海洋方向) - Mollweide:
imoll、imoll_o - Dymaxion:Buckminster Fuller 的 Airocean 地图,
dymaxion(Gray-Fuller 变换,兼顾形状与面积)与dymaxion2(gnomonic 投影) - 蝴蝶图:两个八面体蝴蝶投影
butterfly(太平洋为中心)、butterfly2(大西洋为中心) - Cahill-Keyes:
cahill_keyes - AuthaGraph 2022:Hajime Narukawa 发布的 2022 版公式
narukawa2022 - 四面体矩形世界地图:
markley、calm(两个使用四面体几何的共形矩形投影,v0.7.47 引入)
-graticule命令可为所有这些投影生成经纬网、多边形足迹(footprints)与图框线(neatlines,-graticule outline)。注意这些投影只能作为目标 CRS 使用,不能作为源 CRS;对于沿线产生明显弯曲的投影,建议加上densify选项为长线段插值额外顶点。完整示例参见 投影指南 的“Interrupted and polyhedral world projections”一节:
# 用 Goode Homolosine 投影世界多边形并添加经纬网 mapshaper world.geojson \ -proj +proj=igh \ -o world-igh.geojson \ -graticule \ -o graticule-igh.geojson投影实现分散在 src/crs/ 目录(如 mapshaper-dymaxion.mjs、mapshaper-cahill-keyes.mjs、mapshaper-narukawa2022.mjs、mapshaper-butterfly-projections.mjs 与 mapshaper-lee-tetrahedral.mjs),对应测试见 test/interrupted-projections-test.mjs、test/dymaxion-test.mjs 与 test/narukawa2022-test.mjs。
Web UI 标尺工具(Ruler tool)
Web UI 新增标尺模式用于测量地图上的距离(v0.7.41 引入,v0.7.42 支持 shift 点击测量多段连线,v0.7.46 起默认优先显示大圆距离):支持大圆(geodesic)测量、投影距离读数、底图视图以及可拖拽的标尺端点。
2026 年 6 月:平滑与缓冲区
-smooth命令:按比例尺感知平滑几何
-smooth将多边形与折线要素的几何平滑到给定分辨率(v0.7.30 引入,v0.7.33 起默认保留尖角)。其核心是一套尺度感知的高斯(Savitzky–Golay)低通滤波:<distance>参数设定输出分辨率,比该细节更细的细节被移除,较大特征得以保留。主要特性:
- 默认保留尖角:直线段相遇形成的尖角默认不被圆化(
no-corners可关闭;corner-bias=可调节尖角检测灵敏度)。 - 默认预过滤:默认应用预过滤以移除亚尺度细节(栈桥、狭窄水湾、尖刺等),
no-prefilter可跳过。 gain=:控制输出曲线的振幅(0 禁用曲率收缩修正,>1 夸大弯曲)。max-bend-angle=:在输出顶点数与连接平滑度之间取舍(默认 8 度,值越大保留顶点越少)。planar:平面模式选项;另有未文档化的strength=作为平滑核的倍数(默认 1)。
v0.7.36-0.7.39 还修复了尖角检测、大型环上的性能瓶颈(移除三处 O(n²) 热点)并沿直线段稀疏顶点。可视化对比参见 docs/images/ 下的smooth-*.png系列,测试见 test/smooth-test.mjs。
-buffer命令:点、线、面的缓冲区
-buffer为点、线与多边形生成缓冲区(v0.7.23 引入,此后持续加固):
- 测地线距离:经纬度数据默认使用测地线距离;投影数据加
geodesic选项同样使用测地线(v0.7.26 起)。 - 负半径收缩:负的
radius参数收缩多边形(正值向外扩展)。 topological:防止缓冲区与邻近多边形重叠——重叠的缓冲空间按到源多边形的邻近度分配(最近者获胜,v0.7.28 起),适用于为一组相邻多边形生成缓冲,使缓冲区扩展到周边空白空间而不覆盖任何原始多边形环。fill-gaps:填充封闭孔洞与窄口入口(如河流直至其河口),且不增长外边界;可用max-widening=限制加宽量,merge-islands处理孤岛(v0.7.40)。
缓冲区实现分布在 src/buffer/ 目录(缓冲构建器 mapshaper-buffer-builder.mjs、测地线多边形缓冲等),相关测试见 test/buffer-test.mjs、test/buffer-loop-removal-test.mjs。
2026 年 5 月:栅格支持、点图标、撤销与网格
栅格图层支持
Mapshaper 现在可以导入 GeoTIFF 栅格,以及带 world file 地理配准的 PNG/JPEG 图像(v0.7.14 起),在 Web UI 中预览、用矩形工具裁剪、并以嵌入 SVG 的图像形式导出(v0.7.16 起支持栅格重投影)。栅格导入与投影的默认选项对典型图像图层效果良好;导入含数据的栅格时可能需设置额外选项,均记录在命令参考中:-i raster-type=image|categorical|continuous决定重投影时使用双线性还是最近邻重采样(连续测量栅格如高程模型应使用continuous,通常可自动检测),-proj resampling=可覆盖默认,-proj nodata-color=设定投影区域外的填充色。实现与设计文档见 docs/development/raster-implementation.md 与 docs/development/raster-geotiff-support.md,测试见 test/raster-test.mjs。
-style点图标
-style命令新增icon=、icon-size=与icon-color=选项,可绘制圆、方形、圆环、星形等简单点图标(v0.7.13 起),图标可与标签在同一图层上组合使用。
Web UI 命令的撤销/重做
Web UI 现在能在工作过程中保存临时恢复数据,使控制台命令及其他数据编辑可从弹出工具栏撤销/重做(v0.7.10 起)。该功能很新,可能存在 bug,遇到问题请反馈。撤销默认开启,可从新增的 History 菜单关闭(处理超大数据集时建议关闭);v0.7.49 起撤销历史不再受十状态限制,仅在恢复数据超过存储上限时才丢弃。核心机制见 src/undo/ 与 src/gui/gui-app-undo.mjs,设计与实现文档见 docs/development/undo-redo-implementation.md 与 docs/development/undo-performance-review.md。
更多网格选项
-grid命令现在可以创建菱形(rhombus)与三角形(triangle)网格(v0.7.10 起),并新增:
cols=、rows=、cells=:控制网格单元尺寸,作为原interval=的替代;cell-scale=:在网格内缩放每个单元(在相邻单元间制造间隙或重叠),取值范围 0–2;- v0.7.59 又增加了
type=cairo(开罗镶嵌)与rotate=(旋转任意角度)。
实现位于 src/grids/(方形网格 mapshaper-square-grid.mjs、六边形 mapshaper-hex-grid.mjs),测试见 test/grid-test.mjs。
GeoParquet 支持
Mapshaper 可以读写 GeoParquet(.parquet)文件(v0.7.8 起):默认使用 Snappy 压缩,若要改用 ZSTD,可在输出选项中添加compression=zstd;-o level=可设定 ZSTD 压缩级别(1–22)。v0.7.50 起导出通过跳过 GeoJSON 中转来大幅降低内存占用并提速,行组按估计字节数(目标约 16MB)而非固定行数划分,-o rowgroup=可显式设定每行组行数。参见 GeoParquet 格式文档 与 test/geoparquet-export-test.mjs。
2026 年 4 月:消息面板、命令文件与格式扩展
消息面板(Messages panel)
警告与信息消息现在集中收集在一个消息面板中:有新消息时,标题栏会出现带计数的图标,点击即可打开面板。这让重要信息始终可访问,又不会像模态弹窗那样打断当前会话。
命令文件(Command files)
一系列 Mapshaper 命令可以写入.txt文件,使用#注释且无需 shell 转义,然后通过-run <file>运行——也可以直接mapshaper commands.txt作为-run的快捷方式。命令文件也可以按 shell 兼容方式编写(尾随\续行、无#注释),从而可以直接粘贴到终端或加入 shell 脚本。更新:这些文件也可以在浏览器 UI 中导入并运行(v0.7.46 起,在控制台使用-run)。
mapshaper build.txt命令文件的格式约定:.txt文件的第一条非空、非注释行以mapshaper开头:
mapshaper -i provinces.shp # 使用 Douglas-Peucker 简化 -simplify dp 20% -o precision=0.00001 output.geojson与 shell 脚本 / Makefile 相比,命令文件提供几项便利:支持#注释(独立行与行尾均可);无需转义*等 shell 元字符(命令不经 shell 传递);尾随反斜杠续行可用但不必须——不以-开头的行会并入上一条命令。详细语法与-run用法见 命令行文档,实现位于 src/cli/mapshaper-run-command-file.mjs,测试见 test/run-command-file-test.mjs。
命令中的变量插值(Variable interpolation)
命令文件与命令行支持{{VAR}}占位符,在每条命令运行前解析,取值来源包括:
- 环境变量:
{{env.HOME}}; - 新命令
-vars与-defaults设定的值(-vars总是覆盖,-defaults只在值不存在时设定); -calc、-define与-each表达式动态定义的变量(表达式向global对象赋值)。
mapshaper -vars YEAR=2030 PCT=5 -run build.txt两种形式被识别:{{VAR}}替换为VAR的值,{{env.NAME}}替换为环境变量NAME的值。该语法可以插值整个或部分命令选项,例如-simplify {{SIMPLIFY_METHOD}} resolution={{SIMPLIFY_RESOLUTION}}。-vars/-defaults写入模板作用域存储,其他命令写入表达式作用域(global);{{X}}先查模板作用域再回退到表达式作用域,因此四种机制的值都可达。注意:JS 表达式中的裸名称只能看到表达式作用域——由-vars设定的名称在-each、-filter等中不能通过裸名称读取。详见 命令行文档、表达式指南 与实现 src/cli/mapshaper-vars-utils.mjs、test/vars-utils-test.mjs。
告别 dissolve2
-dissolve命令现在使用 Mapshaper 最稳健的 dissolve 函数(v0.7.53 起),可以处理重叠、间隙及其他拓扑错误;旧的更快算法仍可通过-dissolve no-repair使用。旧的-dissolve2现在只是-dissolve的别名。相关实现见 src/dissolve/mapshaper-polygon-dissolver.mjs 与 src/dissolve/mapshaper-polygon-dissolve2.mjs,测试见 test/dissolve-test.mjs 与 test/dissolve2-test.mjs。
FlatGeobuf 与 GeoPackage 支持
Mapshaper 现在可以读写 FlatGeobuf(.fgb)与 GeoPackage(.gpkg)文件。GeoPackage 支持多图层读写(-i layers=选择图层);FlatGeobuf 导出会用图层名作为数据集头信息;两格式导出在 v0.7.50 起也跳过 GeoJSON 中转以降低内存并提速。参见 FlatGeobuf 格式文档、GeoPackage 格式文档 与对应测试 test/flatgeobuf-export-test.mjs、test/geopackage-import-test.mjs。
SVG 导入
Mapshaper 导出的 SVG 文件可以重新导入(v0.7.7 起支持带元数据的往返):以-o metadata导出的 SVG 会写入可在 Adobe Illustrator 往返后存活的元数据,重新导入时恢复原始地理坐标,非常适合做样式层面的迭代编辑。参见 SVG 格式文档。
结语
从 2026 年 4 月到 9 月,Mapshaper 沿着两条主线快速演进:一是把栅格(GeoTIFF/PNG/JPEG)与更多现代格式(GeoParquet、FlatGeobuf、GeoPackage)纳入导入、处理与导出管线,补齐了-blur、-contours(含等值面)、-smooth、-buffer、-repel、-symbols pie等一批面向制图生产的命令;二是大幅强化 Web UI 的交互编辑体验——标签就地编辑、Snip 剪断、标尺、预览模式与可开关的撤销/重做。这些能力均已落地于当前仓库的源码与测试中,读者可以结合 命令参考、使用指南 与 CHANGELOG.md 按需深挖。
- GIS
- CLI
- 数据可视化
【免费下载链接】mapshaper
Tools for editing Shapefile, GeoJSON, TopoJSON and CSV files
相关推荐
Proxmark3最新特性:2025年CHANGELOG关键更新解读
还在为RFID安全研究工具的复杂性而头疼?Proxmark3作为RFID领域的多功能工具,2025年迎来了一系列重大更新,让安全研究和渗透测试变得更加高效便捷。
渗透测试嵌入式物联网网络安全TypeScript 7 原生工具链全景解读:typescript-book 新闻频道 2026 年关键更新汇总
TypeScript 7 原生工具链全景解读:typescript book 新闻频道 2026 年关键更新汇总 导读 本篇文章以开源项目《The Concis
文档教程Sphinx 1.4 版本深度解析:新特性、不兼容变更与关键修复全景
Sphinx 1.4 版本深度解析:新特性、不兼容变更与关键修复全景 本文基于当前仓库的官方变更记录 doc/changes/1.4.rst https://l
文档开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考