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

2025-11-05 14:51:59

1、关于codeblocks IDE的极速安装

请参考百度经验<<Windows下极速搭建fortran开发环境>>

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

2、关于栅格数据文件

读者可用自己的

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

dataDEM.asc

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

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

fortran编程处理Arcgis导出的栅格文件data.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

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