java处理Arcgis导出的DEM栅格文件data.asc

2025-10-23 16:35:00

1、关于栅格数据文件

读者可用自己的

作者在百度云网盘分享了一个

dataDEM.asc

http://pan.baidu.com/s/1o61C7W2

java处理Arcgis导出的DEM栅格文件data.asc

java处理Arcgis导出的DEM栅格文件data.asc

2、【新建工程】

java处理Arcgis导出的DEM栅格文件data.asc

java处理Arcgis导出的DEM栅格文件data.asc

java处理Arcgis导出的DEM栅格文件data.asc

java处理Arcgis导出的DEM栅格文件data.asc

java处理Arcgis导出的DEM栅格文件data.asc

3、【定义一个栅格数据文件头的类】

public static class GridFileHead {

   public int ncols;

   public int nrows;

   public double xllcorner;

   public double yllcorner;

   public double cellsize;

   public int NODATA_value;

}

java处理Arcgis导出的DEM栅格文件data.asc

4、【解读文件头包含的信息】

包括这个文件的行数、列数

////////////////////////////////////////////////////////////////////////////////

//

////////////////////////////////////////////////////////////////////////////////

    public static GridFileHead ReadGridFileHead(String filePath){

    GridFileHead gridUnit=new GridFileHead();

        try{

            DataInputStream in=new DataInputStream(new FileInputStream(filePath));

            int fileSize=512;

            byte []btData=new byte[fileSize];

            in.read(btData);

            String str=new String(btData);

            String splitTab="\t";

            String []strData=str.split("\n");

            int tabIndex=strData[0].indexOf(splitTab);

            if(tabIndex==-1){

                splitTab=" ";

            }

            String []tempData=strData[0].split(splitTab);

            gridUnit.ncols=Integer.parseInt(tempData[tempData.length-1].trim());

            tempData=strData[1].split(splitTab);

            gridUnit.nrows=Integer.parseInt(tempData[tempData.length-1].trim());

            tempData=strData[2].split(splitTab);

            gridUnit.xllcorner=Double.parseDouble(tempData[tempData.length-1].trim());

            tempData=strData[3].split(splitTab);

            gridUnit.yllcorner=Double.parseDouble(tempData[tempData.length-1].trim());

            tempData=strData[4].split(splitTab);

            gridUnit.cellsize=Double.parseDouble(tempData[tempData.length-1].trim());

            tempData=strData[5].split(splitTab);

            gridUnit.NODATA_value=Integer.parseInt(tempData[tempData.length-1].trim());

            in.close();

        }

        catch(IOException ex){

        ex.printStackTrace();

        }

        return gridUnit;

    }

java处理Arcgis导出的DEM栅格文件data.asc

5、【读取栅格数据到一个二维浮点数组】

////////////////////////////////////////////////////////////////////////////////

//

////////////////////////////////////////////////////////////////////////////////

    public static double[][] readGridFileToDoubleArray2D(String filePath){

        double[][] resultData=null;

        try{

            DataInputStream in=new DataInputStream(new FileInputStream(filePath));

            int fileSize=in.available();

            byte []btData=new byte[fileSize];

            in.read(btData);

            String str=new String(btData);

            String splitTab="\t";

            String []strData=str.split("\n");

            int tabIndex=strData[0].indexOf(splitTab);

            if(tabIndex==-1){

                splitTab=" ";

            }

            String []tempData=strData[0].split(splitTab);

            int ncols=Integer.parseInt(tempData[tempData.length-1].trim());

            tempData=strData[1].split(splitTab);

            int nrows=Integer.parseInt(tempData[tempData.length-1].trim());

            resultData=new double[nrows][ncols];

            splitTab="\t";

            tabIndex=strData[6].indexOf(splitTab);

            if(tabIndex==-1){

                splitTab=" ";

            }

            for(int i=0;i<nrows;i++){

                tempData=strData[i+6].split(splitTab);

                for(int j=0;j<ncols;j++){

                    resultData[i][j] = Double.parseDouble(tempData[j]);

                }

            }

            in.close();

        }catch(IOException ex){

        ex.printStackTrace();

        }

        return resultData;

    }

java处理Arcgis导出的DEM栅格文件data.asc

6、【将运算或者其它处理完后的二维数组写入到新的文件】

////////////////////////////////////////////////////////////////////////////////

//

////////////////////////////////////////////////////////////////////////////////

    public static void  writeDoubleArray2DtoGridFile(

    String filePath,

    double[][]arrDouble2D,

    GridFileHead gridFileHead

    ){

   try{

    File hFileCreate = new File(filePath);

hFileCreate.createNewFile();

RandomAccessFile hFileWrite = new RandomAccessFile(filePath,"rw");

//写文件头

String strHead="ncols    "+gridFileHead.ncols+"\r\n"+

"nrows    "+gridFileHead.nrows+"\r\n"+

"xllcorner    "+gridFileHead.xllcorner+"\r\n"+

"yllcorner    "+gridFileHead.yllcorner+"\r\n"+

"cellsize    "+gridFileHead.cellsize+"\r\n"+

"NODATA_value    "+gridFileHead.NODATA_value+"\r\n";

hFileWrite.write((strHead).getBytes());

//写数据内容

for(int i=0;i<arrDouble2D.length;i++){

String line="";

for (int j = 0; j < arrDouble2D[i].length; j++) {

line+=arrDouble2D[i][j]+" ";

}

line+="\r\n";

hFileWrite.write((line).getBytes());

}

hFileWrite.close();

} catch (IOException e) {

e.printStackTrace();

}

    }

java处理Arcgis导出的DEM栅格文件data.asc

7、【编写主方法】

public static void main(String[] args) {

double[][]arrDouble2D=null;

String strInFileName=args[0];

String strOutFileName=strInFileName+"_out.asc";

GridFileHead gridFileHead=null;

//读取头文件

gridFileHead=ReadGridFileHead(strInFileName);

//!读取文件到2维双精度数组

arrDouble2D=readGridFileToDoubleArray2D(strInFileName);

//数组运算,处理

//写2维数组到文件

writeDoubleArray2DtoGridFile(strOutFileName, arrDouble2D,gridFileHead);

}

java处理Arcgis导出的DEM栅格文件data.asc

8、【导出为可运行的jar文件】

java处理Arcgis导出的DEM栅格文件data.asc

java处理Arcgis导出的DEM栅格文件data.asc

java处理Arcgis导出的DEM栅格文件data.asc

9、在命令行下测试、运行

java处理Arcgis导出的DEM栅格文件data.asc

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