众所周知,arcgis依然是目前最流行的gis数据管理制作平台。在gis领域,仍然要将arcgis支持的矢量数据读取。首先,简单介绍下gdb数据。在ArcGIS软件中,地理数据库分为两种,File Geodatabase(文件地理数据库)和Personal Geodatabase(个人地理数据库)。
一、数据库内容介绍
1.1 文件地理数据库GDB
文件地理数据库(File Geodatabase)数据后缀表达为.gdb,整体组织为文件夹,可以存储、查询和管理空间数据和⾮空间数据。在不使用DBMS的情况下能够扩展并存储大量数据。文件地理数据库可同时有多个用户使用,但一个数据只能有一个用户编辑。因此,一个文件地理数据库可以由多个编辑者访问,但必须编辑不同的数据。
1.2 个人地理数据库MDB
个人地理数据库(Personal Geodatabase)数据后缀表达为.mdb,整体组织为文件,所有的数据集都存储于Microsoft Access数据文件内,在Microsoft Access数据文件中存储和管理。
二、gdb数据库格式介绍说明
gdb数据存放在如上所示的目录中,除非你非常熟悉相关领域数据管理,否则不要轻易去编辑这些文件。
三、在Qgis中打开gdb数据,事先预览
如果你没有测试数据,可以从以下网站下载演示数据,http://horizon2021.xyz/,
我们下载全国行政区划的gdb数据,解压后,将gdb文件夹拖到qgis中展示,可以看到以下空间信息。
打开任意的图层属性表格,以分省为例:
四、使用Gdal读取解析gdb数据
对于gdal常规操作等见之前的系列文章gis利器之Gdal(二)shp数据读取和windows下gdal的java开发环境搭建。这里不再赘述。读取gdb时,注意使用以下驱动
// 读取数据,这里以gdb文件为例StringstrDriverName="OpenFileGDB"; // 创建一个文件,根据strDriverName扩展名自动判断驱动类型org.gdal.ogr.DriveroDriver=ogr.GetDriverByName(strDriverName); 其它的信息跟读取shp文件是一样的。详细代码如下所示:publicvoidtestReadGdb() { // 指定文件的名字和路径StringgdbFile="F:\\vector_data\\other\\中国行政区划数据.gdb\\中国行政区划数据.gdb"; // 注册所有的驱动ogr.RegisterAll(); // 为了支持中文路径,请添加下面这句代码gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); // 为了使属性表字段支持中文,请添加下面这句gdal.SetConfigOption("SHAPE_ENCODING", "CP936"); // 读取数据,这里以gdb文件为例StringstrDriverName="OpenFileGDB"; // 创建一个文件,根据strDriverName扩展名自动判断驱动类型org.gdal.ogr.DriveroDriver=ogr.GetDriverByName(strDriverName); if (oDriver==null) { System.out.println(strDriverName+" 驱动不可用!\n"); return; } DataSourcedataSource=oDriver.Open(gdbFile, 0); for(inti=0;i<dataSource.GetLayerCount();i++) { LayerlayerIdx=dataSource.GetLayer(i); System.out.println("图层名称:<==>"+layerIdx.GetName()); } Layerlayer=dataSource.GetLayer("分省"); StringlayerName=layer.GetName(); System.out.println("图层名称:"+layerName); SpatialReferencespatialReference=layer.GetSpatialRef(); //System.out.println(spatialReference);System.out.println("空间参考坐标系:"+spatialReference.GetAttrValue("AUTHORITY", 0) +spatialReference.GetAttrValue("AUTHORITY", 1)); double[] layerExtent=layer.GetExtent(); System.out.println("图层范围:minx:"+layerExtent[0] +",maxx:"+layerExtent[1] +",miny:"+layerExtent[2] +",maxy:"+layerExtent[3]); FeatureDefnfeatureDefn=layer.GetLayerDefn(); intfieldCount=featureDefn.GetFieldCount(); Map<String,String>fieldMap=newHashMap<String,String>(); for (inti=0; i<fieldCount; i++) { FieldDefnfieldDefn=featureDefn.GetFieldDefn(i); // 得到属性字段类型intfieldType=fieldDefn.GetFieldType(); StringfieldTypeName=fieldDefn.GetFieldTypeName(fieldType); // 得到属性字段名称StringfieldName=fieldDefn.GetName(); fieldMap.put(fieldTypeName, fieldName); } System.out.println(fieldMap); longfeatureCount=layer.GetFeatureCount(); System.out.println("图层要素个数:"+featureCount); Featurefeature2=null; while((feature2=layer.GetNextFeature()) !=null) { //System.out.println(feature2.GetGeometryRef().ExportToJson());System.out.println(feature2.GetFieldAsString("Shape_Area") +"\t"+feature2.GetFieldAsString("省区")); } oDriver.delete(); gdal.GDALDestroyDriverManager(); }
控制台输出以下信息:
总结
本文介绍了arcgis下gdb和mdb数据库文件,简单比较了两者的区别。文中提供了演示用的gdb数据的下载网址和数据目录展示,并采用qgis进行数据预览,最终给出了给予gdal的gdb数据解析完整代码。