在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时用了并发处理也起到了部分加速作用吧。

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

  1. 在网页中调用本地的应用程序

    在网页中调用本地的应用程序 例子: <script> function exec (command) {     window.oldOnError = window.onerror;   ...

  2. iOS 如何在一个应用程序中调用另一个应用程序

    原则上iOS的沙箱原理,是阻止一个app去访问其他app的资源乃至是系统底层的资源的但是我们可以通过一种变相的方式:通过对应的URL模式和其他程序进行通讯. iOS应用之间的调用步骤: 一, 调用自己 ...

  3. C#中调用Windows系统服务exe程序的工具类与重启服务的流程

    场景 使用C#编写的Windows服务程序,在Winform中进行调用. 常用工具类方法检测服务是否存在或者安装,获取服务状态,启动服务,停止服务的方法. 以在Winform中重启服务为例. 注: 博 ...

  4. chrome插件中调用ajax,Chrome扩展程序中的Ajax调用无效

    尝试在Chrome扩展程序中发送ajax请求.我已经确认请求返回200响应,它应该只是console.log来测试'.我不确定这里是否存在异常问题?我已经阅读了Chrome扩展程序' addListe ...

  5. Extjs中加载异步树的最简单例子实现

    <!-- Author:Lovingshu&&Mr Samael Date:2012/06/25 Remark:Teach You How To Build A AsyncTre ...

  6. LabVIEW中的VISA函数串口通信的简单例子

    1.用VISA函数串口将数据读取并以数组的形式展示出来 前面板 程序 2.VISA函数串口数据读取与传出 前面板 程序

  7. 使用C++控制台程序或Python调用Dll创建Qt界面(dll中创建QApplication,qtwinmigrate的使用)

    目录 理论 构建DLL 使用Python进行调用 使用C++控制台程序进行调用 理论 在Windows下,可能要用MFC或C#或Java,python调用一个插件,这个插件是一个dll,可以弄一个Qt ...

  8. lightgbm java_如何在C++程序中调用lightgbm (How to use lightgbm in C++ program)

    本文作者为tieying zhang,有任何问题请联系zhangtiey@gmail.com Lightgbm以轻量著称,所以在实际的C++程序中,常常需要使用.但是官方文档并没有介绍如何在C++中调 ...

  9. Lua中调用C/C++函数 (转)

    1.前言 上次偶说到从C/C++中调用Lua的函数, 然后就有朋友问从Lua中如何调用C/C++的 函数, 所以偶们这次就来说说这个问题. 首先偶们会在C++中建立一个函数, 然后 告知Lua有这个函 ...

最新文章

  1. 问一下,线程池里面到底该设置多少个线程?
  2. 北京超级云计算GPU服务器的使用教程
  3. linux perl 报错 Can‘t locate CPAN.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr.... 解决方法
  4. C++ 虚函数、多态
  5. 用SQL语句更改数据库名,表名,列名
  6. CVPR 2019 | 旷视提出超分辨率新方法Meta-SR:单一模型实现任意缩放因子
  7. WPF引用外部类库中的资源文件提示不能找到的解决方法
  8. Hyper-V 3 限定虚拟机可用的CPU利用率
  9. oracle substr函数
  10. 日志查看工具 logviewer pro的使用
  11. 练习4-10 找出最小值 (20分) 本题要求编写程序,找出给定一系列整数中的最小值。
  12. 三角函数与代数恒等式(1)
  13. 微信小程序-知晓云等云产品导出excel
  14. 【火影之卡卡西动漫主题】
  15. win10系统mongoDB 错误1053的处理方法
  16. Linux下的打包和解压缩命令
  17. 联想电脑thinkPad开机黑屏
  18. 记一次.Net Core程序启动失败的排查过程
  19. 谷歌pay服务端文档_腾讯米大师支付服务器端接入流程
  20. DevOps运维开发一体化【超详细】

热门文章

  1. C语言字符减去‘0’的含义
  2. 如何迁移outlook邮件到另一个硬盘_急!如何转移outlook本地邮件
  3. 常见的UrlScheme
  4. Unity3D中的预制体Prefab
  5. 维峰电子深交所上市:市值64亿 李文化家族色彩浓厚
  6. 52.整理MySQL
  7. 一次搞懂延迟任务及十种延迟任务的实现方式
  8. 在金融行业中,直播获客应该怎么做呢?
  9. 金融直播有哪些好处?直播平台有哪些?
  10. VS2017项目配置X86改配置x64位