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数据库格式介绍说明

gis利器之Gdal(三)gdb数据读取_第1张图片

gdb数据存放在如上所示的目录中,除非你非常熟悉相关领域数据管理,否则不要轻易去编辑这些文件。

三、在Qgis中打开gdb数据,事先预览

如果你没有测试数据,可以从以下网站下载演示数据,http://horizon2021.xyz/,

我们下载全国行政区划的gdb数据,解压后,将gdb文件夹拖到qgis中展示,可以看到以下空间信息。

打开任意的图层属性表格,以分省为例:

gis利器之Gdal(三)gdb数据读取_第2张图片

四、使用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" + 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 fieldMap = new HashMap();
	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();
}

控制台输出以下信息:

gis利器之Gdal(三)gdb数据读取_第3张图片

总结:本文介绍了arcgis下gdb和mdb数据库文件,简单比较了两者的区别。文中提供了演示用的gdb数据的下载网址和数据目录展示,并采用qgis进行数据预览,最终给出了给予gdal的gdb数据解析完整代码。

你可能感兴趣的:(gdal,gis,javaEE,java,gdal,gis)