liujiusheng / blog

个人博客,blog
19 stars 0 forks source link

GoLang解析FileGDB(4).gdbtable文件规范 #252

Open liujiusheng opened 2 years ago

liujiusheng commented 2 years ago

.gdbtable文件规范

.gdbtable是实际存放数据的地方,所以这个文件通常比较大。

.gdbtable文件描述字段并包含行数据。

包括header、field、row三部分内容。

Header (40 bytes)


Field 部分


固定部分

重复部分(每一个field都有)

紧接着是:字段的描述(重复次数与字段的数量相同)

字段说明的下一个字节取决于字段类型

field type = 4 (string),

field type = 6 (objectid),

If geometry has z values (bit 31 of layer geometry type flags):

If geometry has m values (bit 30 of layer geometry type flags):

Then, values relating to the spatial index for the field:

field type = 8 (binary),

field type = 9 (raster),

field type = 10, 11 (UUID)

field type = 12

其它field types,

如果标志字段的lsb(当存在时)设置为1,那么记录中该字段可以为空

Rows


行部分不一定紧跟着最后一个字段说明,它通常在几个字节之后开始,但不是以一种可预测的方式。

注意:

对于ESRI FGDB SDK API创建的FGDB layers,字段描述部分的结束和行部分的开始之间有4个字节:0xDE 0xAD 0xBE 0xEF

rows部分是一个X行的序列(其中X是. gdbtablex中发现的features的总数,可能与.gdbtable头文件中发现的有效行数不同)

Row具体描述

int32: length in bytes of the row blob ( this field excluded) ceil(number_nullable_fields / 8) * ubyte: 通过一个flags来标记哪些字段是空的,number_nullable_fields指可以为空的字段,这在arcgis里面能看到哪些字段可以为空,objectid不能为空所以不能参与这里的运算,shape字段可以为空所以要参与这里的运算,数出有多少个可以为空的字段后除以8然后向上取整,就知道应该保留多少个bytes来记录这些信息了。指具体内容如下。

Null fields flags

这个地方记录方法是使用n个bytes来存放字段为空的信息,n的计算方法ceil(number_nullable_fields / 8),但实际存放是通过8位的二进制bit来控制的,如:11111100表示前两个字段不为空。1代表该字段没有值,0代表该字段有值,而且排序是从后面往前排的,通常第一个字段是shape空间数据字段。如果字段比较多是用两个或多个bytes来存放这些信息的也需要整体从最后开始倒排。我们在用flexhex调试查看时是看到的16进制的数据而不是二进制的bit。

Each bit of the flags field encode for the presence or absence of the field content, for a nullable field, for the row. The flag is set to 1 if the field is missing/null (1 is used as well for spare bits), or 0 if the field is present/non-null. The flag for the first field, in the order of the fields of the field description section (typically the geometry), is the least significant bit of the first byte of the flags field.

There are no bits reserved for non-nullable fields.

If all fields are non-nullable, the flag field is absent.

Note: there's no explicit data for OBJECTID and no reserved flag bit for it.

For each non-null field, the field content is appended in the order of the fields of the field description section.

string类型字段值是用utf-8进行编码的(这一点在英文版文档中没有注明)