【问题标题】:How to I get the coordinates of a cell in a geotif?如何获取 geotiff 中单元格的坐标?
【发布时间】:2015-01-09 13:02:44
【问题描述】:

我有一个包含地理信息的 tif。使用 gdal 我可以将光栅文件转换为数组(numpy)。

如何获取该数组中一个条目的坐标?

【问题讨论】:

    标签: python gis gdal


    【解决方案1】:

    使用仿射变换矩阵,将像素坐标映射到世界坐标。例如,使用affine 包。 (还有其他方法可以做到这一点,使用简单的数学。)

    from affine import Affine
    fname = '/path/to/raster.tif'
    

    这里有两种获取仿射变换矩阵的方法,T0。例如,使用 GDAL/Python:

    from osgeo import gdal
    ds = gdal.Open(path, gdal.GA_ReadOnly)
    T0 = Affine.from_gdal(*ds.GetGeoTransform())
    ds = None  # close
    

    例如,使用rasterio:

    import rasterio
    with rasterio.open(fname, 'r') as r:
        T0 = r.affine
    

    GDAL (T0) 使用的变换数组的约定是引用像素角。您可能希望改为参考像素中心,因此需要将其平移 50%:

    T1 = T0 * Affine.translation(0.5, 0.5)
    

    现在要从像素坐标转换为世界坐标,将坐标与矩阵相乘,这可以通过一个简单的函数来完成:

    rc2xy = lambda r, c: T1 * (c, r)
    

    现在,获取第一行第二列(索引[0, 1])中栅格的坐标:

    print(rc2xy(0, 1))
    

    另外,请注意,如果您需要从世界坐标中获取像素坐标,可以使用反仿射变换矩阵,~T0

    【讨论】:

    • 很抱歉评论的延迟非常大,但你能解释一下为什么 lambda 的参数是倒置的吗? r,c: (c,r) * T1。不应该是 r,c: (r,c)*T1 吗?
    • @jhc 行与 Y 方向对齐,列与 X 对齐。因此,为了在像素空间和坐标空间之间保持 X 和 Y 方向对齐,需要对齐参数。该函数也可以用 (col, row) 或cr2xy = lambda c, r: (c, r) * T1 编写。但大多数数组访问(例如 Numpy)使用 (row, col) 排序。
    • row, col 转换为x, y 的规范方法是使用乘法运算符。无需翻译步骤或额外功能:(0.5, 0.5) * affine
    猜你喜欢
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多