gis利器之Gdal(三)gdb数据读取
众所周知,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文件为例 String strDriverName = "OpenFileGDB"; // 创建一个文件,根据strDriverName扩展名自动判断驱动类型 org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);
其它的信息跟读取shp文件是一样的。详细代码如下所示:
@Test public void testReadGdb() { // 指定文件的名字和路径 String gdbFile = "F:\\vector_data\\other\\中国行政区划数据.gdb\\中国行政区划数据.gdb"; // 注册所有的驱动 ogr.RegisterAll(); // 为了支持中文路径,请添加下面这句代码 gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); // 为了使属性表字段支持中文,请添加下面这句 gdal.SetConfigOption("SHAPE_ENCODING", "CP936"); // 读取数据,这里以gdb文件为例 String strDriverName = "OpenFileGDB"; // 创建一个文件,根据strDriverName扩展名自动判断驱动类型 org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName); if (oDriver == null) { System.out.println(strDriverName + " 驱动不可用!\n"); return; } DataSource dataSource = oDriver.Open(gdbFile, 0); for(int i = 0;i<dataSource.GetLayerCount();i++) { Layer layerIdx = dataSource.GetLayer(i); System.out.println("图层名称:<==>" + layerIdx.GetName()); } Layer layer = dataSource.GetLayer("分省"); String layerName = layer.GetName(); System.out.println("图层名称:" + layerName); SpatialReference spatialReference = 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]); FeatureDefn featureDefn = layer.GetLayerDefn(); int fieldCount = featureDefn.GetFieldCount(); Map<String,String> fieldMap = new HashMap<String,String>(); for (int i = 0; i < fieldCount; i++) { FieldDefn fieldDefn = featureDefn.GetFieldDefn(i); // 得到属性字段类型 int fieldType = fieldDefn.GetFieldType(); String fieldTypeName = fieldDefn.GetFieldTypeName(fieldType); // 得到属性字段名称 String fieldName = fieldDefn.GetName(); fieldMap.put(fieldTypeName, fieldName); } System.out.println(fieldMap); long featureCount = layer.GetFeatureCount(); System.out.println("图层要素个数:" + featureCount); Feature feature2 = 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数据解析完整代码。
- 点赞
- 收藏
- 关注作者
评论(0)