GeoJSON 转 KML 指南
KML 是 Google Earth 与三维地理展示的通用格式,GeoJSON 转 KML 最常用两种方式:QGIS 右键导出或命令行 ogr2ogr。转换时注意三点——KML 标准坐标就是经纬度、XML 编码用 UTF-8、样式与字段会按映射规则带入。本文给出完整步骤与命令。
KML 与 GeoJSON 的区别
两者都能表示边界,但用途与生态不同。
KML
基于 XML 的标记语言,是 Google Earth、Google 地图的通用格式,支持图标样式、着色与描述气泡,也用于无人机航迹、三维软件的图层交换。
GeoJSON
基于 JSON 的开放标准,Web 地图(Leaflet、Mapbox、ECharts)与数据分析生态更友好,是后端与前端处理的首选。
转换关系
二者可无损互转:坐标都是经纬度,字段映射到 KML 的属性描述中。需要 Google Earth 展示或三维软件时转 KML,做 Web 可视化时保留 GeoJSON 即可。
用 QGIS 导出 KML
图形化操作,适合单文件与临时转换。
① 打开文件
打开 QGIS,「图层」→「添加图层」→「添加矢量图层」,选择 .geojson 文件加载边界。
② 右键导出
图层面板右键该图层 →「导出」→「另存为」,格式选择 Keyhole Markup Language [KML],选择保存路径后确定。
③ 打开验证
导出的 .kml 可直接用 Google Earth 打开,或在 QGIS 重新加载确认边界与属性无异常。
用 ogr2ogr 命令行转换(可批量)
一条命令完成转换,适合批量与自动化流程。
# 基础转换:GeoJSON → KML ogr2ogr -f "KML" out.kml in.geojson # 指定用哪个属性做 KML 名称标签(如行政名称字段) ogr2ogr -f "KML" -dsco NameField=name out.kml in.geojson # 若需先转换坐标系再输出(KML 标准为经纬度) ogr2ogr -f "KML" -t_srs EPSG:4326 out.kml in.geojson
参数说明:-f "KML" 指定输出格式;-dsco NameField 指定名称字段(影响 Google Earth 中显示的区域名);-t_srs 确保输出为经纬度。安装 GDAL 后即可使用(Windows 可用 OSGeo4W 或 conda 安装)。
转换常见问题
大多数 KML 异常都出在坐标、编码与字段映射上。
① 坐标系
KML 标准坐标是经纬度(WGS84 体系)。若源数据是投影坐标或 GCJ-02,需先转 WGS84 经纬度再输出,否则在 Google Earth 中错位或不可见。
② 编码
含中文名称的 KML 建议保持 UTF-8 编码;个别软件按本地编码读取会乱码,用文本编辑器另存为 UTF-8 即可。
③ 字段映射
KML 的属性会写入描述的扩展标签中,字段名建议简短;NameField 选错时区域名会显示为 Feature 编号,转换时显式指定即可。
④ 复杂几何
含岛屿、飞地等多块区域的 MultiPolygon 会转为多个 Placemark,属正常现象;确认所有区块都在即可。
需要现成的行政区划边界?
先有边界数据,才有转换;省、市、区县、乡镇、村五级边界均可直接获取。
统一 WGS84 的边界数据
省、市、区县边界可 地图分区下载省市区县边界;乡镇边界与全国整级打包请在 整级打包页 选购;村界数据请在 村级边界页 按省获取。数据统一 WGS84 坐标,转 KML 无需再处理坐标偏移。若需要的是 shp 而不是 KML,可参考 GeoJSON 转 shp 指南。
常见问题
KML 和 GeoJSON 有什么区别?▶
怎么把 GeoJSON 转成 KML?▶
转出的 KML 在 Google Earth 打不开或显示异常?▶
KML 转换会丢字段吗?▶
需要先转 shp 再转 KML 吗?▶
需要可直接使用的边界数据?
省、市、区县边界可 地图分区下载省市区县边界;乡镇边界与全国整级打包请在 整级打包页 选购;村界数据请在 村级边界页 按省获取。