自定义脚本实现mdb转为shp
摘 要
mdb转shp,你会说,使用ArcMap转换啊!
我没有,且在mdb的问题上,ArcGIS Pro与ArcMap由于64位应用架构的原因,已经各自安好了。
你会说,用FME啊,用ogr2ogr啊,自定义脚本啊,……
在地理信息系统(GIS)应用中,地理数据的存储和交换是一个常见的需求。个人文件地理数据库(MDB)是一种常见的地理数据存储格式,但是在实际应用中,有时需要将MDB文件转换为Shapefile(SHP)格式,以便在不同的GIS软件中使用。虽然听起来简单,但实际上这个过程可能会面临一些挑战。
回忆一下,是否还能记清它的脸……
ArcMap退出历史的舞台,ArcGIS Pro不再支持mdb数据库,我有一丝遗憾,但不痛。
直到最近,我只有ArcGIS Pro(ArcMap已收藏),基于Pro的Python环境进行开发时,mdb终于成为不能逃避的那一道坎。
一、需求背景
我需要入库一批数据,数据量很大,是省级量级的成果,数据按州市、区县、成果类型等文件夹一层层递进存放,到地理数据库时,文件夹最深的目录有7级。
此外,存放矢量数据的格式包括,gdb、mdb、shp,图层名、字段名,中英文切换自如……
如果使用ArcMap来处理这样的需求,是一个很简单的事情。但是如果使用ArcGIS Pro,那么问题就很大,很大……,全卡在mdb格式上。
二、ArcGIS Pro 使用数据互操作(没解决)
第一:你得有数据互操作模块许可;
第二:我尝试了一下,没解决。将过程记录一下。
第一步:授权数据互操作模块后,打开”快速转换“应用程序:
第二步:填写转换参数
第三步:安装Microsoft Access Driver(*.mdb)ODBC驱动程序,为什么是第三步,因为第一次使用,大概率你的环境缺失驱动,会得到这么一个报错信息:
PERSONAL_GEODATABASE reader: Unable to initialize ODBC connection to DSN for D:\data\tess.mdb,……
第四步:执行正确,除了字段名长度、一些字段属性值被忽略的警告,以及一些字符不能被正确解码等。能看到如下界面:
执行结果对比如下:
首先是,中文图层名、中文字段名未被正确解析。
其次是包含中文的属性值未能正确解析:
三、ogr2ogr GDAL 命令行工具(没解决)
又是一堆安装配置。
第一步:打开https://www.gisinternals.com/release.php
本人电脑是x64,下载对应版本release-1930-x64-gdal-3-8-4-mapserver-8-0-1.zip
第二步:解压压缩包
第三步:配置
(1)新增SDK_ROOT
变量名,值为D:\release-1930-x64-gdal-3-8-4-mapserver-8-0-1
(根据解压的路径设置)
(2)编辑path
变量,新增值
%SDK_ROOT%\bin;%SDK_ROOT%\bin\gdal\python\osgeo;%SDK_ROOT%\bin\proj\apps;%SDK_ROOT%\bin\gdal\apps;%SDK_ROOT%\bin\ms\apps;%SDK_ROOT%\bin\gdal\csharp;%SDK_ROOT%\bin\ms\csharp;%SDK_ROOT%\bin\curl;%PATH% GDAL_DATA=%SDK_ROOT%bin\gdal-data GDAL_DRIVER_PATH=%SDK_ROOT%\bin\gdal\plugins PYTHONPATH=%SDK_ROOT%\bin\gdal\python;%SDK_ROOT%\bin\ms\python PROJ_LIB=%SDK_ROOT%\bin\proj\SHARE;
第四步:打开命令行界面,输入ogr2ogr进行测试
第五步:输入命令
ogr2ogr -f "ESRI Shapefile" output.shp input.mdb
执行结果对比如下:
首先,对比ArcGIS Pro的数据转化工具,只是图层名乱码,中文字段名解析正确。
其次,包含中文的属性值也未能正确解析:
四、自定义脚本(解决)
过程如下:
(1)使用ogr读取数据,并正确解码中文图层名、字段名和包含中文的属性值;
(2)使用Fiona创建shape file,ogr也能创建shp,但是含中文的图层名或字段名都不能被识别,因为使用的是编码方式是ISO-8859-1;
(3)将ogr解析的几何对象和字段属性值,添加到shp文件中;
脚本执行过程如下图:
执行结果对比如下:
首先,中文图层名和中文字段名都能正确解析。
其次,包含中文的字段属性值也能正确解析。
五、归纳一下
使用自定义脚本的方式实现了mdb转shp,并且不乱码的需求。
剩余的工作:
(1)因为转出格式是shp,不能保持原mdb的数据组织结构,如存在数据集的情况;
(2)mdb中的表(dbf)未进行导出处理。
虽然MDB文件转换为SHP格式可能会面临一些挑战,但通过选择合适的工具和技术路线,并结合代码实现,我们可以轻松地完成这一任务。因此,无论是在GIS应用中的数据转换需求,还是在其他领域的数据处理工作中,我们都可以通过一些技术手段来解决问题,实现数据的有效管理和利用。