fortran处理Arcgis导出栅格文件data.asc

来源:网络时间:2015-12-17 14:02:50

  1、关于codeblocks IDE的极速安装

  参考教程:Windows下搭建fortran开发环境

  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行说明了公里网、单元格大小、无效值

fortran处理Arcgis导出栅格文件data.asc教程

  4、接下来介绍fortran编程中怎么处理

  【定义文件头类型】

  先定义一种类型

  !================================

  ! 数据文件头类型

  !================================

  TYPE GridFileHead

  INTEGER::ncols

  INTEGER::nrows

  REAL*8::xllcorner

  REAL*8::yllcorner

  REAL*8::cellsize

  END TYPE

fortran处理Arcgis导出栅格文件data.asc教程

  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

fortran处理Arcgis导出栅格文件data.asc教程

  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

fortran处理Arcgis导出栅格文件data.asc教程

  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

fortran处理Arcgis导出栅格文件data.asc教程
fortran处理Arcgis导出栅格文件data.asc教程

  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)

fortran处理Arcgis导出栅格文件data.asc教程
fortran处理Arcgis导出栅格文件data.asc教程

  9、运行、测试结果:

fortran处理Arcgis导出栅格文件data.asc教程

文章内容来源于网络,不代表本站立场,若侵犯到您的权益,可联系我们删除。(本站为非盈利性质网站) 联系邮箱:rjfawu@163.com