首页 > 解决方案 > 使用 gdal_translate 时如何保留源栅格投影?

问题描述

我目前正在研究一个小型栅格精炼工具。目标是拥有一个简单的 CLI 工具,从地理参考源栅格计算切片并创建相应的 index.shp。为此,我使用 python 3.7 和 gdal。该工具运行平稳并生成预期的切片和 shapefile,但它摆脱了存储在源栅格中的投影。Qgis 将新计算的图块默认为 EPSG 4326,同时通知我一个未知的投影。原始栅格位于 EPSG 25832 中。

我的设置:

视窗 10 64 位

Python 3.7.2

Gdal 我无法访问特定版本,因为未安装 gdal-config 并且我无法使其工作,但它是 64 位的,我通过 gisinternals.com 上提供的二进制文件安装了它。Windows 软件列表显示 GDAL 204 MSVC 2017。

运行脚本时,我收到错误消息,告诉我缺少文件,例如 pcs.csv、datum.csv ellipsoid.csv 等。这表明拥有这些文件可以解决我的问题。但奇怪的是,我使用 Osgeo4W 安装了带有 gdal 的 python 2.7,它就像一个魅力,当然调整了 python 部分。瓦片被计算并留在源的投影中。没有任何指定投影的外部文件,实际上使用完全相同的数据,这让我很困惑。

据我了解,没有任何标志或选项可以强制 gdal 保持投影。如果忽略或误解了文档,我很乐意提供建议。

在有人问之前,我知道使用 osgeo4w 安装程序显然是这里简单且有效的解决方案。但请记住,python 2.7 将很快停产,并以此为契机学习新事物,我想构建一个基于 3.7 的工具,并在我的机器上安装 gdal

相应的代码如下所示,并执行以下操作:

1.) 构建命令字符串

2.) 字符串被交给 os.system,然后相应地执行

    for i in range(0, width, tilelenght):
        y = 0
        for j in range(0, height, tilelenght):
            gdaltranString = f'gdal_translate -of GTIFF -srcwin {i}, {j}, {tilelenght}, {tilelenght} {input_filepath} {output_filepath}{x}_{y}.tif'
            subprocess.run(gdaltranString)
            y = y+1
        x = x+1

预期结果将是一组功能性 .tif 文件,其中包含源文件的 EPSG 代码,在本例中为 25832。

但正如已经提到的,投影在过程中的某个地方会丢失。

标签: python-3.xgisrastergdalmap-projections

解决方案


因此,我找到了解决问题的方法,但并没有真正了解它是如何成为问题的。

解决方案是使用投影定义文件的路径创建用户变量GDAL_DATA。

奇怪的是,我现在有 GDAL_DATA,作为系统变量用户变量,都指向同一个目录。

如果有人更了解windows系统变量的神秘方式,请分享你的智慧,或者说智慧的来源。


推荐阅读