为什么gdal_grid将图像翻转?

时间:2016-11-07 12:14:47

标签: python grid gis gdal

我尝试使用gdal_grid从geojson中的曲面创建高程网格。我用这个命令:

gdal_grid -a linear:radius=0 inputSurface.geojson outputFile.tif

它似乎给出了正确的像素值,但是如果我在Global Mapper或QGIS中打开结果,则图像在水平轴上翻转/镜像,使得tif直接在表面下方并且颠倒。 这是什么原因以及如何解决?

更新

我已经尝试过更改地理转换,但它并没有完全解决我的问题。

我在gdalinfo中查看了结果图像,发现左上角实际上是左下角,所以我使用SetGeoTransform设置它。这将它移动到正确的位置,但它仍然是颠倒的。 (这可能取决于投影,这可能会在以后引起问题)

我还尝试查看地理转换中的像素宽度,如下所述:

Xgeo = GT[0] + Xpixel*GT[1] + Yline*GT[2]
Ygeo = GT[3] + Xpixel*GT[4] + Yline*GT[5]

gdal_grid返回的图像具有正GT [5],但遗憾的是将其更改为-GT [5]并没有改变任何内容。

我用来更改地理转换的代码:

transform = list(ds.GetGeoTransform())
transform = [upperLeftX, transform[1], 0, upperLeftY, 0, -transform[5]]
ds.SetGeoTransform(transform)

3 个答案:

答案 0 :(得分:1)

GDAL的地理配准通常由两组参数指定。第一个是空间参考,它定义了坐标系(UTM,WGS,更局部化的东西)。使用gdal.Dataset.setProjection()设置栅格的空间参考。第二个地理配准是GeoTransform,它将(行,列)像素索引转换为坐标系中的坐标。您可能需要更新地理转换以使您的图像“不会被解开”。

GeoTransform是一个包含6个值的元组,它将栅格索引与坐标相关联。

Xgeo = GT[0] + Xpixel*GT[1] + Yline*GT[2]
Ygeo = GT[3] + Xpixel*GT[4] + Yline*GT[5]

因为这些是光栅图像,所以(线,像素)或(行,col)坐标从图像的左上角开始。

[ ]----> column
 |
 |
 v row

这意味着当图像在坐标系中“竖直”放置时,GT[1]将为正。类似地,有时候反直觉地,GT[5]将是负数,因为对于图像中的每个增加的行,y值应该减小。这不是必需的,但它很常见。

修改GeoTransform

您声明图像是颠倒的,低于应该的位置。这不能保证是一个修复,但它会让你开始。如果您面前有图像并且可以试验或比较坐标,那就更容易了......

import gdal
# open dataset as readable/writable
ds = gdal.Open('input.tif', gdal.GA_Update)
# get the GeoTransform as a tuple
gt = gdal.GetGeoTransform()
# change gt[5] to be it's negative, flipping the image
gt_new = (gt[0], gt[1], gt[2], gt[3], gt[4], -1 * gt[5])
# set the new GeoTransform, effectively flipping the image
ds.SetGeoTransform(gt_new)
# delete the dataset reference, flushing the cache of changes
del ds

答案 1 :(得分:0)

我已经通过简单地重新投影gdal_grid的结果解决了类似的问题。尝试一下(用投影替换epsg代码,并替换输入/输出文件路径):

gdalwarp -s_srs epsg:4326 -t_srs epsg:4326 gdal_grid_result.tif inverted_output.tif

答案 2 :(得分:0)

它没有。它只是呈现它的工具的标准。尝试在 QGIS 中打开它,你会发现它是正面朝上的。

相关问题