



时间:2015-12-17 关注公众号 来源:网络
1、关于codeblocks IDE的极速安装
2、关于栅格数据文件
可从网上自行下载一个dataDEM.asc
3、从下图可以看到
Arcgis导出来的栅格数据的格式一般为:文件头+内容
其中文件头内容类似下面:
--------------------------------------------
ncols 273
nrows 517
xllcorner 406575.15962767
yllcorner 2797618.1216856
cellsize 88.667294085553
NODATA_value -9999
--------------------------------------------
这种文件的头2行包含了很重要的信息
1)这个文件有多少列:ncols
2)这个文件有多少行:nrows
接下来的4行说明了公里网、单元格大小、无效值
【定义文件头类型】
先定义一种类型
!================================
! 数据文件头类型
!================================
TYPE GridFileHead
INTEGER::ncols
INTEGER::nrows
REAL*8::xllcorner
REAL*8::yllcorner
REAL*8::cellsize
END TYPE
5、【读文件头信息】
编写子程序
解释出栅格数据文件的文件头
!================================
! 解释栅格数据的文件头
!================================
SUBROUTINE ReadGridFileHead(FilePath)
IMPLICIT NONE
CHARACTER(Len=*), INTENT(IN) :: FilePath
CHARACTER,TARGET::buffer(10)*64 !10个元素,每个长度64
INTEGER::ncol
!读文件头
OPEN(FileTmp,FILE=FilePath,STATUS='OLD')
READ(FileTmp,*), buffer
CLOSE(FileTmp)
!字符串转数字
READ(buffer(2),*)GridHead%ncols
READ(buffer(4),*)GridHead%nrows
READ(buffer(6),*)GridHead%xllcorner
READ(buffer(8),*)GridHead%yllcorner
READ(buffer(10),*)GridHead%cellsize
END SUBROUTINE ReadGridFileHead
6、【读文件】
编写子程序
读取栅格数据到二维浮点双精度数组
!================================
! 读取网格数据到二维浮点双精度数组
!================================
SUBROUTINE readGridFileToDoubleArray2D(FilePath, arrDouble2D)
IMPLICIT NONE
CHARACTER(Len=*), INTENT(IN) :: FilePath
INTEGER,TARGET,INTENT(OUT) :: arrDouble2D(:,:)
INTEGER::i
OPEN(FileTmp,FILE=FilePath,STATUS='OLD')
!跳过开头6行
DO i=1,6
READ(FileTmp,*)
END DO
DO i=1,GridHead%nrows
READ(FileTmp,*), arrDouble2D(i,1:GridHead%ncols)
END DO
CLOSE(FileTmp)
END SUBROUTINE readGridFileToDoubleArray2D
7、【写文件】
编写子程序
将二维浮点双精度数组写到栅格数据文件
!================================
! 写二维浮点双精度数组到文件
!================================
SUBROUTINE writeDoubleArray2DtoGridFile(FilePath, arrDouble2D)
IMPLICIT NONE
CHARACTER(LEN=32)::buffer
INTEGER::i,j
CHARACTER(Len=*), INTENT(IN) :: FilePath
INTEGER,TARGET,INTENT(IN) :: arrDouble2D(:,:)
OPEN(FileTmp,FILE=FilePath)
WRITE(FileTmp,'(A,$)'), "ncols "
buffer=""
WRITE(buffer,*), GridHead%ncols
WRITE(FileTmp,'(A)'),trim(adjustl(buffer))
WRITE(FileTmp,'(A,$)'), "nrows "
buffer=""
WRITE(buffer,*), GridHead%nrows
WRITE(FileTmp,'(A)'),trim(adjustl(buffer))
WRITE(FileTmp,'(A,$)'), "xllcorner "
buffer=""
WRITE(buffer,*), GridHead%xllcorner
WRITE(FileTmp,'(A)'),trim(adjustl(buffer))
WRITE(FileTmp,'(A,$)'), "yllcorner "
buffer=""
WRITE(buffer,*), GridHead%yllcorner
WRITE(FileTmp,'(A)'),trim(adjustl(buffer))
WRITE(FileTmp,'(A,$)'), "cellsize "
buffer=""
WRITE(buffer,*), GridHead%cellsize
WRITE(FileTmp,'(A)'),trim(adjustl(buffer))
WRITE(FileTmp,'(A)'), "NODATA_value -9999"
DO i=1, GridHead%nrows
DO j=1, GridHead%ncols-1
buffer=""
WRITE(buffer,*), arrDouble2D(i,j)
WRITE(FileTmp,'(A,$)'),trim(adjustl(buffer))//" "
END DO
buffer=""
WRITE(buffer,*), arrDouble2D(i,GridHead%ncols)
WRITE(FileTmp,'(A)'),trim(adjustl(buffer))
END DO
CLOSE(FileTmp)
END SUBROUTINE writeDoubleArray2DtoGridFile
8、【主程序】
IMPLICIT NONE
!================================
! 数据文件头类型
!================================
TYPE GridFileHead
INTEGER::ncols
INTEGER::nrows
REAL*8::xllcorner
REAL*8::yllcorner
REAL*8::cellsize
END TYPE
!================================
INTEGER::FileTmp=168 !临时读取文件时使用的设备号
TYPE(GridFileHead)GridHead !模型数据文件头
CHARACTER(len=255)::strInFileName !要处理的文件名
CHARACTER(len=255)::strOutFileName !输出的文件名
INTEGER,ALLOCATABLE::arrDouble2D(:,:)
!================================
!命令行输入参数处理
Call GETARG(1,strInFileName)
!连接字符串,将其设置为要输出的文件名
strOutFileName=trim(strInFileName)//"_out.asc"
!================================
!读取文件头
CALL ReadGridFileHead(strInFileName)
ALLOCATE(arrDouble2D(GridHead%nrows,GridHead%ncols))
!读取文件到2维双精度数组
CALL readGridFileToDoubleArray2D(strInFileName,arrDouble2D)
!数组运算,处理
!写2维数组到文件
CALL writeDoubleArray2DtoGridFile(strOutFileName,arrDouble2D)
!释放内存
DEALLOCATE(arrDouble2D)
9、运行、测试结果:
文章内容来源于网络,不代表本站立场,若侵犯到您的权益,可联系我们删除。(本站为非盈利性质网站)
电话:13918309914
QQ:1967830372
邮箱:rjfawu@163.com