Mapgis文件解析
mapgis矢量文件格式(*.wt
,*.wl
,*.wp
)是由国内著名的GIS厂商-中地数码公司-研发的一套闭源矢量文件格式,是目前国内地学工程和科研领域最重要的矢量数据存储格式。随着近年来地质调查工作的转型升级,其对国民经济的支撑领域越来越广,与其他学科的交叉融合也越来越广泛、深入。在这种背景下,一种能够无损解析mapgis矢量文件空间数据的开源工具包愈发重要,对于地质空间数据交换,多源数据集成,及大数据挖掘等新形势下地调事业转型发展的现实需求具有积极意义。
坐标系解析
对于wt
、wp
、wl
文件,其坐标系数据的保存位置和结构完全一致,主要内容如下:
内容 | 字节位置 | 字节数 | 类型 | 说明 |
---|---|---|---|---|
投影类型 | 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 |
属性数据区结构
区属性数据区结构与点属性数据区结构完全一致。