CAD数据不通过ArcGIS导出为MDB

  • 从南方CASS的宣传文章中了解到可以不通过ArcGIS中间件导出为MDB
  • 从GDAL对MDB文件的介绍中了解到,MDB中的Shape字段存储的图形Blob信息和Shp文件写入图形的方式一致

OGR optionally supports reading ESRI Personal GeoDatabase .mdb files via ODBC. Personal GeoDatabase is a Microsoft Access database with a set of tables defined by ESRI for holding geodatabase metadata, and with geometry for features held in a BLOB column in a custom format (essentially Shapefile geometry fragments). This drivers accesses the personal geodatabase via ODBC but does not depend on any ESRI middle-ware.

OGR 可以选择支持通过 ODBC 读取 ESRI 个人地理数据库.mdb文件。个人地理数据库是一个 Microsoft Access 数据库,其中包含一组由 ESRI 定义的表,用于保存地理数据库元数据,以及以自定义格式保存在 BLOB 列中的要素的几何(实质上是 Shapefile 几何片段)。此驱动程序通过 ODBC 访问个人地理数据库,但不依赖于任何 ESRI 中间件。

ESRI Personal GeoDatabase — GDAL documentationhttps://gdal.org/drivers/vector/pgeo.html

  • 通过对NetTopologySuite.IO.Esri 项目的学习,对现有MDB中Blob字段的读取进行一定的验证,确实符合前面的介绍

  •  接着通过对C# NTS 的学习,可以通过将CAD的图形数据转为NTS 图形类型,再通过NetTopologySuite.IO.Esri 项目的魔改,可以将CAD图形数据写入现有MDB图层Shape字段中

  • 接着分析MDB中以“GDB_”开头的辅助图层,发现创建图层后,需要修改三个“GDB_”开头的辅助图层,即可通过ArcMAP打开,分别是:GDB_Items、GDB_GeomColumns、GDB_SpatialRefs和GDB_ItemRelationships,他们的关系:
  • GDB_Items与GDB_ItemRelationships的关系

  • GDB_Items表中Definition字段中XML的规则

  •  GDB_Items、GDB_SpatialRefs和GDB_GeomColumns之间的关系
  •  从ArcMAP导出一个无坐标系的只有一个图层的MDB,然后把关于这个图层的信息删除,就得到一个MDB模板,每次创建新图层后,仅需修改三个辅助图层GDB_Items、GDB_GeomColumns和GDB_ItemRelationships

下面是创建MDB图层SQL

CREATE TABLE Persons ( OBJECTID AUTOINCREMENT PRIMARY KEY, SHAPE IMAGE, SHAPE_Length Double, SHAPE_Area Double )

如果需要额外字段,请注意将Shape字段放在最后,其他字段置于OBJECTID与SHAPE中间,例如:

CREATE TABLE Persons ( OBJECTID AUTOINCREMENT PRIMARY KEY,长文字 Memo,角度 Double,创建时间 DATETIME, SHAPE IMAGE, SHAPE_Length Double, SHAPE_Area Double )

由于未找到ACCESS 建表时给定时间字段默认值,在代码中需要主动填写时间默认值

​
object value = pFeature.Attributes.GetOptionalValue(pFieldNamePair.Key);
if (value == null)
{
    if (pFieldNamePair.Value == OleDbType.Date)
    {
        // 赋予默认值
        cmd.Parameters[pFieldNamePair.Key].Value = Convert.ToDateTime("1970-9-10 9:30"); ;
    }
}
else
{
     cmd.Parameters[pFieldNamePair.Key].Value = value;
}
​

对于64位CAD中访问32位MDB的方式,可通过AccessDatabaseEngine_X64.exe 来解决。

参考来源:关于安装AccessDatabaseEngine_x64.exe 的说明 - AlexLeeLi - 博客园 (cnblogs.com)

测试代码

百度云盘链接:https://pan.baidu.com/s/1z0stEefX3dm34dsP39nk7g?pwd=e6c2 

运行代码后会生成一个MDB,其中存在test线图层,有一个线要素。

 

 

当前未解决问题:

  1. 图层索引未建立
  2. 坐标系为未知坐标系
  3. GDB_Items表 Definition字段的XML中关于字段的介绍未补全(不影响ArcMap读取)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值