[Python] SWGI编译C代码为Python module --- 编译Modis 经纬度转HV的C代码tilemap3_r4_0.tar

1 篇文章 0 订阅
1 篇文章 0 订阅

 

环境创建:

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.csdn.net/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

如果遇到其它问题可留言告知,或许可帮忙想想办法~~~

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值