200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > SEXTANTE中调用任意C++控制台程序的简单例子

SEXTANTE中调用任意C++控制台程序的简单例子

时间:2021-09-23 10:05:44

相关推荐

SEXTANTE中调用任意C++控制台程序的简单例子

在sextante中单纯利用python或者调用sextante已有算法进行自定义开发,很多情况下速度不咋给力,同样的操作调用QGIS的C++插件比用sextante里的算法要快,有时候快的 还不止一些,特别是当调用saga的算法时,saga要先进行一堆的数据格式转换,大大减慢了运行速度。为此,针对复杂的操作,多数情况下我都选择用C++进行开发,然后再在sextante里面进行调用。其调用实质就是python对C++的调用,网上资料很多,在此仅展示我的做法。

首先新建一个dll,在dll里面新建接口,专门用来调用exe,代码如下:

//**.h//导出exe调用接口,第一个参数为exe路径,第二个参数为exe的参数extern "C" __declspec(dllexport)int excute(_TCHAR*,_TCHAR*);

//**.cpp//exe调用接口的实现int excute(_TCHAR* exefile,_TCHAR* exeparams){SHELLEXECUTEINFO ShExecInfo = {0}; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = _T("open"); ShExecInfo.lpFile = exefile; ShExecInfo.lpParameters = exeparams; ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_HIDE; ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo);return WaitForSingleObject(ShExecInfo.hProcess,INFINITE)==WAIT_FAILED ? 1:0;}

生成dll后,在sextante自定义算法中调用该dll:

from ctypes import* #引入python下C类型库dll = CDLL(os.path.join(SextanteUtils.userFolder(),"cdlls\\FloodAuto.dll"))#根据dll存放路径生成dll对象exepath = os.path.join(SextanteUtils.userFolder(),"cdlls\\binaryraster\\autorun.exe") #待调用的exe的存放路径params = "-binaryraster -r " + rainpaths + " -c " + crifallpaths + " -o " + outputpaths + " -d ;" #调用exe时的输入参数if dll != None:dll.excute.argtypes = [c_wchar_p,c_wchar_p] #说明dll导出的接口函数的参数类型dll.excute(exepath,params) #进行exe调用

至于exe,随便怎么写,只要是可通过命令行进行调用的即可 。至此,只要用C++写好exe便可在sextante中轻松调用了。这样的做法感觉比直接写Python的C++拓展简单多了,同时,因为复杂的运算交给了C++进行操作,因而算法运行速度也上去了。例如我写的model:

该model中configuration算法读取配置文件从而获取数据存放路径,binary raster算法逐像元比较两张影像的大小从而生成二值化影像,cascade analysis算法将多个区域矢量文件分别与二值化影像进行叠加分析,统计矢量数据中多边形区域内二值化影像值为1所占比例大于某一给定比例值的区域个数,floodanalysis进行洪水淹没分析。整个流程原本部分调用sextante中saga或grass算法,处理几幅9000*6000大小的影像数据总运行时间要两三分钟,而完全调用自己用C++写的exe,总运行时间不到10秒钟!完全出乎意料之外呢,也许自己在写exe时用了并发处理也起到了部分加速作用吧。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。