zoukankan      html  css  js  c++  java
  • 基于GDAL库,读取.grd文件(以海洋地形数据为例)Java版

    技术背景

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

  • 相关阅读:
    数据绘图工具之Matplotlib
    数据分析
    scrapy-redis 实现分布式爬虫
    存储库之MongoDB
    pycharm解释器链接如何pymongo
    爬虫之request相关请求
    爬虫基本原理
    Xadmin
    当网页失去焦点时改变网页的title值
    gulp基础使用及进阶
  • 原文地址:https://www.cnblogs.com/thyou/p/9954540.html
Copyright © 2011-2022 走看看