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

  • 1

    关于栅格数据文件

    读者可用自己的

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

    dataDEM.asc

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

  • 2

    【新建工程】

  • 3

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

    public static class GridFileHead {

       public int ncols;

       public int nrows;

       public double xllcorner;

       public double yllcorner;

       public double cellsize;

       public int NODATA_value;

    }

  • 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;

        }

  • 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;

        }

  • 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();

    }

        }

  • 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);

    }

  • 8

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

  • 9

    在命令行下测试、运行

    END
  • 转载自:https://jingyan.baidu.com/article/6f2f55a1b899b6b5b93e6ceb.html

    You may also like...

    退出移动版