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时用了并发处理也起到了部分加速作用吧。
SEXTANTE中调用任意C++控制台程序的简单例子相关推荐
- 在网页中调用本地的应用程序
在网页中调用本地的应用程序 例子: <script> function exec (command) { window.oldOnError = window.onerror; ...
- iOS 如何在一个应用程序中调用另一个应用程序
原则上iOS的沙箱原理,是阻止一个app去访问其他app的资源乃至是系统底层的资源的但是我们可以通过一种变相的方式:通过对应的URL模式和其他程序进行通讯. iOS应用之间的调用步骤: 一, 调用自己 ...
- C#中调用Windows系统服务exe程序的工具类与重启服务的流程
场景 使用C#编写的Windows服务程序,在Winform中进行调用. 常用工具类方法检测服务是否存在或者安装,获取服务状态,启动服务,停止服务的方法. 以在Winform中重启服务为例. 注: 博 ...
- chrome插件中调用ajax,Chrome扩展程序中的Ajax调用无效
尝试在Chrome扩展程序中发送ajax请求.我已经确认请求返回200响应,它应该只是console.log来测试'.我不确定这里是否存在异常问题?我已经阅读了Chrome扩展程序' addListe ...
- Extjs中加载异步树的最简单例子实现
<!-- Author:Lovingshu&&Mr Samael Date:2012/06/25 Remark:Teach You How To Build A AsyncTre ...
- LabVIEW中的VISA函数串口通信的简单例子
1.用VISA函数串口将数据读取并以数组的形式展示出来 前面板 程序 2.VISA函数串口数据读取与传出 前面板 程序
- 使用C++控制台程序或Python调用Dll创建Qt界面(dll中创建QApplication,qtwinmigrate的使用)
目录 理论 构建DLL 使用Python进行调用 使用C++控制台程序进行调用 理论 在Windows下,可能要用MFC或C#或Java,python调用一个插件,这个插件是一个dll,可以弄一个Qt ...
- lightgbm java_如何在C++程序中调用lightgbm (How to use lightgbm in C++ program)
本文作者为tieying zhang,有任何问题请联系zhangtiey@gmail.com Lightgbm以轻量著称,所以在实际的C++程序中,常常需要使用.但是官方文档并没有介绍如何在C++中调 ...
- Lua中调用C/C++函数 (转)
1.前言 上次偶说到从C/C++中调用Lua的函数, 然后就有朋友问从Lua中如何调用C/C++的 函数, 所以偶们这次就来说说这个问题. 首先偶们会在C++中建立一个函数, 然后 告知Lua有这个函 ...
最新文章
- 问一下,线程池里面到底该设置多少个线程?
- 北京超级云计算GPU服务器的使用教程
- linux perl 报错 Can‘t locate CPAN.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr.... 解决方法
- C++ 虚函数、多态
- 用SQL语句更改数据库名,表名,列名
- CVPR 2019 | 旷视提出超分辨率新方法Meta-SR:单一模型实现任意缩放因子
- WPF引用外部类库中的资源文件提示不能找到的解决方法
- Hyper-V 3 限定虚拟机可用的CPU利用率
- oracle substr函数
- 日志查看工具 logviewer pro的使用
- 练习4-10 找出最小值 (20分) 本题要求编写程序,找出给定一系列整数中的最小值。
- 三角函数与代数恒等式(1)
- 微信小程序-知晓云等云产品导出excel
- 【火影之卡卡西动漫主题】
- win10系统mongoDB 错误1053的处理方法
- Linux下的打包和解压缩命令
- 联想电脑thinkPad开机黑屏
- 记一次.Net Core程序启动失败的排查过程
- 谷歌pay服务端文档_腾讯米大师支付服务器端接入流程
- DevOps运维开发一体化【超详细】