首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

gis利器之Gdal(三)gdb数据读取

  • 23-11-03 21:02
  • 2759
  • 10833
blog.csdn.net

众所周知,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时,注意使用以下驱动

  1. // 读取数据,这里以gdb文件为例
  2. String strDriverName = "OpenFileGDB";
  3. // 创建一个文件,根据strDriverName扩展名自动判断驱动类型
  4. org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);

其它的信息跟读取shp文件是一样的。详细代码如下所示:

  1. @Test
  2. public void testReadGdb() {
  3. // 指定文件的名字和路径
  4. String gdbFile = "F:\vector_data\other\中国行政区划数据.gdb\中国行政区划数据.gdb";
  5. // 注册所有的驱动
  6. ogr.RegisterAll();
  7. // 为了支持中文路径,请添加下面这句代码
  8. gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
  9. // 为了使属性表字段支持中文,请添加下面这句
  10. gdal.SetConfigOption("SHAPE_ENCODING", "CP936");
  11. // 读取数据,这里以gdb文件为例
  12. String strDriverName = "OpenFileGDB";
  13. // 创建一个文件,根据strDriverName扩展名自动判断驱动类型
  14. org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);
  15. if (oDriver == null) {
  16. System.out.println(strDriverName + " 驱动不可用! ");
  17. return;
  18. }
  19. DataSource dataSource = oDriver.Open(gdbFile, 0);
  20. for(int i = 0;i
  21. Layer layerIdx = dataSource.GetLayer(i);
  22. System.out.println("图层名称:<==>" + layerIdx.GetName());
  23. }
  24. Layer layer = dataSource.GetLayer("分省");
  25. String layerName = layer.GetName();
  26. System.out.println("图层名称:" + layerName);
  27. SpatialReference spatialReference = layer.GetSpatialRef();
  28. //System.out.println(spatialReference);
  29. System.out.println("空间参考坐标系:" + spatialReference.GetAttrValue("AUTHORITY", 0)
  30. + spatialReference.GetAttrValue("AUTHORITY", 1));
  31. double[] layerExtent = layer.GetExtent();
  32. System.out.println("图层范围:minx:" + layerExtent[0] + ",maxx:" + layerExtent[1] + ",miny:" + layerExtent[2]
  33. + ",maxy:" + layerExtent[3]);
  34. FeatureDefn featureDefn = layer.GetLayerDefn();
  35. int fieldCount = featureDefn.GetFieldCount();
  36. Map fieldMap = new HashMap();
  37. for (int i = 0; i < fieldCount; i++) {
  38. FieldDefn fieldDefn = featureDefn.GetFieldDefn(i);
  39. // 得到属性字段类型
  40. int fieldType = fieldDefn.GetFieldType();
  41. String fieldTypeName = fieldDefn.GetFieldTypeName(fieldType);
  42. // 得到属性字段名称
  43. String fieldName = fieldDefn.GetName();
  44. fieldMap.put(fieldTypeName, fieldName);
  45. }
  46. System.out.println(fieldMap);
  47. long featureCount = layer.GetFeatureCount();
  48. System.out.println("图层要素个数:" + featureCount);
  49. Feature feature2 = null;
  50. while((feature2 = layer.GetNextFeature()) != null) {
  51. //System.out.println(feature2.GetGeometryRef().ExportToJson());
  52. System.out.println(feature2.GetFieldAsString("Shape_Area") + " " + feature2.GetFieldAsString("省区"));
  53. }
  54. oDriver.delete();
  55. gdal.GDALDestroyDriverManager();
  56. }

控制台输出以下信息:

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

Java GIS技术交流合作
微信名片
注:本文转载自blog.csdn.net的夜郎king的文章"https://blog.csdn.net/yelangkingwuzuhu/article/details/125399392"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top