在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. ViewPager实现页卡的3种方法(谷歌组件)

    ----方法一:---- 效果图: 须要的组件: ViewPager+PagerTabStrip 布局文件代码: <!--xmlns:android_custom="http://sc ...

  2. c++11 生产者/消费者

    下面是一个生产者消费者问题,来介绍condition_variable的用法.当线程间的共享数据发生变化的时候,可以通过condition_variable来通知其他的线程.消费者wait 直到生产者 ...

  3. 初识QML学习机制

    在QML中,一个用户界面被指定为具有属性的对象树,这使得Qt更加便于很少或没有编程经验的人使用,JavaScript在QML中作为一种脚本语言,对QML进行逻辑方面的编程. AD:WOT2015 互联 ...

  4. Some good iOS questions

    这里,我列举了一些在Stackoverflow中一些比较好的关于iOS的问题.大部分我列举的问题都是关于Objective C.所有问题中,我比较喜欢“为什么”这一类型的问题. 问题 1. What’ ...

  5. [.NET | 發佈] 如何指定固定的目錄給程式調用的外部DLL?

    1.OverView 一般程式只會查找與主程式同目錄的DLL檔案 解決方案主要可以參考這篇:http://support.microsoft.com/kb/837908 2.實作app.config方 ...

  6. compass模块----Helpers

    Color Stops:在使用CSS3渐变属性生成图片的时候,有时候为了打造更丰富的渐变效果除了声明渐变线上的起始点和终止点的色值,还有声明一些中间点的色值,这些点我们就称之为Color Stops. ...

  7. 高级子查询【weber出品必属精品】

    多列子查询 where条件中出现多列与子查询进行比较 多列子查询分为:成对比较和非成对比较 成对比较: SQL> select ename,sal,job from emp where (dep ...

  8. 为什么要用Math.sqrt(i)方法

    java 练习题 判断 101-200 之间有多少个素数,并输出所有素数 public class Prime { public static int count = 0; public static ...

  9. c#按键Up和Down对Textbox的内容加1减1

    private void textBox_proc1value_KeyDown(object sender, KeyEventArgs e) { Keys key = e.KeyCode; if (e ...

  10. unique &unique_copy

      unique (ForwardIterator first, ForwardIterator last); unique (ForwardIterator first, ForwardIterat ...