java处理Arcgis导出的DEM栅格文件data.asc
关于栅格数据文件
读者可用自己的
作者在百度云网盘分享了一个
dataDEM.asc
http://pan.baidu.com/s/1o61C7W2
【新建工程】
【定义一个栅格数据文件头的类】
public static class GridFileHead {
public int ncols;
public int nrows;
public double xllcorner;
public double yllcorner;
public double cellsize;
public int NODATA_value;
}
【解读文件头包含的信息】
包括这个文件的行数、列数
////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////
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;
}
【读取栅格数据到一个二维浮点数组】
////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////
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;
}
【将运算或者其它处理完后的二维数组写入到新的文件】
////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////
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();
}
}
【编写主方法】
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);
}
【导出为可运行的jar文件】
在命令行下测试、运行
转载自:https://jingyan.baidu.com/article/6f2f55a1b899b6b5b93e6ceb.html