如何在使用不同坐标参考系的两个地理空间栅格数据之间找到对应的像素?

时间:2019-11-29 10:13:32

标签: python coordinate-systems coordinate-transformation rasterio

我有一些Landsat 8图像,其CRS = EPSG:32610。我有一个地面真实图像,其中每个像素代表该区域的类,其CRS = EPSG:4326。

我试图像documentation这样说,在rasterio中转换地面实况的CRS:

dst_crs = raster.crs
transform, width, height = calculate_default_transform(
    labels.crs, dst_crs, labels.width, labels.height, *labels.bounds)
kwargs = labels.meta.copy()
kwargs.update({
    'crs': dst_crs,
    'transform': transform,
    'width': width,
    'height': height
})

with rasterio.open('groundtruth.tif', 'w', **kwargs) as dst:
    reproject(
        source=rasterio.band(labels, 1),
        destination=rasterio.band(dst, 1),
        src_transform=labels.transform,
        src_crs=labels.crs,
        dst_transform=transform,
        dst_crs=dst_crs,
        resampling=Resampling.nearest)

这是转换前的标签(基本事实)元数据:

    {'driver': 'GTiff',
     'dtype': 'uint8',
     'nodata': None,
     'width': 4268,
     'height': 4782,
     'count': 1,
     'crs': CRS.from_epsg(4326),
     'transform': Affine(0.00032590510777881894, 0.0, -122.486874,
                         0.0, -0.0003259224173985775, 40.110855)}

这是在转换之后:

    {'driver': 'GTiff',
     'dtype': 'uint8',
     'nodata': None,
     'width': 3721,
     'height': 5316,
     'count': 1,
     'crs': CRS.from_epsg(32610),
     'transform': Affine(32.8370217224448, 0.0, 543729.4708124083,
                         0.0, -32.8370217224448, 4441798.7147279335)}

这是Landsat图像元数据:

{'driver': 'GTiff',
 'dtype': 'int16',
 'nodata': None,
 'width': 7463,
 'height': 7702,
 'count': 6,
 'crs': CRS.from_epsg(32610),
 'transform': Affine(30.0, 0.0, 504045.0,
        0.0, -30.0, 4421925.0)}

我知道我可以像这样在地球表面上找到像素的位置:

raster.transform * (x , y)
对于图像中的每个(x,y)位置

。 我的问题是Landsat影像中的像素比例为30米。当我进行转换时,比例不是30x30。如果我使用labels.transform * (x, y),则它永远不会与Landsat图像中raster.transform * (x, y)中的任何像素匹配,并且数字有很多小数位。

如何找到相应的像素?图像和地面真实图像来自同一站点,但不完全对齐,并且大小不同。

这种方法甚至对于寻找相应点是否正确?我的专业不是遥感,我对术语和CRS的细节也不熟悉。如果您能尽可能简单地向我解释,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

在用例中,您希望labels图像与raster图像完全对齐。

为此,您不应该使用calculate_default_transform函数,因为您已经注意到,它给出的transformwidthheight与那些函数不完全匹配您参考的raster图片中的一个。

相反,您应该将transform的{​​{1}},widthheight变量直接传递给raster函数:

reproject

完成此操作后,kwargs = labels.meta.copy() kwargs.update({ 'crs': raster.crs, 'transform': raster.transform, 'width': raster.width, 'height': raster.height }) with rasterio.open('groundtruth.tif', 'w', **kwargs) as dst: reproject( source=rasterio.band(labels, 1), destination=rasterio.band(dst, 1), src_transform=labels.transform, src_crs=labels.crs, dst_transform=raster.transform, dst_crs=raster.crs, resampling=Resampling.nearest) labels图像应完全对齐,并且应该能够将两个图像的像素一一对应。