我正在尝试使用gdal_grid从geojson中的一个表面生成一个高程网格。我使用以下命令:
gdal_grid -a linear:radius=0 inputSurface.geojson outputFile.tif
它似乎给出了正确的像素值,但是如果我在Global或QGIS中打开结果,图像就会在水平轴上翻转/镜像,这样tif就直接在表面下面和上下颠倒。原因是什么,我该如何解决??
更新
我已经试过改变地球变换了,但它并没有完全解决我的问题。
我查看了gdalinfo中的结果图像,发现左上角实际上是左下角,所以我使用SetGeoTransform设置它。这把它移到正确的位置,但它仍然是颠倒的。(这可能依赖于投影,这可能会在以后造成问题)
我还尝试查看地理转换中的像素宽度,如下所述:
Xgeo = GT[0] + Xpixel*GT[1] + Yline*GT[2]
Ygeo = GT[3] + Xpixel*GT[4] + Yline*GT[5]
gdal_grid返回的图像具有一个正的GT5,但不幸的是,将其更改为-GT5并没有改变任何事情。
我用来更改地理转换的代码:
transform = list(ds.GetGeoTransform())
transform = [upperLeftX, transform[1], 0, upperLeftY, 0, -transform[5]]
ds.SetGeoTransform(transform)
发布于 2016-12-05 12:24:57
最后,我在gdal_grid上遇到了更多的问题,因为它只是在看似随机的地方崩溃,所以我使用了名为网格数据( griddata )的with .内插函数。这使用了一个网格来获取网格中的坐标,由于网格的内存限制,我不得不将它平铺起来。
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的描述。
有几件事要注意:
希望这有助于其他人的困惑。
发布于 2016-11-07 13:02:12
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值对于图像中的每一行都应该减少。这不是一个要求,但它是非常常见的。
修改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
发布于 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
https://stackoverflow.com/questions/40464969
复制相似问题