通过在客户端调用创建好的GP服务,可以方便和容易的实现一些地理处理和分析功能。 GIS分析功能中生成等值线和等值面想必是常见的需求之一。
但是对新手来说,网上相关可参考的文章太少 实现的过程中难免处处碰壁。下面笔者把自己实现的过程步骤记录下来给有用到的朋友做参考之用。
要点:
gp服务是在轻量级客户端调用的 所以对输入输出参数有要求
关于建模的详细过程请参考ArcGIS的帮助文档或者在线帮助文档(http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#geoprocessing/guide_-1963186772.htm),里面叙述得非常详细了。
1.建模过程:
这里的生成等值面用到了空间分析中的插值分 析工具 IDW
在modelBuilder中添加该工具
Point是进行该分析运算的输入参数
双击IDW
Z value filed是我们要进行分析的字段 (降雨等值面--雨量值、人口分布等值面--人口数等等),该字段在输入参数Point中已经定义好。
最后得到的模 型图如下
Int工具-----栅格转矢量的时候 需要是数据为int 所以先取整
Raster to Polygon -------栅格转矢量
Clip-----对生 成的等值面图层用背景地图进行裁剪 使其和地图重合。
设置outputMap为参数 让它作为参数输出。 保存模型。
2. 模型测试
最后在ArcMap中测试上面建好的模型,在ArcToolbox中添加刚才建好的工具。双击打开然后选择输 入参数。 最后运行结果如下模型建立成功。
GP服务有三种方式,分别是
- A geoprocessing service.
- A geoprocessing service with a source map document.
- A geoprocessing service with a result map service.
-
这里我们需要第三种,这样通过客户端调用GP就能直接给我们返回一个resultMapLayer 然后直接加到前端的Map控件中。它的好处是生成的等值面可以在发布服务的时候就设置好外观样式,而不用在客户端来手动设置。
如何发布geoprocessing service with a result map service 请参考帮助文档,里面写得很详细这里就不重复了。这里要注意几个点,否则在Flex里调用的时候总会问题多多。
1、路径用相对路径或者通用路径;
2、在工具级别不设置临时工作空间,在arcMap中设置。
3、先在ArcMap中执行新建的模型,然后再把它作为toollayer加入xmd文档中。
4、一是geoprocessing 服务,一个是map服务,其中geoprocessing 服务必须用异步方式调用。
5、MAP服务必须是NONE POOL类型的服务,否则会出现无法删除结果文件的错误。
最后对发布好的GP服务进行测试。
打开ArcMap新建个空白文档,导航到GIS Servers添加一个相关的mapservice作为背景,(不能是上面发布的result map service)
ArcToolbox加入刚才发布好的geoprocessing 服务,双击打开然后输入参数,执行完毕后生成结果会作为一个新图层加入mxd文档中到此GP服务发布成功!
ArcServer +Flex 发布GP服务生成等值面(三) ---前端调用
<?xml version="1.0" encoding="utf-8"?>
<mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:esri=http://www.esri.com/2008/ags
layout="absolute" width="100%" height="100%" xmlns:layers="com.esri.ags.layers.*">
<mx:Script>
<![CDATA[
import classes.GPContainer;
import mx.managers.PopUpManager;
import mx.containers.TitleWindow;
import mx.containers.VBox;
import com.esri.ags.layers.ImageParameters;
import com.esri.ags.layers.GPResultImageLayer;
import com.esri.ags.tasks.Query;
import com.esri.ags.tasks.QueryTask;
import com.esri.ags.layers.GraphicsLayer;
import mx.messaging.channels.StreamingAMFChannel;
import mx.rpc.events.FaultEvent;
import com.esri.ags.tasks.JobInfo;
import com.esri.ags.events.GeoprocessorEvent;
import com.esri.ags.Graphic;
import com.esri.ags.events.MapMouseEvent;
import com.esri.ags.geometry.MapPoint;
import com.esri.ags.tasks.ExecuteResult;
import com.esri.ags.tasks.FeatureSet;
import com.esri.ags.tasks.ParameterValue;
import mx.controls.Alert;
import mx.rpc.AsyncResponder;
private var jobid:String="";
private function computeServiceArea(mapPoint:MapPoint):void
{ //先查询出FeatureSet 作为GP的输入参数
var queryTask:QueryTask=new QueryTask("http://sps-010/ArcGIS/rest/services/guangyuangp/MapServer/0");
queryTask.showBusyCursor=true;
var query:Query=new Query();
query.outFields=new Array("OBJECTID","SHAPE","DYP");
query.where="STCD <>''";
queryTask.execute(query,new AsyncResponder(onQueryResult,onQueryFault));
function onQueryResult(featureSet:FeatureSet, token:Object = null):void
{
var params:Object = {
"Input_point_features":featureSet
};
gp.addEventListener(GeoprocessorEvent.JOB_COMPLETE, completeCallback);
gp.addEventListener(FaultEvent.FAULT,onFault);
gp.submitJob( params );
}
function onQueryFault(info:Object, token:Object = null):void
{
Alert.show(info.toString());
}
}
function completeCallback(event: GeoprocessorEvent) : void
{
jobid=event.jobInfo.jobId;
var imageParameters : ImageParameters = new ImageParameters();
imageParameters.format="png32";
imageParameters.width=600;
imageParameters.height=400;
gp.getResultImage(event.jobInfo.jobId,"outputMap",imageParameters,new AsyncResponder(onimgok, onimgno));
}
function onimgok(info:Object, token:Object = null):void
{
var obj:Object=gp.getResultImageLastResult ;
var imageParameters : ImageParameters = new ImageParameters();
imageParameters.format="png32";
imageParameters.width=600;
imageParameters.height=400;
var myImageLayer :GPResultImageLayer=gp.getResultImageLayer(jobid,"outputMap",imageParameters);
//myMap.addLayer(myImageLayer);
var gpWin:GPContainer=PopUpManager.createPopUp(this,GPContainer,false) as GPContainer;
gpWin.ShowResultLayer(myImageLayer);
gpWin.title="降雨等值面";
PopUpManager.centerPopUp(gpWin);
}
function onimgno(info:Object, token:Object = null):void
{
}
private function mapClickHandler(event:MapMouseEvent):void
{
computeServiceArea(event.mapPoint);
}
]]>
</mx:Script>
<esri:Map id="myMap" mapClick="mapClickHandler(event)" width="100%" height="100%" >
<!-- <esri:extent>
<esri:Extent xmin="-95.41" ymin="38.86" xmax="-95.1" ymax="39.06">
<esri:SpatialReference wkid="4326"/>
</esri:Extent>
</esri:extent>-->
<esri:ArcGISDynamicMapServiceL ayer url="http://sps-010/ArcGIS/rest/services/gpBase/MapServer"/>
<esri:GraphicsLayer id="graphicsLayer" renderer="{uniqueValueRenderer}"/>
</esri:Map> <esri:Geoprocessor showBusyCursor="true" id="gp" url="http://sps-010/ArcGIS/rest/services/guangyuangp/GPServer/dengzhi"/>
</mx:Application>