您的位置首页百科知识

Linux C处理Arcmap导出的DEM栅格文件data.asc

Linux C处理Arcmap导出的DEM栅格文件data.asc

的有关信息介绍如下:

Linux C处理Arcmap导出的DEM栅格文件data.asc

高性能计算的应用越来越多

水文、气象、遥感中的很科学计算

也渐渐移值到了高性能计算平台上

但高性能计算平台上面的操作系统一般是Unix、Linux类的

如果想在不来不至于太过out

需要学点能在大多数高性能计算平台上面通用运行的

Linux C语言或者C++或者其它

本文介绍常用的Linux C语言

用来处理处理Arcmap导出的DEM栅格文件data.asc

关于栅格数据文件

读者可用自己的

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

dataDEM.asc

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

/**

*【定义栅格数据文件头结构】

*/

struct GridFileHead{

int ncols;

int nrows;

double xllcorner;

double yllcorner;

double cellsize;

double NODATA_value;

};

struct GridFileHead GridHead;

/**

*【读文件头】

*/

void readGridHead(char* lpFileName){

int hFile;

char szBuffer={0};

int nBytesRead;

char* szTemp;

hFile = open(lpFileName,O_RDONLY);

nBytesRead = read(hFile,szBuffer,sizeof(szBuffer));

//ncols

szTemp = strstr(szBuffer,szncols);

GridHead.ncols = atoi(szTemp+strlen(szncols));

//nrows

szTemp = strstr(szBuffer,sznrows);

GridHead.nrows = atoi(szTemp+strlen(sznrows));

//xllcorner

szTemp = strstr(szBuffer,szxllcorner);

GridHead.xllcorner = atof(szTemp+strlen(szxllcorner));

//yllcorner

szTemp = strstr(szBuffer,szyllcorner);

GridHead.yllcorner = atof(szTemp+strlen(szyllcorner));

//cellsize

szTemp = strstr(szBuffer,szcellsize);

GridHead.cellsize = atof(szTemp+strlen(szcellsize));

//NODATA_value

szTemp = strstr(szBuffer,szNODATA_value);

GridHead.NODATA_value = atof(szTemp+strlen(szNODATA_value));

close(hFile);

}

/**

*【读栅格数据】

*/

void readGridFileToDoubleArray2D(char* lpFileName){

int hFile;

char szBuffer={0};

struct stat st;

char *lpFileMap,hFileMap;

char *lpOffset;

char *lpSplit;

char split=0x20;

double *gridInt=0;

hFile = open(lpFileName,O_RDONLY);

fstat(hFile,&st);

lpFileMap=mmap(NULL,st.st_size,PROT_READ,MAP_PRIVATE,hFile,0);

if(!index(lpFileMap,0x20)){

split=9;

}

lpOffset = strstr(lpFileMap,szNODATA_value);

lpOffset = index(lpOffset,0x0A);

lpOffset++;

int i,j;

for(i=0; i

for(j=0;j

arrDouble2D[i][j]=atof(lpOffset);

lpSplit=index(lpOffset,split);

lpOffset=lpSplit+1;

}

arrDouble2D[i][GridHead.ncols-1]=atof(lpOffset);

lpSplit=index(lpOffset,0x0A);

lpOffset++;

}

munmap(lpFileMap,st.st_size);

close(hFile);

}

/**

*【写二维数组到文件】

*/

void writeDoubleArray2DtoGridFile(char* lpFileName, double **arrDouble2D){

char szFileName={0};

char szBuffer={0};

char szTmp={0};

memset(szFileName,0,sizeof(szFileName));

strcat(szFileName,"_out.asc");

int hOut;

hOut = open(szFileName,O_RDWR|O_CREAT);

vsprf(szBuffer,"ncols %d\r\nnrows %d\r\nxllcorner %f\r\nyllcorner %f\r\ncellsize %f\r\nNODATA_value %f\r\n",

GridHead.ncols,

GridHead.nrows,

GridHead.xllcorner,

GridHead.yllcorner,

GridHead.cellsize,

GridHead.NODATA_value

);

write(hOut,szBuffer,strlen(szBuffer));

memset(szBuffer,0,sizeof(szBuffer));

int i,j;

for(i=0;i

for(j=0;j

memset(szTmp,0,sizeof(szTmp));

vsprf(szTmp,"%f ",arrDouble2D[i][j]);

strcat(szBuffer,szTmp);

}

strcat(szBuffer,"\r\n");

write(hOut,szBuffer,strlen(szBuffer));

memset(szBuffer,0,sizeof(szBuffer));

}

close(hOut);

}

/**

*【格式化输出的子程序】

*【在上面第5步中用到】

*/

int vsprf(char *str,char *format,...){

va_list ap;

int count;

va_start(ap,format);

count=vsprintf(str,format,ap);

va_end(ap);

return count;

}

【编写主程序】

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

/**

*

*/

struct GridFileHead{

int ncols;

int nrows;

double xllcorner;

double yllcorner;

double cellsize;

double NODATA_value;

};

struct GridFileHead GridHead;

/**

*

*/

char *szncols = "ncols";

char *sznrows = "nrows";

char *szxllcorner = "xllcorner";

char *szyllcorner = "yllcorner";

char *szcellsize = "cellsize";

char *szNODATA_value = "NODATA_value";

double **arrDouble2D=0;

/**

*

*/

void main(int argc, char *argv[]) {

/**

*read grid file head

*/

char *strFileInput=argv;

readGridHead(strFileInput);

/**

*allocate memory for array

*/

arrDouble2D=(int **)calloc(GridHead.nrows,sizeof(double *));

int i;

for(i=0;i

*(arrDouble2D+i)=(int *)calloc(GridHead.ncols, sizeof(double));

}

readGridFileToDoubleArray2D(strFileInput);

/**

*

*/

writeDoubleArray2DtoGridFile("dataout.asc",arrDouble2D);

/**

*free memory

*/

for(i=0;i

free(*(arrDouble2D+i));

}

free(arrDouble2D);

}

【测试运行,结果如下】