尝试将 .dem 文件转换为 .grid 文件时出现 Python 的 DLL 加载失败错误
DLL load failed error with Python while trying to convert .dem files to .grid files
我一直在努力寻找一种免费且简单的方法来将 .dem 文件转换为 .grid 文件,并且我一直在努力获得一个在线的 python 程序来执行此操作。我一直收到一个我不明白的错误,在网上查找显示人们以前遇到过这个错误,但不一定是在我发现它的上下文中,所以他们的解决方案涉及安装不同的模块那不是我需要的。
这是我的 python 分期付款:
Python 3.4.0 (v3.4.0:04f714765c13) [MSC v.1600 64 bit (AMD64)] on win32
以下是我安装所需模块 osgeo 的方法。我按照上述 python 部分的步骤进行操作,确保我对所有内容都使用了正确的版本:
Instructions I used
遵循这些说明让我克服了 osgeo 不存在的错误,所以至少我在这方面取得了一些进展。
这是我一直在尝试的代码 运行:
import sys
import os
import osgeo.gdal as gd
from gdalconst import GA_ReadOnly, GDT_Byte, GDT_UInt16, GDT_Int16, \
GDT_UInt32, GDT_Int32, GDT_Float32, GDT_Float64
import struct
# GDAL data types to packt data_types
gd_type = {GDT_Byte: "b",
GDT_UInt16: "H",
GDT_Int16: "h",
GDT_UInt32: "I",
GDT_Int32: "i",
GDT_Float32: "f",
GDT_Float64: "d"}
# establish input file
ifilename = r"C:\Users\Nick\Desktop\sample.dem"
# generate output file name
ofilename = os.path.splitext(ifilename)[0] + ".grid"
# use gdal to read DEM file
idataset = gd.Open(ifilename, GA_ReadOnly)
if idataset is None:
print("Cannot read input file {}".format(ifilename));
sys.exit(2)
# get size of dem
cols = idataset.RasterXSize
rows = idataset.RasterYSize
# get and calculate coordinate limits
tr = idataset.GetGeoTransform()
xul = tr[0]
yul = tr[3]
xlr = xul + (cols - 1) * tr[1]
ylr = yul + (rows - 1) * tr[5]
# write data to binary output
of = open(ofilename, "wb")
of.write(struct.pack("2i", cols, rows))
of.write(struct.pack("4f", xul, ylr, xlr, yul))
band = idataset.GetRasterBand(1)
d = band.ReadRaster(0, 0, cols, rows, cols, rows, band.DataType)
data = struct.unpack(gd_type[band.DataType] * (rows * cols), d)
of.write(struct.pack("f" * (cols * rows), *data))
of.close()
这是我的错误信息:
Traceback (most recent call last):
File "C:/Users/Nick/Desktop/demtogrid.py", line 3, in <module>
import osgeo.gdal as gd
File "C:\Python34\lib\site-packages\osgeo\__init__.py", line 21, in <module>
_gdal = swig_import_helper()
File "C:\Python34\lib\site-packages\osgeo\__init__.py", line 17, in swig_import_helper
_mod = imp.load_module('_gdal', fp, pathname, description)
File "C:\Python34\lib\imp.py", line 243, in load_module
return load_dynamic(name, filename, file)
ImportError: DLL load failed: The specified module could not be found.
我还尝试了 this forum 的其他代码,例如名为 siki 的用户的代码,但我所有的尝试都以相同的方式结束如上例所示的错误。
感谢所有提供帮助的人。同样,它不必是为我进行转换的 python 脚本,我只需要一种将 .dem 转换为 .grid 的免费方法,而像 ArcGIS 这样的典型程序并不是免费的。
您没有正确设置 %PATH% 环境变量。我设法重现了这个问题,并修复了它。我采取的一些步骤与常规步骤不同,原因我稍后会解释:
- 我的机器上安装了 ~10 Python 个(有些是安装的,有些是我构建的 - 使用不同的编译器;其中大部分是 x64,有些是 VEnved,但这应该没有什么区别),Python 3.4 x64 (使用编译器构建 v1.600 - VStudio 10.0) 就在其中
已将您的代码保存在我的计算机上 (code.py)。 运行 它,(显然)失败了:
(py34x64_test) E:\Work\Dev\Whosebug\q048854161>"e:\Work\Dev\VEnvs\py34x64_test\Scripts\python.exe" code.py
Traceback (most recent call last):
File "code.py", line 3, in <module>
import osgeo.gdal as gd
ImportError: No module named 'osgeo'
已下载:
- [GISInternals]: release-1600-x64-gdal-2-2-3-mapserver-7-0-7.zip - 在单个 .zip 包中编译二进制文件
- [GISInternals]: GDAL-2.2.3.win-amd64-py3.4.msi - GDAL python 绑定的安装程序(需要安装 GDAL 核心)
- 解压(在当前目录):
- #1. 在名为 gdal 的目录中 - 通过简单地解压缩它
- #2. 在名为 gdal_py 的目录中 - 通过 运行
msiexec /a GDAL-2.2.3.win-amd64-py3.4.msi TARGETDIR="E:\Work\Dev\Whosebug\q048854161\gdal_py"
(msiexec
的 管理安装 如 [SuperUser]: How do I extract files from an MSI package?, check [MS.Docs]: Command-Line Options 所示以获取更多详细信息)
- 因为正常安装是把相关文件放在Pythoninstall目录下,也是模仿的,所以实际上相关文件是安装在“gdal_py\Lib\site-packages",为了简单起见,我将它们向上移动了 2 个文件夹(直接在 gdal_py 目录中)
- 我这样做是因为我不想用 pkg 污染我的 OS '可能只会使用一次,所以我希望这 2 个只与这个问题有关。当然,这是额外麻烦的来源(开玩笑 :)),在常规安装过程中不会发生
将gdal_py添加到%PYTHONPATH%(常规安装[=41不需要=]#2.,因为文件已经在Python的模块搜索路径中-检查我之前必须做的移动操作),并且 运行 再次产生:
(py34x64_test) E:\Work\Dev\Whosebug\q048854161>set PYTHONPATH=%PYTHONPATH%;gdal_py
(py34x64_test) E:\Work\Dev\Whosebug\q048854161>"e:\Work\Dev\VEnvs\py34x64_test\Scripts\python.exe" code.py
Traceback (most recent call last):
File "code.py", line 3, in <module>
import osgeo.gdal as gd
File "E:\Work\Dev\Whosebug\q048854161\gdal_py\osgeo\__init__.py", line 21, in <module>
_gdal = swig_import_helper()
File "E:\Work\Dev\Whosebug\q048854161\gdal_py\osgeo\__init__.py", line 17, in swig_import_helper
_mod = imp.load_module('_gdal', fp, pathname, description)
File "e:\Work\Dev\VEnvs\py34x64_test\lib\imp.py", line 243, in load_module
return load_dynamic(name, filename, file)
ImportError: DLL load failed: The specified module could not be found.
这正是你的错误。因此,它尝试加载 _gdal.pyd 并失败,不是因为它找不到它,而是因为它的(某些)依赖项找不到(这里是错误消息具有误导性,如果未找到该模块,则错误将是:ImportError: No module named '_gdal'
)。
下面是 _gdal.pyd 在 Dependency Walker 中加载的图片。请注意,常规 #2. 安装将它放在 %PYTHON34X64_INSTALL_DIR%\Lib\site-packages\osgeo 下(这不是真正的环境变量, 只是一个路径占位符):
可见,依赖于gdal202.dll。因此,当 _gdal.pyd 被导入时, OS 需要找到它的所有依赖项:注意这是完成的递归地(依赖关系,依赖关系的依赖关系,等等)。这就是本教程中 %PATH% env var 设置的内容。对我来说,最简单的方法是添加 gdal202.dll 目录(因为它是 #1. 的一部分,即 gdal\bin) 到 %PATH% ([MS.Docs]: Dynamic-Link Library Search Order):
(py34x64_test) E:\Work\Dev\Whosebug\q048854161>set PATH=%PATH%;gdal\bin
(py34x64_test) E:\Work\Dev\Whosebug\q048854161>"e:\Work\Dev\VEnvs\py34x64_test\Scripts\python.exe" code.py
ERROR 4: C:\Users\Nick\Desktop\sample.dem: No such file or directory
Cannot read input file C:\Users\Nick\Desktop\sample.dem
成功了!好吧,它不太奏效,因为你的脚本中还有其他我没有的东西,但它 成功地 通过了这一步。现在,脚本中可能存在错误,这会阻止您实现目标,但这些错误与当前问题无关。
我一直在努力寻找一种免费且简单的方法来将 .dem 文件转换为 .grid 文件,并且我一直在努力获得一个在线的 python 程序来执行此操作。我一直收到一个我不明白的错误,在网上查找显示人们以前遇到过这个错误,但不一定是在我发现它的上下文中,所以他们的解决方案涉及安装不同的模块那不是我需要的。
这是我的 python 分期付款:
Python 3.4.0 (v3.4.0:04f714765c13) [MSC v.1600 64 bit (AMD64)] on win32
以下是我安装所需模块 osgeo 的方法。我按照上述 python 部分的步骤进行操作,确保我对所有内容都使用了正确的版本: Instructions I used 遵循这些说明让我克服了 osgeo 不存在的错误,所以至少我在这方面取得了一些进展。
这是我一直在尝试的代码 运行:
import sys
import os
import osgeo.gdal as gd
from gdalconst import GA_ReadOnly, GDT_Byte, GDT_UInt16, GDT_Int16, \
GDT_UInt32, GDT_Int32, GDT_Float32, GDT_Float64
import struct
# GDAL data types to packt data_types
gd_type = {GDT_Byte: "b",
GDT_UInt16: "H",
GDT_Int16: "h",
GDT_UInt32: "I",
GDT_Int32: "i",
GDT_Float32: "f",
GDT_Float64: "d"}
# establish input file
ifilename = r"C:\Users\Nick\Desktop\sample.dem"
# generate output file name
ofilename = os.path.splitext(ifilename)[0] + ".grid"
# use gdal to read DEM file
idataset = gd.Open(ifilename, GA_ReadOnly)
if idataset is None:
print("Cannot read input file {}".format(ifilename));
sys.exit(2)
# get size of dem
cols = idataset.RasterXSize
rows = idataset.RasterYSize
# get and calculate coordinate limits
tr = idataset.GetGeoTransform()
xul = tr[0]
yul = tr[3]
xlr = xul + (cols - 1) * tr[1]
ylr = yul + (rows - 1) * tr[5]
# write data to binary output
of = open(ofilename, "wb")
of.write(struct.pack("2i", cols, rows))
of.write(struct.pack("4f", xul, ylr, xlr, yul))
band = idataset.GetRasterBand(1)
d = band.ReadRaster(0, 0, cols, rows, cols, rows, band.DataType)
data = struct.unpack(gd_type[band.DataType] * (rows * cols), d)
of.write(struct.pack("f" * (cols * rows), *data))
of.close()
这是我的错误信息:
Traceback (most recent call last):
File "C:/Users/Nick/Desktop/demtogrid.py", line 3, in <module>
import osgeo.gdal as gd
File "C:\Python34\lib\site-packages\osgeo\__init__.py", line 21, in <module>
_gdal = swig_import_helper()
File "C:\Python34\lib\site-packages\osgeo\__init__.py", line 17, in swig_import_helper
_mod = imp.load_module('_gdal', fp, pathname, description)
File "C:\Python34\lib\imp.py", line 243, in load_module
return load_dynamic(name, filename, file)
ImportError: DLL load failed: The specified module could not be found.
我还尝试了 this forum 的其他代码,例如名为 siki 的用户的代码,但我所有的尝试都以相同的方式结束如上例所示的错误。
感谢所有提供帮助的人。同样,它不必是为我进行转换的 python 脚本,我只需要一种将 .dem 转换为 .grid 的免费方法,而像 ArcGIS 这样的典型程序并不是免费的。
您没有正确设置 %PATH% 环境变量。我设法重现了这个问题,并修复了它。我采取的一些步骤与常规步骤不同,原因我稍后会解释:
- 我的机器上安装了 ~10 Python 个(有些是安装的,有些是我构建的 - 使用不同的编译器;其中大部分是 x64,有些是 VEnved,但这应该没有什么区别),Python 3.4 x64 (使用编译器构建 v1.600 - VStudio 10.0) 就在其中
已将您的代码保存在我的计算机上 (code.py)。 运行 它,(显然)失败了:
(py34x64_test) E:\Work\Dev\Whosebug\q048854161>"e:\Work\Dev\VEnvs\py34x64_test\Scripts\python.exe" code.py Traceback (most recent call last): File "code.py", line 3, in <module> import osgeo.gdal as gd ImportError: No module named 'osgeo'
已下载:
- [GISInternals]: release-1600-x64-gdal-2-2-3-mapserver-7-0-7.zip - 在单个 .zip 包中编译二进制文件
- [GISInternals]: GDAL-2.2.3.win-amd64-py3.4.msi - GDAL python 绑定的安装程序(需要安装 GDAL 核心)
- 解压(在当前目录):
- #1. 在名为 gdal 的目录中 - 通过简单地解压缩它
- #2. 在名为 gdal_py 的目录中 - 通过 运行
msiexec /a GDAL-2.2.3.win-amd64-py3.4.msi TARGETDIR="E:\Work\Dev\Whosebug\q048854161\gdal_py"
(msiexec
的 管理安装 如 [SuperUser]: How do I extract files from an MSI package?, check [MS.Docs]: Command-Line Options 所示以获取更多详细信息)- 因为正常安装是把相关文件放在Pythoninstall目录下,也是模仿的,所以实际上相关文件是安装在“gdal_py\Lib\site-packages",为了简单起见,我将它们向上移动了 2 个文件夹(直接在 gdal_py 目录中)
- 我这样做是因为我不想用 pkg 污染我的 OS '可能只会使用一次,所以我希望这 2 个只与这个问题有关。当然,这是额外麻烦的来源(开玩笑 :)),在常规安装过程中不会发生
将gdal_py添加到%PYTHONPATH%(常规安装[=41不需要=]#2.,因为文件已经在Python的模块搜索路径中-检查我之前必须做的移动操作),并且 运行 再次产生:
(py34x64_test) E:\Work\Dev\Whosebug\q048854161>set PYTHONPATH=%PYTHONPATH%;gdal_py (py34x64_test) E:\Work\Dev\Whosebug\q048854161>"e:\Work\Dev\VEnvs\py34x64_test\Scripts\python.exe" code.py Traceback (most recent call last): File "code.py", line 3, in <module> import osgeo.gdal as gd File "E:\Work\Dev\Whosebug\q048854161\gdal_py\osgeo\__init__.py", line 21, in <module> _gdal = swig_import_helper() File "E:\Work\Dev\Whosebug\q048854161\gdal_py\osgeo\__init__.py", line 17, in swig_import_helper _mod = imp.load_module('_gdal', fp, pathname, description) File "e:\Work\Dev\VEnvs\py34x64_test\lib\imp.py", line 243, in load_module return load_dynamic(name, filename, file) ImportError: DLL load failed: The specified module could not be found.
这正是你的错误。因此,它尝试加载 _gdal.pyd 并失败,不是因为它找不到它,而是因为它的(某些)依赖项找不到(这里是错误消息具有误导性,如果未找到该模块,则错误将是:
ImportError: No module named '_gdal'
)。
下面是 _gdal.pyd 在 Dependency Walker 中加载的图片。请注意,常规 #2. 安装将它放在 %PYTHON34X64_INSTALL_DIR%\Lib\site-packages\osgeo 下(这不是真正的环境变量, 只是一个路径占位符):可见,依赖于gdal202.dll。因此,当 _gdal.pyd 被导入时, OS 需要找到它的所有依赖项:注意这是完成的递归地(依赖关系,依赖关系的依赖关系,等等)。这就是本教程中 %PATH% env var 设置的内容。对我来说,最简单的方法是添加 gdal202.dll 目录(因为它是 #1. 的一部分,即 gdal\bin) 到 %PATH% ([MS.Docs]: Dynamic-Link Library Search Order):
(py34x64_test) E:\Work\Dev\Whosebug\q048854161>set PATH=%PATH%;gdal\bin (py34x64_test) E:\Work\Dev\Whosebug\q048854161>"e:\Work\Dev\VEnvs\py34x64_test\Scripts\python.exe" code.py ERROR 4: C:\Users\Nick\Desktop\sample.dem: No such file or directory Cannot read input file C:\Users\Nick\Desktop\sample.dem
成功了!好吧,它不太奏效,因为你的脚本中还有其他我没有的东西,但它 成功地 通过了这一步。现在,脚本中可能存在错误,这会阻止您实现目标,但这些错误与当前问题无关。