在Python中读取.grd文件

时间:2016-06-16 09:35:45

标签: python numpy pandas gis raster

ESRI grid format中的某些文件(后缀为 .grd )是一个地理空间数据集,左下角为X角,左下角为Y角。

文件看起来像这样(使用vim读取它):

   1 ncols 2880
   2 nrows 1440
   3 xllcorner -180.0
   4 yllcorner  -90.0
   5 cellsize 0.125
   6 nodata_value -999
   7 version 2.0

   8  -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 -999 ...

目前,我使用手动预处理方法操作这些文件。

  1. 删除前7行
  2. 将.grd文件保存到.txt文件中。
  3. 使用numpy将.txt文件读入表示空间属性的numpy数组
  4. 结合前7行,生成对应属性数组的Lon和Lat数组(For my cas(1440 x 2880))
  5. 现在,我想实现直接阅读文件:

    • 价值 - >从第8行开始
    • 经度 - >由ncols,cellize& amp; xllcorner
    • 经度 - >由nrows,cellize& amp; yllcorner

    我的尝试

     ## Read the first seven lines using LineCache
     ncols = linecache.getline("grd file", 1)
     ......
     ## Read the array using np.loadtxt()
     myArray  = np.loadtxt("grd file", skiprows=7) 
    

1 个答案:

答案 0 :(得分:2)

你可以为它编写一个函数。这是一个示例(假设您的行号来自vim,实际上不存在于文件中):

import numpy as np

def read_grd(filename):
    with open(filename) as infile:
        ncols = int(infile.readline().split()[1])
        nrows = int(infile.readline().split()[1])
        xllcorner = float(infile.readline().split()[1])
        yllcorner = float(infile.readline().split()[1])
        cellsize = float(infile.readline().split()[1])
        nodata_value = int(infile.readline().split()[1])
        version = float(infile.readline().split()[1])
    longitude = xllcorner + cellsize * np.arange(ncols)
    latitude = xllcorner + cellsize * np.arange(nrows)
    value = np.loadtxt(filename, skiprows=7)

    return longitude, latitude, value