ArcServer +Flex 发布GP服务生成等值面

通过在客户端调用创建好的GP服务,可以方便和容易的实现一些地理处理和分析功能。 GIS分析功能中生成等值线和等值面想必是常见的需求之一。

但是对新手来说,网上相关可参考的文章太少 实现的过程中难免处处碰壁。下面笔者把自己实现的过程步骤记录下来给有用到的朋友做参考之用。

要点:

gp服务是在轻量级客户端调用的 所以对输入输出参数有要求  不可能像桌面软件那样传个shp文件或者影像图给模型工具。

关于建模的详细过程请参考ArcGIS的帮助文档或者在线帮助文档(http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#geoprocessing/guide_-1963186772.htm),里面叙述得非常详细了。

1.建模过程:

这里的生成等值面用到了空间分析中的插值分 析工具 IDW

image 

在modelBuilder中添加该工具

image

Point是进行该分析运算的输入参数  它头顶上标的P 就表示了它是一个参数。右击Point 选属性把其数据类型设置为Feature Set 。

双击IDW  或者右键点击打开

image

Z value filed是我们要进行分析的字段 (降雨等值面--雨量值、人口分布等值面--人口数等等),该字段在输入参数Point中已经定义好。

 

最后得到的模 型图如下

image

Int工具-----栅格转矢量的时候 需要是数据为int 所以先取整

Raster to Polygon -------栅格转矢量

Clip-----对生 成的等值面图层用背景地图进行裁剪 使其和地图重合。

设置outputMap为参数 让它作为参数输出。 保存模型。

2. 模型测试

最后在ArcMap中测试上面建好的模型,在ArcToolbox中添加刚才建好的工具。双击打开然后选择输 入参数。 最后运行结果如下模型建立成功。

image

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、路径用相对路径或者通用路径;

    image

    2、在工具级别不设置临时工作空间,在arcMap中设置。

    image image

    3、先在ArcMap中执行新建的模型,然后再把它作为toollayer加入xmd文档中。

    4、一是geoprocessing 服务,一个是map服务,其中geoprocessing 服务必须用异步方式调用。

    5、MAP服务必须是NONE POOL类型的服务,否则会出现无法删除结果文件的错误。

     

    最后对发布好的GP服务进行测试。

    打开ArcMap新建个空白文档,导航到GIS Servers添加一个相关的mapservice作为背景,(不能是上面发布的result map service)

     

     

     

     

     

     

     

     

     

    ArcToolbox加入刚才发布好的geoprocessing 服务,双击打开然后输入参数,执行完毕后生成结果会作为一个新图层加入mxd文档中到此GP服务发布成功!

    image


    ArcServer +Flex 发布GP服务生成等值面(三) ---前端调用

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application    xmlns: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:ArcGISDynamicMapServiceLayer      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>

     

     

     

    image

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值