mapgis矢量文件格式(*.wt*.wl*.wp)是由国内著名的GIS厂商-中地数码公司-研发的一套闭源矢量文件格式,是目前国内地学工程和科研领域最重要的矢量数据存储格式。随着近年来地质调查工作的转型升级,其对国民经济的支撑领域越来越广,与其他学科的交叉融合也越来越广泛、深入。在这种背景下,一种能够无损解析mapgis矢量文件空间数据的开源工具包愈发重要,对于地质空间数据交换,多源数据集成,及大数据挖掘等新形势下地调事业转型发展的现实需求具有积极意义。

坐标系解析

对于wtwpwl文件,其坐标系数据的保存位置和结构完全一致,主要内容如下:

内容 字节位置 字节数 类型 说明
投影类型 109 1 uint8 投影类型索引
椭球体类型 110 1 uint8 椭球体索引
比例尺 143 8 double 比例尺分母

椭球体索引系指mapgis安装路径中椭球体索引文件(一般位于mapgis67\program\ellip.dat)中的索引,投影类型索引类似。从此可知,mapgis矢量文件作为一种空间矢量数据本身是不完备的,文件不包含对坐标系的完备描述,文件的解析依赖于软件环境。 一般,常用到的北京54和西安80椭球体索引如下:

索引 大地基准 proj4定义
1 北京54 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_d
2 西安80 +a=6378140 +b=6356755.288157528

常用到的高斯克吕格投影(投影类型索引码为5),兰波特投影(投影类型索引码为3),艾尔伯斯投影(投影类型索引码为2),其相关参数存储结构如下:

内容 字节位置 字节数 类型 说明
中央经线 151 8 double  
起始纬线 175 8 double  
第一纬线圈 183 8 double  
第二纬线圈 191 8 double  
东偏移量 199 8 double  
北偏移量 207 8 double  

点文件解析

点文件整体可划分为索引数据区、坐标数据区和属性数据区。索引数据区记录坐标数据区和属性数据区的起始位置和大小。(以字节为单位,起始字节索引值为0)

内容 字节位置 字节数 类型 说明
文件头标识 0-7 8 string WMAP`D22
文件标识 8-11 4 int32 1
索引区起始位置 12-15 4 int32 索引区起始位置,设为offset
坐标数据区起始位置 offset-offset+3 4 int32 坐标数据区起始位置,设为coord_start
坐标数据区大小 offset+4-offset+7 4 int32 坐标数据区大小,设为coord_volumn
属性数据区起始位置 offset+20-offset+23 4 int32 属性数据区起始位置,设为attr_start
属性数据区大小 offset+24-offset+27 4 int32 属性数据区大小,设为attr_volumn

坐标数据区结构

坐标数据区每93字节存储一个坐标,其第一个93字节空间不存储数据,所以总数为coord_volumn/93-1。每个数据区93个字节的数据结构如下:

内容 字节位置 字节数 类型 说明
X坐标 7-14 8 双精度浮点型 X坐标值
Y坐标 15-22 8 双精度浮点型 Y坐标值

属性数据区结构

属性数据区前330个字节的主要信息如下:

内容 字节位置 字节数 类型 说明
字段数 322-323 2 int16 字段数,设为fields_n
记录数 324-327 4 int32 记录数,设为record_n
单条记录大小 328-329 2 int16 单条记录大小,设为record_volumn

从第349个字节开始,fields_n*39个字节记录了fields_n个字段的名称、类型和存储位置(相对于每条记录的起始位置)。每个字段占用39个字节,其结构如下:

内容 字节位置 字节数 类型 说明
字段名称 0-19 20 string 字段名
字段类型 20 1 uint8 字段类型
存储位置 21-24 4 int32 存储位置,设为field_offset

字段类型取值范围为0-7,0代表string,1代表byte,2代表short interger,3代表interger,4代表float,5代表double,6代表date,7代表time。 从349+39*fields_n个字节开始,record_n*record_volumn个字节存储了record_n条记录数据。每条记录占用record_volumn个字节,按照上述字段的类型和顺序依次保存。需要注意的是,第一条记录为空,不存储数据。每个字段的存储位置与下个字段的存储位置的差值即为该字段的存储空间大小;最后一个字段的存储空间大小为其存储位置与单条记录大小record_volumn的差值。

线文件解析

线文件整体可划分为索引数据区、线数据区、坐标数据区和属性数据区。索引数据区记录其他数据区的起始位置和大小。(以字节为单位,起始字节索引值为0)

内容 字节位置 字节数 类型 说明
文件头标识 0-7 8 string WMAP`D21
文件标识 8-11 4 int32 0
索引区起始位置 12-15 4 int32 索引区起始位置,设为offset
线数据区起始位置 offset-offset+3 4 int32 线数据区起始位置,设为line_start
线数据区大小 offset+4-offset+7 4 int32 线数据区大小,设为line_volumn
坐标数据区起始位置 offset+10-offset+13 4 int32 坐标数据区起始位置,设为coord_start
坐标数据区大小 offset+14-offset+17 4 int32 坐标数据区大小,设为coord_volumn
属性数据区起始位置 offset+20-offset+23 4 int32 属性数据区起始位置,设为attr_start
属性数据区大小 offset+24-offset+27 4 int32 属性数据区大小,设为attr_volumn

