【问题标题】:Rasterio equivalent for GDAL's GetProjection() and GetGeoTransform()?GDAL 的 GetProjection() 和 GetGeoTransform() 的 Rasterio 等价物?
【发布时间】:2021-04-09 11:48:05
【问题描述】:

我有一个 GeoTIFF,我已经在 OpenCV 中进行了很多处理。处理后,它丢失了它的空间信息,所以我需要将它重新插入。在 GDAL 中,我会在处理之前从原始图像中提取它,然后将其与后处理的图像一起推回,如下所示:

#open original geotiff
original_img = gdal.Open('/path-to-file/original_img.tif', 1)
crs = original_img.GetProjection()
gt = original_img.GetGeoTransform()
del original_ds

#open cv processes here....write post-processed file

# open processed raster and set the projection and geotransform
img = gdal.Open('/path-to-file/processed_img.tif', 1)
img.SetProjection(crs)
img.SetGeoTransform(gt)

有没有办法在 Rasterio 中做到这一点?

【问题讨论】:

    标签: python geospatial gdal rasterio


    【解决方案1】:

    根据RasterIO documentation,您可以简单地访问开放数据集上的crstransform 属性,以分别获取投影和地理变换。然后您可以将它们传回输出图像文件on opening

    例子:

    # Open original Geotiff
    original_img = rasterio.open("path/to/input.tif")
    # Extract spatial metadata
    input_crs = original_img.crs
    input_gt  = original.transform
    
    # Do your processing. For this example, just read first band of input dataset
    processed_img = original_img.read(1)
    
    # Prepare output geotiff file. We give crs and gt read from input as spatial metadata
    with rasterio.open(
      'path/to/output.tif',
      'w',
      driver = 'GTiff',
      count = 1,
      height = processed_img.shape[0],
      width  = processed_img.shape[1],
      dtype  = processed_img.dtype,
      crs    = input_crs,
      transform = input_gt  
    ) as output:
      output.write(processed_img, 1)
    

    上面例子的注释

    • 假设在处理图像时保留图像尺寸。如果不是,则必须相应地推导出空间变换。
    • 假设单波段数据集

    【讨论】:

    • 谢谢。 processes_img 定义在哪里?我在上面添加了一行,但它告诉我没有 .dtype 属性。嗯。
    • 在我的示例中未定义。它是处理结果图像的占位符(为了测试,它可以定义为输入数据集的第一个波段:original_img.read(1))。
    • 你能用通用术语来说明它是如何写的吗?它说当我以processed_img = rasterio.open('/Users/me/processed_img.tif') 将其读回时,没有与我处理的图像相关联的 dtype 但是,当我在 QGIS 中打开它时,它显示为一个 8 位无符号整数。
    • 当打开一个带有光栅的文件时,你会获得一个dataset,它包含一个dtypes属性,它是一个元组,给出了读取文件的每个波段的数据类型。您需要读取一个波段 (dataset.read(band))) 以获取具有 dtype 属性的图像。我更新了我的示例,将 processed_img 初始化为输入文件的第一个波段。
    • 谢谢!我还通过使用 cv2.imread() 上传处理后的图像来绕过这个问题。不过,感谢修订。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多