java处理Arcgis导出的DEM栅格文件data.asc
1、关于栅格数据文件读者可用自己的作者在百度云网盘分享了一个dataDEM.aschttp://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、在命令行下测试、运行