在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. 在C#中调用另一个应用程序或命令行(.exe 带参数)<zz>

    在.net中使用system.diaglostics.Process可以用来调用另一个命令行或程序. using   System.Diagnostics;     如果是dos     Proces ...

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

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

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

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

  4. VC++ 利用MAPI实现在程序中调用默认的电子邮件程序发送EMAIL(可以添加附件)。

    1.利用ShellExecute 可以条用默认邮件客户端,但不能发送带附件的邮件 mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文   如:ShellExe ...

  5. html中调用本地exe应用程序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 【转】Python中实现远程调用(RPC、RMI)简单例子

    远程调用使得调用远程服务器的对象.方法的方式就和调用本地对象.方法的方式差不多,因为我们通过网络编程把这些都隐藏起来了.远程调用是分布式系统的基础. 远程调用一般分为两种,远程过程调用(RPC)和远程 ...

  7. Python中实现远程调用(RPC、RMI)简单例子

    说白了,远程调用就是将对象名.函数名.参数等传递给远程服务器,服务器将处理结果返回给客户端   远程调用使得调用远程服务器的对象.方法的方式就和调用本地对象.方法的方式差不多,因为我们通过网络编程把这 ...

  8. C语言开发CGI程序的简单例子

    这年头用C语言开发cgi的已经不多,大多数的web程序都使用java.php.python等这些语言了. 但是本文将做一些简单的cgi实例. 首先配置环境 #这里是使用的apache AddHandl ...

  9. VS2010运行正常的控制台程序在VS2015中出现乱码的解决方法

    以前在Visual Stuido 2010中运行正常的控制台程序,在Visual Studio 2015中出现乱码,找到<Visual Studio 2015的坑:中文字符串编译后成乱码> ...

随机推荐

  1. Linux中图形界面和文本模式相互切换

    1.默认开机进入文本模式 如果想让开机自动进纯文本模式, 修改/etc/inittab 找到其中的 id:5:initdefault: 这行指示启动时的运行级是5,也就是图形模式 改成3就是文本模式了 ...

  2. 使用VTemplate模板引擎动态生成订单流程图

    1.VTemplate模板引擎的简介 VTemplate模板引擎也简称为VT,是基于.NET的模板引擎,它允许任何人使用简单的类似HTML语法的模板语言来引用.NET里定义的对象.当VTemplate ...

  3. Jboss基础及简单的应用

    初学Jboss,对于Jboss的基础认识以及配置做一些记录 Jboss基础: JBoss是什么–基于J2EE的应用服务器–开放源代码–JBoss核心服务不包括支持servlet/JSP的WEB容器,一 ...

  4. uva11292贪心基础题目

    C - 贪心 基础 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bi ...

  5. BestCoder Round #81 (div.2)1001

    Machine Accepts: 580 Submissions: 1890 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...

  6. 【笔记】shell下的主要工具

    shell 下有很多工具是非常好的辅助. 一.自我精进的途径 1.help / --help :简要的帮助说明: help 是针对 shell 内建功能的帮助, gnu工具一般为 "程序名 ...

  7. 集合:在我的世界里,你就是唯一 - 零基础入门学习Python027

    集合:在我的世界里,你就是唯一 让编程改变世界 Change the world by program 好,上课之前小甲鱼考考大家还记不记得上节课的内容?上节课我们讲Python中的"字典& ...

  8. css3绘制几何图形

    用css3绘制你需要的几何图形 1.圆形 示例: 思路:给任何正方形元素设置一个足够大的 border-radius ,就可以把它变成一个圆形.代码如下: html: <div class=&q ...

  9. Bootstrap 模态对话框 remote指定内容加载

    第一个页面: .....其他内容..... <div class="modal" id="ID_ReformDetail"> <div cla ...

  10. 用RBG颜色设置自定义颜色

    这个是Mac自带的测色计   快捷键shift + command + c即可复制RBG格式的颜色 #DD0000 这个是csdn 的logo里的红色 我们得到的是十六位颜色代码 但是UIColor( ...