zoukankan      html  css  js  c++  java
  • 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时用了并发处理也起到了部分加速作用吧。




  • 相关阅读:
    java 查看 class文件编译时使用的编译器版本
    eclipse新建maven工程(web工程)
    U盘插入后电脑提示“使用驱动器F:中的光盘之前需要将其格式化”,该怎么办?(实测有用)
    随笔安装theano的那些故事(亲测有效,附安装包)
    Python学习4Python的交互
    Mysql热备份总结
    php中date()函数的使用
    在linux中用C语言实现ping命令的部分功能
    【转】/etc/sysconfig/目录详解
    python学习(一)
  • 原文地址:https://www.cnblogs.com/pangblog/p/3339557.html
Copyright © 2011-2022 走看看