GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载ODBCOpen Database Connectivity是 GDAL/OGR 提供的通用数据库访问层。OGR 的 ODBC 驱动能够以统一的只读方式访问多种关系型数据库系统中的空间与非空间表在 Windows 与 Unix/Linux 平台均可使用在 Unix 下需通过 unixODBC、MDB Tools 等配置启用。阅读本文后你将掌握 ODBC 数据源连接串的完整语法含 DSN、用户密码、表清单、几何列与 SRS 表、GEOMETRY_COLUMNS 表的用法、空间过滤加速原理、ExecuteSQL() 方言选择以及直接打开 Microsoft Access 数据库.mdb/.accdb/.style的实操方法。一、驱动概览与适用范围OGR ODBC 驱动注册名ODBC位于仓库 ogr/ogrsf_frmts/odbc 目录由ogrodbcdatasource.cpp、ogrodbctablelayer.cpp、ogrodbclayer.cpp、ogrodbcselectlayer.cpp与ogrodbcdriver.cpp等源文件组成。其定位是一个通用访问层任何可以通过 ODBC 表示成数据库一组表的系统——包括各类 RDBMS以及形式上可视为表的文件型数据如 Microsoft Access 数据库——都可以经由此驱动接入 OGR。从驱动元数据见 ogrodbcdrivercore.cpp可以看到官方声明的能力连接前缀固定为ODBC:支持多图层GDAL_DCAP_MULTIPLE_VECTOR_LAYERSYES文件扩展名为mdb与accdb识别逻辑在 ogrodbcdrivercore.cpp 中实现支持的 SQL 方言包括NATIVE、OGRSQL与SQLITE只有一个数据集打开选项LIST_ALL_TABLES自 GDAL 3.4 起。值得说明的是ODBC 支持属于可选构建项在 Unix 平台上只有在编译时显式启用相关配置选项才会被包含进来其构建依赖为系统 ODBC 库ogr/ogrsf_frmts/odbc/CMakeLists.txt 中通过ODBC::ODBC链接。因此使用前应先确认你的 GDAL 构建包含该驱动。二、数据源连接串语法核心配置详解ODBC 数据源通过如下形式的连接串datasource name访问ODBC:userid/passworddsn, schema.tablename(geometrycolname),...:srs_tablename(sridcolumn,srtextcolumn)省略可选部分后以下形式同样合法ODBC:userid/passworddsn—— 完整认证 DSNODBC:useriddsn, table_list—— 指定用户并附带表清单ODBC:dsn, table_list—— 仅 DSN 表清单ODBC:dsn—— 仅 DSNODBC:dsn, table_list:srs_tablename—— 表清单 空间参考表。连接串的解析在 ogrodbcdatasource.cpp 的Open()中自右向左完成先用最后一个:分离出 SRS 表及其 SRID/SRTEXT 列再逐段提取逗号分隔的表清单表名后可带括号括起的几何列名最后以拆分userid/password与 DSN。各组成部分含义如下组成含义说明dsnODBC 数据源名称Data Source Name通常通过 ODBC 管理工具预先配置DSN 即用于访问该数据源的标识userid登录用户名可选若连接串中没有则整段被视为 DSNpassword登录密码可选以userid/passworddsn形式给出table_list逗号分隔的表名清单用于限定被作为图层暴露的表是重要的性能手段见下文schema.tablename(geometrycolname)带 schema 的表名及括号内的几何列名表名可含 schema 前缀如dbo.table括号内为可选几何列srs_tablename(sridcolumn,srtextcolumn)空间参考表及其列形如:srs_tablename(sridcolumn,srtextcolumn)用于维护 SRID 与 WKT 文本的映射从测试代码autotest/ogr/ogr_odbc.py可以看到三种典型连接方式的实际用例# ODBC:user/pwddsn 语法dsn 段也可以是内联的 DRIVER 连接串 ds odbc_drv.Open(ODBC:user/pwdDRIVERMicrosoft Access Driver (*.mdb);DBQpath/to/odbc.mdb) # ODBC:dsn 语法 ds odbc_drv.Open(ODBC:DRIVERMicrosoft Access Driver (*.mdb);DBQpath/to/odbc.mdb) # ODBC:dsn,table_list 语法 —— 限定只暴露 test 一个图层 ds odbc_drv.Open(ODBC:DRIVERMicrosoft Access Driver (*.mdb);DBQpath/to/odbc.mdb,test) assert ds.GetLayerCount() 1注意当数据源文件本身就是 MS Access 数据库扩展名为 .mdb/.accdb/.style时可以直接把文件名作为数据源传入驱动会自动完成 ODBC 连接无需手工构造 DSN详见下文第五节。三、图层发现机制GEOMETRY_COLUMNS、表清单与全部表驱动打开数据源后图层集合按如下优先级确定对应 ogrodbcdatasource.cpp 中的三段逻辑显式表清单优先如果连接串中提供了table_list则仅将这些表作为非空间图层暴露。在复杂数据库中枚举全部表的完整定义可能非常耗时因此限定表集合主要是一种性能优化手段——避免 OGR 为无关表逐一获取列定义。GEOMETRY_COLUMNS 表若未提供表清单驱动会尝试执行SELECT f_table_name, f_geometry_column, geometry_type FROM geometry_columns。一旦查询成功即用它来确定应作为图层处理的空间表集合以及每张表的几何来源列。回退为全部表若 GEOMETRY_COLUMNS 查询失败例如数据库中不存在该表则数据源中所有表都被返回为非空间图层。3.1 GEOMETRY_COLUMNS 表约定当 GEOMETRY_COLUMNS 表存在时它被用于挑选几何来源列。该表至少应包含以下三列F_TABLE_NAME—— 要素表名F_GEOMETRY_COLUMN—— 几何列名GEOMETRY_TYPE—— 几何类型。另外连接串中可以在表名后用圆括号显式指定几何列例如ODBC:dsn, schema.tablename(geomcol)。此时驱动会在 ogrodbctablelayer.cpp 的Initialize()中校验该列确实存在不存在时输出Column ... requested for geometry, but it does not exist错误并回退为非空间图层。3.2 几何格式的硬编码假设目前驱动对几何列格式采用硬编码假设若几何字段是二进制类型则视为 WKBWell Known Binary格式否则视为 WKTWell Known Text格式。这一判断发生在 ogrodbctablelayer.cpp当几何列的类型映射为SQL_C_BINARY时置bGeomColumnWKB TRUE。读取要素时ogrodbclayer.cpp驱动根据该标志分别调用OGRGeometryFactory::createFromWkb()或createFromWkt()重建几何对象。四、空间过滤加速XMIN/YMIN/XMAX/YMAX 外接矩形字段如果表含有几何列且同时包含名为XMIN、YMIN、XMAX、YMAX的字段那么带空间过滤器的直接表查询会被加速。这四个字段应表示该行几何在其表坐标系中的范围外接矩形。其原理见 ogrodbctablelayer.cpp当ResetStatement()重建查询语句时若同时存在空间过滤器m_poFilterGeom ! nullptr且表具有这四个范围字段bHaveSpatialExtents标志在初始化时检测四字段是否齐全见 ogrodbctablelayer.cpp驱动会把过滤器外包络直接翻译为 SQL 条件追加到语句中SELECT * FROM table WHERE XMAX minX AND XMIN maxX AND YMAX minY AND YMIN maxY这样外接矩形是否与过滤窗口相交的判断被下推给数据库引擎完成避免了把所有行都拉回客户端再逐个做几何过滤是典型的空间谓词下推优化。五、直接打开 Microsoft Access 数据库在满足如下前提时非空间的 MS Access 数据库注意不包括 Personal Geodatabase 或 Geomedia 数据库可以直接通过文件名打开Windows 平台需要安装 Microsoft Access Driver (*.mdb) ODBC 驱动Linux/Unix 平台需要安装 unixODBC 与 MDB Tools配置方法参考 PGeo 驱动文档 中How to use PGeo driver with unixODBC and MDB Tools一节其中包括 odbcinst.ini 中定义[Microsoft Access Driver (*.mdb)]段的步骤。驱动支持.mdb与.accdb两种扩展名同时额外支持 ESRI.style数据库扩展名它只是.mdb的别名。这一判断在 ogrodbcdrivercore.cpp 的OGRODBCDriverIsSupportedMsAccessFileExtension()中实现并被自动测试test_extensions()autotest/ogr/ogr_odbc.py覆盖分别用empty.style与empty.accdb文件验证了驱动可以打开并读出图层。在 Linux 上直接打开 .mdb 文件时OpenMDB()ogrodbcdatasource.cpp会先尝试注册 MDB Tools 驱动CPLODBCDriverInstaller::InstallMdbToolsDriver()并支持通过配置项MDB_DRIVER_TEMPLATE或 PGeo 驱动使用的PGEO_DRIVER_TEMPLATE自定义 DSN 模板——模板中必须恰好含有一个%s占位符以代入文件名例如DRIVERMicrosoft Access Driver (*.mdb);DBQ%s。此外该路径还会为语句设置RetrieveNumericColumnsAsDouble标志让数值字段直接以 double 读取避免数值经字符串转换造成精度损失。对于 MS Access 数据源默认情况下驱动会过滤掉系统内部表以MSys开头的表。相关逻辑见 ogrodbcdatasource.cpp过滤内部表与IsPrivateLayerName()ogrodbcdatasource.cpp。但通过GetLayerByName()仍可显式按名打开私有图层对应测试test_ogr_odbc_open_private_table()见 autotest/ogr/ogr_odbc.py。六、打开选项LIST_ALL_TABLES驱动支持一个数据集打开选项GDAL 3.4 起选项名取值默认说明LIST_ALL_TABLESYES/NONO设为YES时强制列出全部表包括系统表与内部表如 MSys* 表。仅适用于 Microsoft Access 数据库。注意Windows 平台的 Microsoft Access ODBC 驱动总是会剥除 MSys 表因此在 Windows 上即使设置LIST_ALL_TABLESYESMSys 表也不会被返回。选项在 ogrodbcdrivercore.cpp 的开放选项列表中被声明在OpenMDB()中通过CSLFetchNameValueDef(poOpenInfo-papszOpenOptions, LIST_ALL_TABLES, NO)读取ogrodbcdatasource.cpp。对应测试test_ogr_odbc_list_all_tables()autotest/ogr/ogr_odbc.py展示了实际效果默认打开null_memo.mdb时只有 1 个图层PROP传入open_options[LIST_ALL_TABLESYES]后图层数变为 12包括MSysObjects、MSysACEs、MSysQueries、MSysRelationships等全部 MSys 系统表且这些 MSys 层会被标记为私有层IsLayerPrivate()返回真。七、SQL 方言与 ExecuteSQL() 行为默认情况下SQL 语句被直接透传给底层数据库引擎执行NATIVE方言。同时也可以请求驱动使用 OGR SQL 引擎处理 SQL 命令只需在ExecuteSQL()方法中传入OGRSQL作为 SQL 方言名。驱动的ExecuteSQL()实现在 ogrodbcdatasource.cpp当方言被识别为通用 SQL 方言IsGenericSQLDialect()即 OGRSQL/SQLITE 等时走GDALDataset::ExecuteSQL()的通用实现否则将语句通过CPLODBCStatement直接提交给 ODBC 会话执行若语句不返回结果列如CREATE TABLE、INSERT等则返回空指针若有结果集则封装为OGRODBCSelectLayerogr/ogrsf_frmts/odbc/ogrodbcselectlayer.cpp返回并在读取完成后由ReleaseResultSet()负责释放。SELECT结果层的属性定义由BuildFeatureDefn()基于结果列构建ogrodbclayer.cppODBC 类型到 OGR 字段类型的映射规则如下ODBC 类型SQL_C_*OGR 字段类型SQL_C_SSHORT/SQL_C_USHORT/SQL_C_SLONG/SQL_C_ULONGOFTIntegerSQL_C_SBIGINT/SQL_C_UBIGINTOFTInteger64SQL_C_BINARYOFTBinarySQL_C_NUMERICOFTReal并携带列精度SQL_C_FLOAT/SQL_C_DOUBLEOFTRealSQL_C_DATEOFTDateSQL_C_TIMEOFTTimeSQL_C_TIMESTAMP/SQL_C_TYPE_TIMESTAMPOFTDateTime其他OFTString属性过滤SetAttributeFilter()与空间过滤SetSpatialFilter()在表图层上同样被翻译进 SQL见 ogrodbctablelayer.cpp并且驱动为表图层声明了OLCRandomRead能力只要表存在单列主键该列即被用作 FID多列主键则被整体忽略GetFeature()可按 FID 直接构造WHERE fid N查询ogrodbctablelayer.cpp。若表中存在名为OGR_FID的列可通过配置选项ODBC_OGR_FID覆盖其名称也会被当作 FID 列使用ogrodbclayer.cpp。八、写入限制当前为只读驱动目前 ODBC OGR 驱动是只读的OGR 应用通常无法通过它创建新的要素、表或数据源源码中CreateFeature、CreateField等接口在 ogr_odbc.h 中仍处于#ifdef notdef未启用状态数据源的TestCapability()也一律返回FALSE。此限制未来可能被移除。需要注意的是只读限制针对的是 OGR 要素/表创建能力并不妨碍你通过ExecuteSQL()在底层数据库上执行写操作如测试中的CREATE TABLE/INSERT见 autotest/ogr/ogr_odbc.py这类语句的成败取决于底层 ODBC 驱动与数据库本身是否允许。九、与相关驱动的关联ODBC 驱动与以下驱动存在联系可对照阅读PGeoESRI Personal GeoDatabase驱动参考 PGeo 驱动文档。PGeo 本身也是通过 ODBC 访问 Access 格式的 .mdb 文件但读取的是 ESRI 定义的一组元数据表。ODBC 驱动在识别扩展名时会特别处理.mdb文件若其中存在gdb_geomcolumns表则判定为 PGeo 数据库而移交见 ogrodbcdatasource.cpp且PGEO:前缀的路径不会被 ODBC 驱动认领ogrodbcdrivercore.cpp。MDB_DRIVER_TEMPLATE与PGEO_DRIVER_TEMPLATE两个配置项也共享同一套 DSN 模板机制。MSSQLSpatial 驱动位于 ogr/ogrsf_frmts/mssqlspatial同样基于 ODBC 技术栈但针对 SQL Server 的空间能力做了专门适配是 ODBC 通用层之外更专用的选择。十、快速上手从零开始验证 ODBC 驱动下面给出一条可立即执行的验证路径假设环境已具备 ODBC 驱动# 1. 确认 GDAL 中已注册 ODBC 驱动 ogrinfo --formats | grep -i odbc # 2. 用已配置的 DSN 列出数据源中的全部图层 ogrinfo ODBC:my_dsn # 3. 指定用户与密码 ogrinfo ODBC:userid/passwordmy_dsn # 4. 只暴露特定表性能优化并查看某图层详情 ogrinfo ODBC:my_dsn, myschema.mytable(geom) myschema.mytable # 5. 直接打开 MS Access 数据库文件 ogrinfo mydb.accdbPython 侧的最小示例对应仓库测试 autotest/ogr/ogr_odbc.py 的用法from osgeo import gdal, ogr # 打开带 LIST_ALL_TABLES 打开选项的数据集 ds gdal.Open(mydb.accdb, gdal.OF_VECTOR, open_options[LIST_ALL_TABLESYES]) for i in range(ds.GetLayerCount()): lyr ds.GetLayer(i) print(lyr.GetName(), lyr.GetFeatureCount())十一、注意事项与已知限制小结平台差异Unix 构建默认不包含 ODBC 支持需在配置阶段显式启用并链接系统 ODBC 库Windows 上依赖 Microsoft Access ODBC 驱动。MSys 表过滤Windows 平台的 Access ODBC 驱动总是剥除 MSys 系统表LIST_ALL_TABLESYES在 Windows 上对 MSys 表无效。几何格式假设二进制几何列按 WKB、文本几何列按 WKT 解析属当前硬编码行为。SRS 表连接串支持:srs_tablename(sridcolumn,srtextcolumn)形式的空间参考表参数但源码中相应缓存逻辑目前处于禁用状态见 ogrodbcdatasource.cpp 的#if 0注释块实际使用时应以当前版本行为为准。只读驱动OGR 层面的建表/建要素能力尚未开放写入需通过底层 SQL 完成。参考文档官方驱动文档doc/source/drivers/vector/odbc.rst关联的 PGeo 驱动文档doc/source/drivers/vector/pgeo.rst驱动核心实现ogr/ogrsf_frmts/odbc/ogrodbcdrivercore.cpp、ogr/ogrsf_frmts/odbc/ogrodbcdatasource.cpp图层实现ogr/ogrsf_frmts/odbc/ogrodbctablelayer.cpp、ogr/ogrsf_frmts/odbc/ogrodbclayer.cpp、ogr/ogrsf_frmts/odbc/ogrodbcselectlayer.cpp自动化测试autotest/ogr/ogr_odbc.py赞分享GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载相关推荐GDAL MSSQLSpatial 驱动详解用 OGR 读写 Microsoft SQL Server 空间数据库GDAL MSSQLSpatial 驱动详解用 OGR 读写 Microsoft SQL Server 空间数据库 GDAL 的 MSSQLSpatial 驱GIS遥感数据工程GDAL ADBC 驱动完全指南基于 Arrow Database Connectivity 访问数据库与 ParquetGDAL ADBC 驱动完全指南基于 Arrow Database Connectivity 访问数据库与 Parquet 本篇技术指南围绕 GDAL 中的GIS遥感数据工程GDAL/OGR HANA 驱动读取、写入与管理 SAP HANA 空间数据的完整指南GDAL/OGR HANA 驱动读取、写入与管理 SAP HANA 空间数据的完整指南 本文基于 GDAL 仓库中的 HANA 驱动文档 https://liGIS遥感数据工程上一篇【亲测免费】 探索AI情感理解Baidu的Senta项目下一篇探索GPUOpen-Effects的FidelityFX FSR2下一代图像升级技术创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考