首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么gdal_grid会把图像颠倒过来?

为什么gdal_grid会把图像颠倒过来?
EN

Stack Overflow用户
提问于 2016-11-07 12:14:47
回答 4查看 2.6K关注 0票数 2

我正在尝试使用gdal_grid从geojson中的一个表面生成一个高程网格。我使用以下命令:

代码语言:javascript
运行
复制
gdal_grid -a linear:radius=0 inputSurface.geojson outputFile.tif

它似乎给出了正确的像素值,但是如果我在Global或QGIS中打开结果,图像就会在水平轴上翻转/镜像,这样tif就直接在表面下面和上下颠倒。原因是什么,我该如何解决??

更新

我已经试过改变地球变换了,但它并没有完全解决我的问题。

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

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

代码语言:javascript
运行
复制
Xgeo = GT[0] + Xpixel*GT[1] + Yline*GT[2]
Ygeo = GT[3] + Xpixel*GT[4] + Yline*GT[5]

gdal_grid返回的图像具有一个正的GT5,但不幸的是,将其更改为-GT5并没有改变任何事情。

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

代码语言:javascript
运行
复制
transform = list(ds.GetGeoTransform())
transform = [upperLeftX, transform[1], 0, upperLeftY, 0, -transform[5]]
ds.SetGeoTransform(transform)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-05 12:24:57

最后,我在gdal_grid上遇到了更多的问题,因为它只是在看似随机的地方崩溃,所以我使用了名为网格数据( griddata )的with .内插函数。这使用了一个网格来获取网格中的坐标,由于网格的内存限制,我不得不将它平铺起来。

代码语言:javascript
运行
复制
import scipy.interpolate as il #for griddata
import numpy as np
# meshgrid of coords in this tile
gridX, gridY = np.meshgrid(xi[c*tcols:(c+1)*tcols], yi[r*trows:(r+1)*trows][::-1])

## Creating the DEM in this tile
zi = il.griddata((coordsT[0], coordsT[1]), coordsT[2], (gridX, gridY),method='linear',fill_value = nodata) # fill_value to prevent NaN at polygon outline
raster.GetRasterBand(1).WriteArray(zi,c*tcols,nrows-r*trows-rtrows)

线性插值似乎和gdal_grid应该做的一样。这实际上是通过使地球转换中的第5‘元素变为负值来实现的,正如问题更新中所描述的那样。

参见scipy.interpolate.griddata的描述。

有几件事要注意:

  1. 大地变换中使用的点应该是左上角。
  2. Y方向的分辨率应该是负的。
  3. 在投影中(至少我所用的)正y方向向上。
  4. 在numpy数组中,正y方向向下。
  5. 当使用gdal的WriteArray时,它使用左上角

希望这有助于其他人的困惑。

票数 1
EN

Stack Overflow用户

发布于 2016-11-07 13:02:12

GDAL的地理参考值通常由两组参数指定。第一个是空间参考,它定义了坐标系(UTM,WGS,一些更本地化的东西)。光栅的空间参考值是使用gdal.Dataset.setProjection()设置的。第二个地理参照是GeoTransform,它将(行、列)像素索引转换为坐标系中的坐标。这很可能是您需要更新的地理转换,使您的形象“翻转”。

GeoTransform是一个由6个值组成的元组,它将光栅索引关联到坐标中。

代码语言:javascript
运行
复制
Xgeo = GT[0] + Xpixel*GT[1] + Yline*GT[2]
Ygeo = GT[3] + Xpixel*GT[4] + Yline*GT[5]

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

代码语言:javascript
运行
复制
[ ]----> column
 |
 |
 v row

这意味着当图像在坐标系中“垂直”定位时,GT[1]将是正的。类似地,有时也是反直觉的,GT[5]将是负的,因为y值对于图像中的每一行都应该减少。这不是一个要求,但它是非常常见的。

修改GeoTransform

您可以声明图像是颠倒的,在应该在哪里的下面。这不一定是一个修复,但它会让你开始。如果你面前有图像并且可以实验或者比较坐标,那就更容易了.

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2020-10-07 14:19:58

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40464969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档