共计 2020 个字符,预计需要花费 6 分钟才能阅读完成。
问题现象
最近在将 ArcGIS 的 SHP 数据转换为 KMZ 格式时,发现转换后的文件在 Google Earth 中打开时,原本在 ArcMap 中设置好的标注(Labels)全部消失了。具体表现为:

- 属性字段(Attribute Fields)未正确继承到 KML 中
- 符号系统(Symbol System)完全失效
- 标注位置(Label Placement)发生偏移
这个问题在 GIS 数据迁移和共享中非常常见,特别是需要将数据提供给非 GIS 专业人员查看时。
技术分析
SHP 与 KMZ 的标注存储机制差异
- SHP 文件 的标注信息存储方式:
- 存储在 Layer Properties 的 Labeling 选项卡中
- 标注表达式(Label Expression)可以包含多个字段的组合
-
标注位置是基于要素几何(Feature Geometry)动态计算的
-
KMZ/KML的标注实现方式:
- 通过
<name>节点存储主要标注 - 附加标注需要通过
<ExtendedData>节点存储 - 样式(Style)和标注(Label)是分离的
- 标注位置是静态的,不会随视图变化而调整
工具处理逻辑差异
- ArcGIS Pro 转换工具:
- 默认只转换几何和基础属性
- 标注设置需要显式指定才会保留
-
符号系统转换时使用近似替代
-
QGIS 转换工具:
- 提供更多 KML 导出选项
- 可以保留更多样式信息
- 但标注位置计算方式不同
Python 解决方案
ArcPy 脚本方案
import arcpy
import os
import logging
# 配置日志
logging.basicConfig(filename='shp2kmz.log', level=logging.INFO)
try:
# 输入参数
input_shp = r"C:\data\points.shp"
output_kmz = r"C:\output\points.kmz"
label_field = "NAME" # 指定用于标注的字段
# 创建临时图层并设置标注
lyr = arcpy.MakeFeatureLayer_management(input_shp, "temp_layer")
arcpy.management.AddField(lyr, "kml_label", "TEXT")
arcpy.management.CalculateField(lyr, "kml_label", f"!{label_field}!", "PYTHON3")
# 设置图层属性(关键步骤)lyr_obj = arcpy.mapping.Layer(lyr)
lyr_obj.showLabels = True
lyr_obj.labelClasses[0].expression = "[kml_label]"
# 转换为 KML
arcpy.LayerToKML_conversion(
lyr_obj,
output_kmz,
layer_output_scale=1,
is_composite=True,
boundary_box_extent="DEFAULT",
image_size=2048,
dpi_of_client=96,
ignore_zvalue=True
)
logging.info(f"成功导出 KMZ 文件: {output_kmz}")
except Exception as e:
logging.error(f"转换失败: {str(e)}")
raise
GDAL/OGR 命令行方案
# 需要先安装 GDAL 完整版
ogr2ogr -f "KML" output.kml input.shp \
--config KML_DISPLAY_NAME "NAME" \
--config KML_DESCRIPTION "DESCRIPTION_FIELD" \
-dsco NameField=kml_label \
-dsco DescriptionField=desc_field
# 然后手动打包为 KMZ
zip -r output.kmz output.kml doc.kml styles
避坑指南
- 坐标系问题:
- KMZ 默认使用 WGS84 坐标系
- 如果源数据是投影坐标系,转换前先重投影
-
使用
arcpy.Project_management()进行预处理 -
内存优化:
- 对于大型数据集,分块处理
- 使用
arcpy.da.SearchCursor代替传统游标 -
及时删除中间临时文件
-
样式保留:
- 在 KML 中使用
<StyleMap>定义多种状态 - 为每种要素类型创建独立的样式规则
- 考虑使用点图标替代复杂符号
扩展思考
- 自定义标注模板:
- 可以在 Python 脚本中加入模板处理逻辑
- 使用字符串格式化构建复杂标注
-
考虑添加 HTML 格式的富文本标注
-
性能取舍:
- KMZ 适合小规模静态数据分享
- 对于大数据集,考虑矢量切片(Mapbox VT)
- 评估使用 GeoJSON 作为中间格式的可能性
总结
通过深入理解 SHP 和 KMZ 的数据结构差异,我们可以更好地控制数据转换过程。Python 脚本提供了灵活的处理方式,可以精确控制哪些标注信息需要保留。对于批量处理任务,建议将上述脚本封装为 ArcGIS 工具箱工具,方便非开发人员使用。
正文完
