技术背景

  海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达等功能操作;由于Surfer软件不支持二次开发,没有提供相应的SDK供开发者进行使用,所以这一切只能通过相应类似的技术进行实现,首先,数据的读取,如何通过编程实现数据的读取操作呢?这里就要说一下GIS软件所使用的一个开源库-GDAL,GDAL库的具体解释资料,请查阅官方网站【https://www.gdal.org/index.html】,由于后期要进行数据入库的步骤,所以本文提供的是一种采用Java语言进行读取的方法,前面的GDAL库的编译方法请参考博客1【GDAL从源码到JAVA应用】,下面具体讲一下环境配置。

  首先讲GDAL库文件进行整理,将jdal.jar、gdalalljni.dll、gdalalljni.exp、gdalalljni.lib四个文件拷到bin文件夹下,然后将bin文件夹拷贝到任一位置并更名为gdal,然后将该文件夹,设置入系统环境变量path内,这一步完成即成功了一半;然后打开Eclipse,创建项目gdalDemo,右击项目选择“构建路径”(Build Path),然后选择“configure Build Path”,再选择“Java Build Path”,选择“库”,点击“添加额外的JAR文件”,具体如下图所示

  添加完成以后,创建Java类,开始编辑读取代码,话不多说,代码奉上

  1. 1 package gdalDemo;
  2. 2
  3. 3 import org.gdal.gdal.Band;
  4. 4 import org.gdal.gdal.Dataset;
  5. 5 import org.gdal.gdal.Driver;
  6. 6 import org.gdal.gdal.gdal;
  7. 7 import org.gdal.gdalconst.gdalconstConstants;
  8. 8 import org.gdal.ogr.ogr;
  9. 9
  10. 10 public class gealTest {
  11. 11
  12. 12 public static void main(String[] args) {
  13. 13
  14. 14 // 注册所有的驱动
  15. 15 ogr.RegisterAll();
  16. 16 // 为了支持中文路径,请添加下面这句代码
  17. 17 gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
  18. 18 // 为了使属性表字段支持中文,请添加下面这句
  19. 19 gdal.SetConfigOption("SHAPE_ENCODING","");
  20. 20
  21. 21 String fileName_tif = "E:/test/E135N30_sf.grd";
  22. 22
  23. 23 //使用只读方式打开图像
  24. 24 Dataset hDataset = gdal.Open(fileName_tif, gdalconstConstants.GA_ReadOnly);
  25. 25 if (hDataset == null)
  26. 26 {
  27. 27 System.err.println("GDALOpen failed - " + gdal.GetLastErrorNo());
  28. 28 System.err.println(gdal.GetLastErrorMsg());
  29. 29 System.exit(1);
  30. 30 }
  31. 31
  32. 32 //输出图像的格式信息
  33. 33 Driver hDriver = hDataset.GetDriver();
  34. 34 System.out.println("Driver: " + hDriver.getShortName() + "/" + hDriver.getLongName());
  35. 35
  36. 36 //输出图像的大小和波段个数
  37. 37 int iXSize = hDataset.getRasterXSize(); //列数
  38. 38 int iYSize = hDataset.getRasterYSize(); //行数
  39. 39 int iBandCount = hDataset.getRasterCount(); //元素(因素)数
  40. 40 System.out.println("Size is " + iYSize + " x " + iXSize + "\n" + "BandCount: " + iBandCount);
  41. 41
  42. 42 Band band = hDataset.GetRasterBand(1);
  43. 43 int itype = band.GetRasterDataType();
  44. 44 System.out.println("dataType: "+itype);
  45. 45
  46. 46 //输出图像的坐标和分辨率信息
  47. 47 double [] adfGeoTransform = new double[6];
  48. 48 hDataset.GetGeoTransform( adfGeoTransform);
  49. 49 System.out.printf( "Origin =(%.6f,%.6f)\n",adfGeoTransform[0], adfGeoTransform[3]);
  50. 50 System.out.printf( "PixelSize = (%.6f,%.6f)\n",adfGeoTransform[1], adfGeoTransform[5]);
  51. 51
  52. 52 //获取该波段的最大值最小值,如果获取失败,则进行统计
  53. 53 Double [] bGotMin = new Double [2];
  54. 54 Double [] bGotMax = new Double [2];
  55. 55 band.GetMinimum( bGotMin);
  56. 56 band.GetMaximum( bGotMax);
  57. 57 if(bGotMin[0] != null && bGotMax[0] != null){
  58. 58 System.out.printf( "Z value Min=%.3f,Max=%.3f\n", bGotMin[0], bGotMax[0]);
  59. 59 }
  60. 60
  61. 61 System.out.println("\nexample Data(10x10):");
  62. 62 //读取一行数据
  63. 63 float buf[] = new float[iXSize];
  64. 64
  65. 65 for(int i=0; i<10/*iYSize*/; i++)
  66. 66 {
  67. 67 band.ReadRaster(0, i, iXSize, 1, buf); //读取一行数据
  68. 68
  69. 69 // 下面是输出像元值,为了方便,我只输出了左上角 10×10的范围内的数据
  70. 70 for(int j=0; j<10/*iXSize*/; j++)
  71. 71 System.out.print(buf[j] + ", ");
  72. 72 System.out.println("\n");
  73. 73 }
  74. 74
  75. 75 hDataset.delete();
  76. 76
  77. 77 // 关闭驱动
  78. 78 gdal.GDALDestroyDriverManager();
  79. 79 }
  80. 80
  81. 81 }

  读取结果

  至此,文件读取完成。

致谢

  感谢李民录老师的指导,以及相关技术博主的技术分享,谢谢!

参考博客

