在系统集成和空间数据交换中,用XML描述地理位置已经成为很多老系统的标配。单纯把经纬度写成两个浮点数,虽然人能看懂,但机器无法确定坐标系、精度和高程基准,导致不同平台解析出来的位置偏差几公里甚至更多。业界因此定义了多种基于XML的地理编码标准,让坐标、几何形状和参考系统可以被明确声明和自动校验。

为什么不能用随意的XML标签存坐标
不少初学者会写出类似下面的片段,把经度纬度当成普通字段:
<location> <lat>39.9042</lat> <lon>116.4074</lon> </location>
这段代码最大的问题是丢失了空间语义。解析程序不知道这是WGS84还是GCJ-02偏移坐标,也不清楚单位是不是十进制。当数据进入GIS引擎,往往被默认当作WGS84处理,在国内地图上就会产生明显偏移。此外,这种写法无法表达线、面、轨迹等复杂空间对象,更不支持带时间维度的动态轨迹。
标准格式的核心价值,就是把坐标系(CRS)、几何类型、精度信息用统一命名空间固定下来。这样任何支持该标准的客户端,都能在不写特殊逻辑的情况下正确还原空间位置。同时也方便使用XSD进行结构校验,避免脏数据进入生产库。
GML:最严谨的地理XML标准
GML(Geography Markup Language)由开放地理空间联盟(OGC)制定,是目前最完整的XML空间数据编码规范。它使用gml命名空间,可以表达点、线、面、曲面以及复杂的要素集合。一个最基础的GML点坐标写法如下:
<?xml version="1.0" encoding="UTF-8"?>
<gml:Point xmlns:gml="http://www.opengis.net/gml/3.2"
srsName="urn:ogc:def:crs:EPSG::4326">
<gml:pos>39.9042 116.4074</gml:pos>
</gml:Point>
这里srsName指向EPSG 4326,也就是常见的WGS84经纬度坐标系。gml:pos内部先写纬度再写经度,用空格分隔,这是GML的既定顺序,不能颠倒。如果需要带高程,可以写成三维坐标:39.9042 116.4074 50.0。
GML的优势在于可扩展性极强,既能描述纯几何,也能通过gml:Feature绑定属性信息,例如某栋建筑的名称和楼层。缺点是标签冗长、文件体积大,在移动互联网场景里传输成本偏高。因此在轻量接口中,很多团队会选择更简单的GeoRSS或GeoJSON(非XML)来降低负载。
GeoRSS:轻量级地理XML方案
GeoRSS是在RSS基础上扩展的简易地理格式,适合新闻推送、设备上报等简单场景。它支持W3C Geo和GeoRSS GML两种子格式,其中W3C Geo最为精简:
<item> <title>设备位置上报</title> <geo:lat xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">39.9042</geo:lat> <geo:long xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">116.4074</geo:long> </item>
这种写法明确使用WGS84位置命名空间,标签短小,容易被各种聚合器识别。但它只能表达点,不能画路线或区域。如果需要更复杂几何,就要改用GeoRSS GML,其实就是在RSS里嵌入一小段GML片段。
实际选型时,内部大数据平台互传建议用完整GML保证精度与可校验性;对外公开接口或移动端轮询,用GeoRSS能显著减少流量。无论哪种,都必须在文档里声明坐标系,否则再漂亮的XML也只是自说自话。
自定义XML时的避坑建议
如果因历史原因必须自定义XML而不是套用标准,至少要遵守几条规矩。第一,用属性或子元素固定srsName;第二,统一坐标顺序并在注释里写清;第三,对边界框用minx miny maxx maxy结构,别混用左右上下说法。
<spatialExtent crs="EPSG:4326">
<bbox>
<minLat>39.0</minLat>
<minLon>116.0</minLon>
<maxLat>40.0</maxLat>
<maxLon>117.0</maxLon>
</bbox>
</spatialExtent>
上面的示例把坐标系写在根属性,四个边界各自命名,避免了解析歧义。配合XSD校验,可以在入口处拦掉不符合规范的数据。记住,XML表达地理位置不是把数字写进去就行,而是让机器零成本理解这些数字背后的地球参照。
小结对比
我们把三种方式放在一张表里看差异:
| 格式 | 复杂度 | 几何能力 | 适用场景 |
|---|---|---|---|
| 自定义标签 | 低 | 仅点 | 内部简单上报 |
| GeoRSS | 低到中 | 点为主 | 消息推送、轻量接口 |
| GML | 高 | 点线面及要素 | GIS交换、严谨建模 |
理解了这些标准格式,你在设计接口或解析第三方地理XML时,就能直接对照规范写代码,而不是凭感觉猜标签含义。地理位置数据的正确性,往往就藏在那一个命名空间和坐标顺序里。