JS调用Envi Services Engine发布的影像处理服务

    xiaoxiao2026-08-14  6

    JS调用Envi Services Engine发布的影像处理服务

    任务:将遥感影像处理功能(自定义算法)发布到Envi Services Engine(ESE)上,客户端javascript调用REST接口

    我的流程:

    ESE安装自定义算法编译成DLL构造IDL PRO文件(调用DLL)和TASK文件IDL发布服务ESE控制台测试服务Task Request Builder客户端调用服务

    ESE安装

    ESE支持64位的Linux和Windows系统,安装ESE之前,确保机器上已经安装了ENVI/IDL产品。 集群安装方法 单机安装方法 申请ESE许可会给个安装文档(针对windows linux)

    自定义算法编译成DLL

    本菜鸡用C++开发的图像处理分割分类算法(用了GDAL OPENCV库),一不小心编译成了32bit dll,给后续带来麻烦,建议编译成64bit dll(如果你的算法用c写的 也可以编译成其他东东给IDL调用)

    对于接口,涉及到IDL-DLL混编,IDL程序设计董彦卿这本书中有介绍,353页,需要注意的是:

    定义接口变量:

    IDL_LONG_RETURN ImgExtend(int argc,void *argv[]) { //用指针类型变量获得外部数据的地址 IDL_STRING img_input=*(IDL_STRING*)argv[0]; IDL_STRING img_output=*(IDL_STRING*)argv[1]; string str_input = img_input.s; string str_output = img_output.s; float sigma = *(float*)argv[2]; float k = *(float*)argv[3]; int min_size = *(int *)argv[4]; CGraphCutSeg grphcutSeg; return grphcutSeg.GraphCutSeg_Run(str_input,str_output,sigma,k,min_size); }

    里面有STRING型变量的接口转换,书上没我也不会,最终这种方法测试可行。 尽量编译成64位dll! 还有需要注意的是 将编译好的dll 以及程序用到的dll(gdal opencv)一同放在\bin\bin.x86_64里 假如编译了32位 要放在\bin\bin.x84 里

    构造IDL PRO文件(调用DLL)和TASK文件

    打开idl 64bit,按照书中方法调用即可 倘若不幸是32位dll,会报错,解决方法为点这里,也就是用32位进程去做 我的代码如下:

    pro ESE_Seg, Path_Before=path_before, Path_After=path_after, Sigma=sigma, K=k, Min_Size=min_size, OUTPUT=output compile_opt idl2 ;TODO auto-generated stub b=idl_idlbridge(ops=32) dll = 'SegDLL.dll'; b.setvar,"dll",dll b.setvar,"path_before",path_before b.setvar,"path_after",path_after b.setvar,"sigma",sigma b.setvar,"k",k b.setvar,"min_size",min_size command = "output = Call_External(dll,'ImgExtend',path_before, path_after, sigma, k, min_size)" b.execute,command b.execute,"output=output" output=b.getvar('output') end

    setvar getvar用作设置 取出 进程中的数据 还有个问题,对于C++ int型数据参数 我在IDL中传入 数值200 运行,IDL会出错,而传入 200L不会出错,不知什么原因,所以如果出错,换成FLOAT类型参数试试

    构建TASK envi idl殿堂博客有 TASK文件如果有磁盘路径参数,记得用\,如d:\\test\\temp

    IDL发布服务

    IDL 打开 Task文件,下发点 发布 点对应的服务(异步同步要与task参数对应)发布即可

    ESE控制台测试服务Task Request Builder

    写好参数 下方showrequest会有REST地址 submit提交请求 如果是异步 刷新 处理完jobprocss会达到100

    客户端调用服务

    由于是跨域 需要jsonp方式调用ese服务 我的是 angularjs框架 $http服务

    $scope.eseURL = 'http://dell-pc:8181/ese/services/AsyncService/ESE_Seg/submitJob?callback=JSON_CALLBACK'; $scope.ExecuteSegment = function(){ var eseRequest = $http({ method:'JSONP', url:$scope.eseURL, params:{ 'Path_Before':"E:\\jasonESE\\ESEtest\\seg.tif", 'Path_After':"E:\\jasonESE\\ESEtest\\segout.tif", 'Sigma':$scope.sigma, 'K':$scope.k, 'Min_Size':$scope.minSize } }); eseRequest.then(function(res){ console.log(res.data.redirect_url); $scope.ESE_Async_poll(eseHost + res.data.redirect_url, $scope.successFunc); }, function (error) { console.log("Error: ", error.message); }) };

    url要加callback=JSON_CALLBACK

    $scope.ESE_Async_poll = function(jobStatusURL,successFunc){ var eseRequest = $http({ method:'JSONP', url: jobStatusURL, params:{'callback' : 'JSON_CALLBACK'} }); eseRequest.then( function (res) { var job_progress = parseInt(res.data.jobProgress); var job_message = res.data.jobProgressMessage; var job_status = res.data.jobStatus; $scope.jobProgress = job_progress; console.log($scope.jobProgress); // check the status switch (job_status) { case 'esriJobSucceeded': successFunc(res); break; case 'esriJobCancelled': break; case 'esriJobFailed': break; default: $scope.sleep(1000); $scope.ESE_Async_poll(jobStatusURL, successFunc); } }); }

    异步 获取处理状态 代码由esri提供参考修改 后续还有结果的显示等

    到此为止了 没学过web 算是ese试用 就这么多总结了 我是小菜鸡

    转载请注明原文地址: https://ju.6miu.com/read-1311163.html
    最新回复(0)