xml和shp是两种常用的数据格式,xml多用于结构化数据存储和交换,shp则是GIS领域通用的矢量数据格式,承载点、线、面等空间要素信息。很多场景下需要将xml中存储的地理空间数据转换为shp格式,方便后续在GIS软件中进行分析和可视化。

方法一:使用GDAL的ogr2ogr工具转换
GDAL是开源的地理空间数据处理库,其中的ogr2ogr工具支持多种矢量格式之间的转换,只要xml数据符合对应的空间数据规范,就可以直接通过该工具完成转换。
首先需要确认xml数据的具体格式,比如是否是GML格式,GML本身就是基于xml的地理标记语言,ogr2ogr对其支持很好。如果是自定义结构的xml,需要先明确空间坐标和要素属性的存储规则。
假设待转换的xml是标准的GML格式,转换命令如下:
# 将gml格式的xml转换为shp ogr2ogr -f "ESRI Shapefile" output.shp input.xml
如果xml是自定义结构,需要先编写对应的配置文件定义要素映射规则,再通过ogr2ogr加载配置完成转换。
方法二:Python编程实现转换
通过Python结合GDAL的ogr模块,可以编写自定义脚本实现xml到shp的转换,适合处理结构特殊的xml数据,灵活性更高。
首先需要安装GDAL库,然后读取xml中的空间坐标和属性信息,逐条创建shp的要素并写入文件。以下是一个简单的示例,处理存储点要素的自定义xml:
from osgeo import ogr, osr
import xml.etree.ElementTree as ET
# 解析xml文件
tree = ET.parse('input.xml')
root = tree.getroot()
# 创建shp文件
driver = ogr.GetDriverByName('ESRI Shapefile')
ds = driver.CreateDataSource('output.shp')
# 定义空间参考,这里以WGS84为例
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
# 创建点图层
layer = ds.CreateLayer('point_layer', srs, ogr.wkbPoint)
# 添加属性字段,假设xml中有name和id两个属性
field_name = ogr.FieldDefn('name', ogr.OFTString)
field_name.SetWidth(50)
layer.CreateField(field_name)
field_id = ogr.FieldDefn('id', ogr.OFTInteger)
layer.CreateField(field_id)
# 遍历xml中的要素节点,假设要素节点标签为point
for point_elem in root.findall('point'):
# 获取坐标,假设x和y是子节点
x = float(point_elem.find('x').text)
y = float(point_elem.find('y').text)
# 获取属性
name = point_elem.find('name').text
pid = int(point_elem.find('id').text)
# 创建要素
feature = ogr.Feature(layer.GetLayerDefn())
feature.SetField('name', name)
feature.SetField('id', pid)
# 设置几何
geom = ogr.Geometry(ogr.wkbPoint)
geom.AddPoint(x, y)
feature.SetGeometry(geom)
# 写入图层
layer.CreateFeature(feature)
feature = None
# 释放资源
ds = None
方法三:借助GIS软件手动转换
如果不熟悉命令行和编程,也可以使用常见的GIS软件完成转换,比如QGIS、ArcGIS等,操作门槛更低。
以QGIS为例,操作流程如下:
- 打开QGIS,点击菜单栏的图层,选择添加图层,再选择添加矢量图层
- 在数据源中选择待转换的xml文件,如果xml是GML格式会直接识别,自定义格式可能需要手动选择解析方式
- 图层加载完成后,右键点击图层,选择导出,再选择保存要素为
- 在格式下拉框中选择ESRI Shapefile,设置输出路径和坐标系,点击确定即可完成转换
转换注意事项
转换过程中需要注意几个问题,首先是坐标系的一致性,xml中如果记录了坐标系信息,转换时要正确设置shp的坐标系,避免空间位置偏移。其次是属性字段的匹配,xml中的属性名称和类型要和shp中创建的字段对应,避免数据丢失。另外如果xml数据量较大,建议先测试小批量数据转换效果,确认无误后再处理全量数据。