GML即Geography Markup Language(地理标记语言),是一种用于表达地理空间数据的XML语法规范。它由开放地理空间信息联盟(OGC)提出,目的是让各类地理信息系统之间可以用一种中立、可读的文本格式交换矢量、栅格、拓扑和时态信息,而不依赖某家厂商的私有二进制结构。

GML的设计原理与核心概念
GML建立在XML基础之上,因此天然具备树状结构、命名空间与模式校验能力。一个GML文档通常由根元素、坐标系定义、要素类型声明和具体的几何对象组成。它并不强制规定只表达某一种地理数据,而是通过GML Schema让用户自定义要素(Feature)和几何(Geometry)的结构,这也是它比传统交换格式灵活的地方。
在底层原理上,GML把现实世界抽象为“要素—属性—几何”三层。要素是带有标识的地理对象,比如一条河流或一个监测站;属性描述要素的非空间特征,例如名称、编号;几何则给出坐标与拓扑。由于全部内容都是文本节点,任何支持XML的解析器都能读取GML,无需专用GIS内核。
坐标系与命名空间
坐标系在GML中通过srsName属性引用,常见如EPSG编码。若忽略该属性,解析程序往往默认使用WGS84经纬度,但这在严谨生产中容易引发偏移错误。命名空间则用来区分GML基础标签与用户扩展标签,避免不同机构的定义互相冲突。
<?xml version="1.0" encoding="UTF-8"?>
<gml:FeatureCollection
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:my="http://ipipp.com/ns">
<gml:featureMember>
<my:Station gml:id="st01">
<my:name>城北监测点</my:name>
<my:position>
<gml:Point srsName="EPSG:4326">
<gml:pos>116.39 39.91</gml:pos>
<gml:Point>
</my:position>
</my:Station>
</gml:featureMember>
</gml:FeatureCollection>
GML与常见地理数据格式对比
和Shapefile、GeoJSON相比,GML最明显的特征是“重”与“严”。Shapefile由多个二进制文件构成,读写快但字段名受限;GeoJSON轻量且被Web广泛支持,却缺少官方的复杂拓扑描述能力。GML通过XML Schema可表达复杂的几何与关系,适合作为数据归档与跨组织分发的长期格式。
| 格式 | 结构类型 | 可读性 | 拓扑支持 |
|---|---|---|---|
| Shapefile | 二进制多文件 | 低 | 弱 |
| GeoJSON | 文本JSON | 高 | 中 |
| GML | 文本XML | 中 | 强 |
在实践中,很多单位内部用Shapefile做编辑,对外共享时转换为GML,以保证接收方可以用标准XML工具校验。这样的组合兼顾效率与互通,也是OGC服务(如WFS)默认返回GML的原因。
用代码解析GML要素
由于GML是标准XML,我们可以用任意XML库处理。下面以Python为例,提取上面示例中的监测站名称和坐标。注意真实项目中应先验证Schema,再解析,避免非法文档导致异常。
import xml.etree.ElementTree as ET
text = '''<?xml version="1.0"?>
<gml:FeatureCollection
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:my="http://ipipp.com/ns">
<gml:featureMember>
<my:Station gml:id="st01">
<my:name>城北监测点</my:name>
<my:position>
<gml:Point srsName="EPSG:4326">
<gml:pos>116.39 39.91</gml:pos>
</gml:Point>
</my:position>
</my:Station>
</gml:featureMember>
</gml:FeatureCollection>'''
root = ET.fromstring(text)
ns = {'gml': 'http://www.opengis.net/gml/3.2',
'my': 'http://ipipp.com/ns'}
name = root.find('.//my:name', ns).text
pos = root.find('.//gml:pos', ns).text
print('名称:', name)
print('坐标:', pos)
上述代码演示了命名空间配合XPath的查询方式。若文档符合Schema,我们还能借助lxml绑定复杂类型,把GML直接映射为Python对象,从而在生产环境中减少手工取值的错误。
GML的应用场景与注意事项
GML常用于政府地理数据共享、气象网格发布以及历史地图归档。在这些场景中,数据要被多个异构系统长期读取,文本化和可校验的特性比体积更重要。另外,GML也作为WFS、GMLJP2等标准的基础,支撑着Web端的空间服务。
使用GML时要注意三点:一是控制文档规模,海量点数据直接写GML会非常臃肿,可分包或改用压缩传输;二是务必声明srsName,否则坐标含义模糊;三是尽量附带Schema文件,方便对方校验。把握好这些,GML就能成为可靠的地理信息载体。