前言
了解GDAL的朋友一定知道,GDAL3.5以下(含)默认配置下是只支持gdb文件的读的,是不支持写的。更要命的是,默认的OpenFileGDB在读取时,如果我们在矢量文件中设置了属性表字段的别名,默认驱动是读不出来的。那么如何在GDAL3.5以下(含)如何创建gdb文件,可以读取gdb文件的别名呢? 本文讲解主要面向需要基于GDAL自主去做一些基础数据处理转换的,不是依赖于Arcgis进行二次开发的方向。gdb本身是Esri公司的arcgis系列的产品,如果基于ArcgisEngine进行开发,对数据进行解析和处理完全是没有问题的。本文提出的解决方案是不依赖于Arcgis的轻量级实现。 目前,在Windows平台下介绍如何集成FileGDB驱动的文章比较少,而且很多方式集成起来比较繁琐,而且不易成功。经过多次尝试和探索,整理出来一种简单可用的FileGDB驱动集成方式,帮助您在日常开发中快速集成使用。
一、 GDB文件处理
1、OpenFileGDB
OpenFileGDB驱动程序提供对ArcGIS 9及以上版本创建的文件geodatabase(.gdb目录)的矢量层的读取访问。数据集名称必须是目录/文件夹名称,并且必须以.gdb扩展名结尾。它还可以直接读取zipped.gdb目录(扩展名为.gdb.zip),前提是它们在第一级包含一个.gdb目录。也可以直接打开特定的.gdbtable文件(包括“system”表)。几何图形中的曲线由GDAL>=2.2支持。
2、FileGDB
File gdb驱动程序提供对ArcGIS 10及以上版本创建的文件geodatabase(.gdb目录)的矢量层的读写访问。数据集名称必须是目录/文件夹名称,并且必须以.gdb扩展名结尾。注意 : the OpenFileGDB driver驱动程序作为可选的内置驱动程序存在,即不依赖于第三方库)只读驱动程序。
二、配置FileGDB驱动支持
1、下载编译后的版本和FileGDB驱动
通常在开发环境,我们可以选择使用编译好的gdal版本来进行配置开发环境即可。在gis驱动包下载网站,地址为:gisinternals支持,在该网站上下载相应的编译好的包。
为了演示方便,我原来下载的是release-1930-x64-gdal-3-4-3-mapserver-7-6-4这个版本,可以在历史正式版本中查询。
点击这个超链接进入到具体的下载页面,根据需要可以直接下载编译好的gdal和mapserver,如果只想要安装gdal,也可以直接下载gdal-304-1930-x64-core.msi。gdal-304-1930-x64-filegdb.msi是必须要下载的。在Windows下面用于安装相关使用。
下载下来之后得到的gdal目录如下所示:
2、安装FileGDB驱动
安装FileGDB驱动的步骤非常关键(FileGDB安装成功与否取决这一步,重点注意),不过先执行msi文件还是先解压压缩包,这个先后顺序不影响系统功能。这里我们先将压缩包解压到本地目录中,解压后的目录如下图所示:
将下载下来的gdal-304-1930-x64-filegdb.msi双击进行安装,选择系统默认安装即可。
后续的安装步骤非常简单,都是下一步下一步就可以。filegdb.msi文件安装成功一般在C盘下面的GDAL文件夹中,如下图所示:
这里就是对应版本的FileGDBAPI和ogr_FileGDB驱动文件,将这两个文件拷贝到上一步中GDAL的解压目录下的bin目录下即可。完成后的gdal工作目录如下所示:
到这一步,FileGDB驱动的支持基本集成完成。但此时如果您在命令行使用ogrinfo --formats命令查看,FileGDB驱动还是不支持。其实还需要最后一步,设置扩展驱动的环境变量。
3、设置GDAL_DRIVER_PATH环境变量
在系统中设置一个GDAL_DRIVER_PATH的环境变量其值 %GDAL_HOME%\bin\gdalplugins ,其中(GDAL_HOME)是GDAL的工作目录,也是一个环境变量。
通过配置这个环境变量后,再次在DOCS中输入ogrinfo --formats命令,输出结果如下:
在docs窗口中能看到FileGDB驱动说明集成成功。
三、Java集成测试
1、Java获取FileGDB驱动
package com.yelang.gdal_demo1;
import org.gdal.gdal.gdal;
import org.gdal.ogr.ogr;
import org.junit.Test;
public class TestGdal {
@Test
public void testDriver() {
gdal.AllRegister();
int count = ogr.GetDriverCount();
for (int i = 0; i < count; i++) {
String driverName = ogr.GetDriver(i).getName();
System.out.print(driverName + "\t");
}
gdal.GDALDestroyDriverManager();
}
}
控制台中输出的结果中第一个就是包含FileGDB
FileGDB ESRIC PCIDSK PDS4 VICAR JP2OpenJPEG PDF MBTiles EEDA OGCAPI DB2ODBC ESRI Shapefile MapInfo File UK .NTF LVBAG OGR_SDTS S57 DGN OGR_VRT REC Memory CSV NAS GML GPX LIBKML KML GeoJSON GeoJSONSeq ESRIJSON TopoJSON Interlis 1 Interlis 2 OGR_GMT GPKG SQLite ODBC WAsP PGeo MSSQLSpatial OGR_OGDI PostgreSQL MySQL OpenFileGDB DXF CAD FlatGeobuf Geoconcept GeoRSS GPSTrackMaker VFK PGDUMP OSM GPSBabel OGR_PDS WFS OAPIF Geomedia EDIGEO SVG CouchDB Cloudant Idrisi ARCGEN ODS XLSX Elasticsearch Walk Carto SXF Selafin JML PLSCENES CSW VDV GMLAS MVT NGW MapML TIGER AVCBin AVCE00 HTTP
2、创建gdb文件
package com.yelang.gdal_demo1;
import org.gdal.gdal.gdal;
import org.gdal.ogr.Driver;
import org.gdal.ogr.ogr;
import org.junit.Test;
public class TestFileGDB {
@Test
public void testWriterGDB() {
//注册所有的驱动
ogr.RegisterAll();
//为了支持中文路径,请添加下面这句代码
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
//为了使属性表字段支持中文,请添加下面这句
gdal.SetConfigOption("SHAPE_ENCODING","");
Driver driver = ogr.GetDriverByName("FileGDB");
System.out.println(driver);driver.CreateDataSource("D:/test1203/test001.gdb");
gdal.GDALDestroyDriverManager();
}
}
四、总结
以上就是本文的主要内容,本文讲解主要面向需要基于GDAL自主去做一些基础数据处理转换的,不是依赖于Arcgis进行二次开发的方向。gdb本身是Esri公司的arcgis系列的产品,如果基于ArcgisEngine进行开发,对数据进行解析和处理完全是没有问题的。本文提出的解决方案是不依赖于Arcgis的轻量级实现。
友情提示:根据gdal管网最新提示,在最新的Gdal3.6的版本中,OpenFileGDB已经默认了写GDB的支持,不过完整编译版估计还需要等一下。如果是之前的项目,想要支持GDB的写,本文应该有所帮助。
本文在许多网友的解决方案中成功做了实践,感谢他们的解决思路本文的指导,以下两篇:
1、溪水边小屋 java 使用gdal_JAVA GDAL使用 FileGDB
2、晟誉小宝贝 Gdal环境配置(Windows系统)。
站在前人的肩膀上,才能站得更高,看得更远。欢迎各位朋友多交流,批评指正。
版权归原作者 夜郎king 所有, 如有侵权,请联系我们删除。