写在前面
师弟有个需求:对于WRF的地形文件,将其转换为更高分辨率的数据,参考网上的教程,已经解决了80%的问题。其中,需要编译一个convert_geotiff
程序,这里记录一下在Linux系统上的编译过程。有几个比较坑的地方,由于我这里用的Linux版本太老了。
步骤1:安装libgeotiff-dev
在ubuntu上,安装命令为:
sudo apt-get install libgeotiff-dev
在macos上,安装命令为:
brew install libgeotiff
在Linux上安装命令为:
sudo yum install libgeotiff-devel
注意,这里需要管理员权限
步骤2:下载编译的安装包
wget https://github.com/openwfm/convert_geotiff/releases/download/v0.1/convert_geotiff-0.1.0.tar.gz
步骤3:解压安装包
解压
tar -zxvf convert_geotiff-0.1.0.tar.gz
进入解压后的文件夹
cd convert_geotiff-0.1.0/
步骤4: 进行编译
编译命令为:
./configure && make
这里我这里出现报错了,所以分开来debug,首先./configure
,这里出现一个问题是:Cannot find GEOTIFF headers
checking for geotiff/geotiffio.h... no
configure: error: Cannot find GEOTIFF headers
主要是找不到geotiffio.h
这个文件,这里通过locate命令进行查找,
locate geotiffio.h
发现是存在的,位置为:
"/usr/include/libgeotiff/geotiffio.h"
所以这里需要在环境配置脚本~/.zshrc
里面指定该位置:
export CFLAGS="-I/usr/include/libgeotiff"
export LDFLAGS="-L/usr/include/libgeotiff/"
添加之后,source ~/.zshrc
使脚本生效,再次编译,显示成功,这里有个警告但是不影响后续使用
步骤5:构建程序
上面相关环境配置好之后,进行构建,使用命令:make
,又出错了,错误提示为:
gcc -I/usr/include/libgeotiff -L/usr/lib64 -o convert_geotiff convert_geotiff.o geogrid_tiles.o read_geotiff.o write_geogrid.o -lgeotiff -ltiff
/usr/bin/ld: geogrid_tiles.o: undefined reference to symbol 'ceil@@GLIBC_2.2.5'
//usr/lib64/libm.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [convert_geotiff] Error 1
主要的错误信息为:
/usr/bin/ld: geogrid_tiles.o: undefined reference to symbol 'ceil@@GLIBC_2.2.5'
网上搜索的解决方案为:
为了链接 libm,你需要添加-lm 参数
所以,这里找到生成的Makefile文件,通常,Makefile
会指定编译器和链接器的选项,你可以在其中找到 LDFLAGS
或 LIBS
变量。
vi Makefile
搜索LDFLAGS
,在这里,原本的我的LIBS后面为
LIBS = -lgeotiff -ltiff
这里进行修改,添加-lm
,修改为
LIBS = -lgeotiff -ltiff -lm
修改后,保存,再次运行make
,显示了以下信息:
gcc -I/usr/include/libgeotiff -L/usr/lib64 -o convert_geotiff convert_geotiff.o geogrid_tiles.o read_geotiff.o write_geogrid.o -lgeotiff -ltiff -lm
然后,就发现编译好了,存在了convert_geotiff
可执行程序
测试程序,是可以正常有提示信息的
步骤6: 测试程序
这里对编译好的数据进行测试,新建一个文件夹,选择一个任意的tiff文件,调用相关命令
mkdir topo3s && cd topo3s && cp "/Users/xxx/srtm_jiangsu/srtm_jiangsu.tif" .
进行高分辨率数据转换:
../convert_geotiff -w 4 -t 1500 -u "meters MSL" -d "3s topography" -b 0 -m -32768 "/Users/xxx/srtm_jiangsu/srtm_jiangsu.tif"
运行结束后生成以下文件:
总结
由于没有完整的看相关高分辨率转换的过程,所以这里只涉及编译convert-geotiff的问题。此外,经过测试,我发现在自己的wsl上编译这个更简单一点,完全没有我在Linux上遇到这么多坑的地方。所以,如果是刚需的话,还是建议在Ubuntu上进行编译。我这里的Linux上的gcc太老了,4.8的版本感觉要被淘汰了。
★https://stackoverflow.com/questions/16006145/ld-undefined-reference-to-symbol-log2glibc-2-2-5
https://blog.csdn.net/u012351051/article/details/109097970
https://forum.mmm.ucar.edu/threads/resolved-why-high-resolution-terrain-data-does-not-match-actual-altitude%EF%BC%9F.16095/
https://github.com/openwfm/convert_geotiff?tab=readme-ov-file