使用 gdal_translate 时如何保留源光栅投影?

How can i preserve the source raster projection when using gdal_translate?

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

我的设置:

Windows 10 64 位

Python 3.7.2

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

当 运行 脚本运行时,我收到错误消息告诉我缺少文件,例如pcs.csv、datum.csv ellipsoid.csv 等等。这表明拥有这些文件可以解决我的问题。 但奇怪的是,我使用 Osgeo4W 安装 python 2.7 和 gdal,它的工作原理非常棒,当然已经调整了 python 部分。瓷砖得到计算并留在源的投影中。没有任何指定投影的外部文件,实际上使用的是完全相同的数据,这让我很困惑。

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

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

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

1.) 命令字符串是 build

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。

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

所以,我找到了解决我的问题的方法,但并没有真正理解它是如何成为一个问题的。

解决方案是创建一个用户变量 GDAL_DATA,其中包含投影定义文件的路径。

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

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