众所周知,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数据解析完整代码。