环境创建:
MODLAND Tile Calculator代码下载及在线转换
https://landweb.modaps.eosdis.nasa.gov/cgi-bin/developer/tilemap.cgi
https://landweb.nascom.nasa.gov/developers/tilemap/tilemap3_r4_0.tar
此代码编译环境需要HDF4、HDF5、HDF-EOS2、HDF-EOS5环境,
使用HDF-EOS官方的HDF docker镜像:
https://hub.docker.com/r/hdfeos/hdfeos/~/dockerfile/
sudo docker pull hdfeos/hdfeos
还需要安装NASA官方的SDP ToolKit
https://newsroom.gsfc.nasa.gov/sdptoolkit/toolkit.html
wget ftp://edhs1.gsfc.nasa.gov/edhs/sdptk/latest_release/SDPTK5.2.20v1.00.tar.Z
tar zxvf SDPTK5.2.20v1.00.tar.Z
cd TOOLKIT
./configure --prefix=/usr/local/ --enable-install-include --with-hdf5=/usr/local --with-hdf4=/usr/local
#configure之后就在当前路径生成了Makefile文件,如果直接这么make后面再SWIG编译生成的模块会报错,需要加上-fPCI参数编译
vim Makefile
找到CC、CFLAGS、CPP 改为 CC=gcc -fPIC ,CFLAGS = -fPIC -DLINUX , CPP = gcc -fPIC -E
make && make install
#因为tilemap3代码中引用了SDPTK中的include的头文件,所以手动将其安装一下,安装完后export 一下环境变量,
#参考https://blog.youkuaiyun.com/FIELDOFFIER/article/details/50350753
mkdir /usr/local/SDPTK && cp ./include /usr/local/SDPTK && cp ./lib /usr/local/SDPTK
export C_INCLUDE_PATH=/usr/local/SDPTK/include/:$C_INCLUDE_PATH
export LD_LIBRARY_PATH=/usr/local/SDPTK/include/:$LD_LIBRARY_PATH
安装完后在的库文件就出现在了/usr/local/lib/linux64下面,但是仍然还差3个库文件,通过下面的命令下载下来
wget https://svn.ssec.wisc.edu/repos/bora/MODIS_Collect6/toolkit/lib/libGctp.a
wget https://svn.ssec.wisc.edu/repos/bora/MODIS_Collect6/toolkit/lib/libhdfeos.a
wget https://svn.ssec.wisc.edu/repos/bora/MODIS_Collect6/toolkit/lib/libmapi.a
cp libGctp.a libhdfeos.a libmapi.a /usr/local/lib/linux64/
编译C代码:
tar -zvxf tilemap3_r4_0.tar
cd tilemap3_r4_0
cp makefile_linux Makefile
vim Makefile #修改第一行SYSTEM = UNIX386 为 SYSTEM = UNIX64
vim /usr/local/SDPTK/include/cfortran.h
在第127行添加
#define f2cFortran
#修改完后试试
make all
编译成功生成tilemap3文件,./tilemap3,会打印Help文档,指明参数如何传入
SWGI编译Python Module:
我修改了tilemap3.c的源代码,增加了一个函数:
int gethv(double lat,double lon);
屏蔽掉了main函数,因为只关注从经唯度计算出Modis的HV编号
参考这个链接,开展下面的工作:
http://walkerdu.com/2017/12/06/swig-basic/
http://www.swig.org/Doc3.0/SWIGDocumentation.html#Introduction_nn4
#tilemap3.i
%module tilemap3
%{ extern int gethv(double lat,double lon);%}extern int gethv(double lat,double lon);
swig -python tilemap3.i
gcc -fPIC -c tile.c isinu.c error.c tilemap3.c tilemap3_wrap.c -I/usr/include/python3.5
gcc -shared -o _tilemap3.so tilemap3.o tile.o isinu.o error.o tilemap3_wrap.o -L/usr/local/lib/ -lhdfeos -lGctp -L/usr/local/lib/ -lmfhdf -ldf -lz -L/usr/local/lib/linux64/ -lPGSTK -lm
ImportError: /app/tilemap3_r4_0/_tilemap3.so: undefined symbol: PGS_GCT_Init
出现就必须要加上相应的lib路径进行编译
完成上面的工作在目录下会生成tilemap3.py和_tilemap3.so,.so的文件要以‘_’开头哦,
不然会出现:ImportError: dynamic module does not define init function (PyInit_tilemap3)
#python3
>>>import tilemap3
>>> tilemap3.gethv(32.56,123.25)
h28v05
如果遇到其它问题可留言告知,或许可帮忙想想办法~~~