线数据区结构

线数据区每57个字节存储一个线索引信息,其第一个57字节空间不存储数据,所以总线数为line_volumn/57-1。每个线数据区57个字节的数据结构如下:

内容 字节位置 字节数 类型 说明
锚点数目 10-13 4 int32  
锚点坐标存储位置 14-17 4 int32 起始锚点坐标存储偏移(相对于坐标数据区起始位置)

坐标数据区结构

坐标数据区16个字节保存一对双精度浮点型锚点坐标,锚点坐标按照上述线数据区结构中每条线的锚点数量,顺序存储。

属性数据区结构

线属性数据区结构与点属性数据区结构完全一致。

区文件解析

区文件整体可划分为索引数据区、线数据区、坐标数据区、区数据区和属性数据区。索引数据区记录其他数据区的起始位置和大小。(以字节为单位,起始字节索引值为0)

内容 字节位置 字节数 类型 说明
文件头标识 0-7 8 string ‘WMAP`D23’
文件标识 8-11 4 int32 2
索引区起始位置 12-15 4 int32 索引区起始位置,设为offset
线数据区起始位置 offset-offset+3 4 int32 线数据区起始位置,设为line_start
线数据区大小 offset+4-offset+7 4 int32 线数据区大小,设为line_volumn
坐标数据区起始位置 offset+10-offset+13 4 int32 坐标数据区起始位置,设为coord_start
坐标数据区大小 offset+14-offset+17 4 int32 坐标数据区大小,设为coord_volumn
区数据区起始位置 offset+30-offset+33 4 int32 区数据区起始位置,设为poly_start
区数据区大小 offset+34-offset+37 4 int32 区数据区大小,设为poly_volumn
属性数据区起始位置 offset+90-offset+93 4 int32 属性数据区起始位置,设为attr_start
属性数据区大小 offset+94-offset+97 4 int32 属性数据区大小,设为attr_volumn

线数据区结构

线数据区每57个字节存储一个线索引信息,其第一个57字节空间不存储数据,所以总线数为line_volumn/57-1。每个线数据区57个字节的数据结构如下:

内容 字节位置 字节数 类型 说明
锚点数目 10-13 4 int32  
锚点坐标存储位置 14-17 4 int32 起始锚点坐标存储偏移(相对于坐标数据区起始位置)

坐标数据区结构

坐标数据区16个字节保存一对双精度浮点型锚点坐标,锚点坐标按照上述线数据区结构中每条线的锚点数量,顺序存储。

区数据区结构

区数据区每24个字节保存上述线数据区对应线所属的号及与其拓扑关系。第一个24字节不存储数据,其他每个24字节的数据结构如下:

内容 字节位置 字节数 类型 说明
左所属区号 8-11 4 int32  
右所属区号 12-15 4 int32  

属性数据区结构

区属性数据区结构与点属性数据区结构完全一致。