liujiusheng / blog

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

告别GDAL,用Go Lang从ESRI File Geodatabase (FileGDB)快速解析数据(3) #251

Open liujiusheng opened 2 years ago

liujiusheng commented 2 years ago

GDB的文件结构

整个GDB数据库在Windows下实质是一个文件夹,里面通过文件名和文件后缀两个维度。

到目前为止,GDB也经历了两个大的规范版本9和10,由于现在主要使用10,所以不对9进行展开。

文件命名格式为a[number in lowercase hex].[extension]

a00000001 是第一个文件, a00000002是第二个文件,且数字可能被跳过。

在 FileGDB v10中,前8个文件 (a00000001 to a00000008) 是固定不变的内置文件,被预留来保存数据库本身的元数据,后续的文件被用来存放实际的要素信息(a00000009, a0000000a, ...)

GDB看作一个整体,将整个数据库的文件列表、整个数据库的配置信息、每张数据表的坐标系、每张表的metadata、GDB_ItemRelationships、GDB_ItemRelationshipTypes、GDB_ItemTypes等单独抽离出来存储。从a000000009开始的表才真正存放用户的实际数据,且a000000009之后的所有文件内不存放坐标系和metadata,只存放字段信息和每一行数据。暂时还不清楚GDB_ItemRelationships、GDB_ItemRelationshipTypes、GDB_ItemTypes到底是什么,可能是拓扑检查需要的东西。

例如,FID 37的记录(这里采用的FID编号惯例是从1开始的)将在文件a00000025中(译者注:10进制的37用16进制表示为25)。在这个目录表中可能有被删除的行,因此在FID编号中存在空白。

在.a00000001.gdbtable中暂时没找到FID这一个属性列,里面的ID列实际类型是objectid,所以不能直接拿来对比使用。

这个表里还包含NameFileFormat字段。FileFormat字段的值多数时候是0,在少部分内置保留表中是2。

所有行都是唯一的,所以如果有3个Feature类,它们都具有相同的坐标系,但其中一个具有不同的ZTolerance,那么就会有两行记录。

  1. UUID (UUID) : UUID
  2. Type (UUID) : item type
  3. Name (string) : item/layer name. Matches the Name field of the GDB_SystemCatalog
  4. PhysicalName (string) : item/layer name in upper case characters.
  5. Path (string) : "\mylayername" for top-level layers or "\myfeaturedataset\mylayername" for layers attached to a feature dataset "myfeaturedataset"
  6. DatasetSubType1 (int32) : 1 for user tables (TBC)
  7. DatasetSubType2 (int32) : layer geometry type. 1 for point layer, 2 for multipoint layers, 3 for linestring layers, 4 for polygon layers
  8. DatasetInfo1 (string) : "SHAPE" for user tables (TBC)
  9. DatasetInfo2 (string) : NULL for user tables (TBC)
  10. URL (string) : empty string (TBC)
  11. Definition (XML) : DEFeatureClassInfo XML element. Contains an XML version of the information that can be obtained by parsing the header of a table : fields, SRS, ...
  12. Documentation (XML) : metadata XML element
  13. ItemInfo (XML) : NULL for user tables (TBC)
  14. Properties (int32) : 1 for user tables (TBC)
  15. Defaults (binary) : absent for user tables (TBC)
  16. Shape (geometry) : 5 point polygon listing the corner of the bounding box of the layer reprojected into EPSG:4326 (even if the layer SRS is not EPSG:4326). Or missing if the layer SRS is undefined.

一些特殊记录:

  1. The first record is reserved for a kind of root item ( Name = "", Path = "" ).
  2. The second record is reserved for a Name = "Workspace" item, Path = "", Definition containing a DEWorkspace XML element
  3. When there are feature datatesets, they also appear as records : e.g. Name = "featuredataset", PhysicalName = "FEATUREDATASET", Path = "\FEATUREDATASET", Definition containing a DEFeatureDataset XML element