1、GDAL从源码到JAVA应用【https://blog.csdn.net/lw19910913/article/details/77746164】

2、Build Instructions for GDAL/OGR In Java【http://trac.osgeo.org/gdal/wiki/GdalOgrInJavaBuildInstructions】

3、GDAL-JavaAPI【https://gdal.org/java/overview-summary.html】

4、Java使用GDAL【https://blog.csdn.net/liminlu0314/article/details/8395622】

基于GDAL库,读取.grd文件(以海洋地形数据为例)Java版的更多相关文章

  1. 基于GDAL库,读取.grd文件(以海洋地形数据为例)C++版

    技术背景 海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达 ...

  2. 使用C#版本的gdal库打开hdf文件

    作者:朱金灿 来源:http://blog.csdn.net/clever101 最近应同事的请求帮忙研究下使用C#版的gdal库读取hdf文件,今天算是有一点成果,特地做一些记录. 首先是编译C#版 ...

  3. 基于GDAL库,读取海洋风场数据(.nc格式)c++版

    经过这一段时间的对海洋数据的处理,接触了大量的与海洋相关的数据,例如海洋地形.海洋表面温度.盐度.湿度.云场.风场等数据,除了地形数据是grd格式外,其他的都是nc格式的数据.本文将以海洋风场数据为例 ...

  4. 关于基于GDAL库QT软件平台下C++语言开发使用说明

    背景前提 地理空间数据抽象库(GDAL)是一个用于读取和编写栅格和矢量地理空间数据格式的计算机软件库,由开源地理空间基金会在许可的X / MIT风格免费软件许可下发布. 作为一个库,它为调用应用程序提 ...

  5. 基于GDAL库,读取.nc文件(以海洋表温数据为例)C++版

    对于做海洋数据处理的同学,会经常遇到nc格式的文件,nc文件的格式全称是NetCDF,具体的详细解释请查询官网[https://www.unidata.ucar.edu/software/netcdf ...

  6. 基于GDAL库海洋表温日平均计算工具设计与实现 C++版

    技术背景 在对物理海洋数据处理过程中,表层温度是众多要素中的一种,本文书要是针对海洋表温数据批量日平均处理的一个工具设计.首先要在对当前的SST数据文件作一下简要的说明,SST全称为sea surfe ...

  7. C++调用GDAL库读取并输出tif文件,并计算斑块面积输出景观指数:CSD

    部分源码选自GDAL库的官方网址:www.gdal.org,其余的代码为笔者自己编写. // readfile.cpp : 定义控制台应用程序的入口点. // /* part of the codes ...

  8. GDAL库——读取图像并提取基本信息

    GDAL库是一个跨平台的栅格地理数据格式库,包括读取.写入.转换.处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持).它使用了一个单一的抽象数据模型就支持了大多数的栅格数据.这里有GDAL ...

  9. gdal库对ENVI文件的一点支持不好

    作者:朱金灿 来源:http://blog.csdn.net/clever101 使用GDALOpen函数打开ENVI的img文件,如果使用更新的方式即GA_Update会改写对应的hdr文件.改写h ...

随机推荐

  1. Python_元类

    什么是元类 我们知道,实例对象是由类创建的,那么类又是由什么创建的呢? 答案就是元类. 元类基本不会用到,但是就算不用,也应该去熟悉一下概念. 理解类也是对象 在大多数编程语言中,类就是一组用来描述如 ...

  2. spring5无法在控制台打印日志的原因

    想要在控制台输出spring的日志,却无法输出,log4j2所需要的jar文件都已经导入,log4j2的配置文件也存在,调整日志级别也不行,一通百度后发现是缺少spring的jcl的jar文件,把sp ...

  3. sqlserver - 查出的结果集,集成为json串放在一个字段里

    1.效果 2.sql SELECT top 20 (select [name] as [名字] from staffBasicInfo For JSON PATH,ROOT('第一级key')) k ...

  4. [ SQLAlchemy ] 关于dynamic的“一知半解”

    问题提出: 1.粉丝机制 2.评论的点赞功能 这两个功能分别由User类和Comment类来实现,同样定义了多对多的关系,查询的时候用的方法却大不一样,先看看代码吧. ### # User类的中间表 ...

  5. 华为云 Kubernetes 管理员实训 五 课后作业

    练习1 部署一个Deployment应用,使用secret普通卷,该应用启动依赖此secret. Deployment的名称为<hwcka-005-1-你的华为云id> 将所用命令.创建的 ...

  6. Pandas系列(十八)- 多级索引

    多级索引 多级索引(也称层次化索引)是pandas的重要功能,可以在Series.DataFrame对象上拥有2个以及2个以上的索引.实质上,单级索引对应Index对象,多级索引对应MultiInde ...

  7. java邮件打包在linux备份数据库练习

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6812982512256549387/ 承接上一篇文档<Java实现163邮箱发送邮件到QQ邮箱> 主方 ...

  8. vue 因为使用scope后选择器和标签出现[data-v

    使用scope的以后出现datd-v,例如: <div data-v-2311c06a class="button-warp"> <button data-v-2 ...

  9. layui type:2 iframe子页面向父页面传值

    需求: 选择子页面表格中的radio或者双击该行,得到的该行数据传到父页面,由父页面渲染. 网上的各种方法都用了,父页面就是获取不到子页面传的值,过了一晚上,睡了一觉,柳暗花明又一村. layui t ...

  10. Python多环境管理神器(pyenv)

    前面我们已经介绍了,python中两种最基础的虚拟环境管理工具,venv和virtualenv,其中virtualenv可以和virtualenvwrapper配合使用.详情请参考:https://w ...