python - 为什么 gdal_grid 会使图像上下颠倒?

标签 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)

最佳答案

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]

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

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

这意味着当图像在坐标系中“直立”定位时,GT[1] 将为正值。同样,有时与直觉相反,GT[5] 将为负数,因为图像中每增加一行,y 值就会减小。这不是必需的,但很常见。

修改地理变换

您声明图像是上下颠倒的并且低于应有的位置。这并不能保证一定能解决问题,但它可以帮助您入门。如果您面前有图像并且可以试验或比较坐标,那就更容易了...

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

关于python - 为什么 gdal_grid 会使图像上下颠倒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40464969/

相关文章:

python - 填充DataFrame,缺失数据

asp.net - 无法弄清楚如何使用 Mechanize 和 Python 从 ASP.NET 页面上的下拉框中选择项目

html - Bootstrap 网格系统 : is this code correct?

c# - 我怎样才能创建一个半随机的数字网格,使每个数字出现一次,最重要的是不要太接近它前面的数字?

c++ - 创建网格数组

gis - 将栅格数据导入 NetLogo 会生成一列所有补丁变量 = 0

python - 如何解决SSL证书错误

python - 如何使用pyqt5 webenginewidgets下载文件

django - GeoDjango:在地理 DWithin 查询中只允许使用度数单位的数值

javascript - 通过 R 向传单多边形添加 'click' 事件