ArcGISRuntimeforAndroid使用異步GP服務(wù)繪制等值線

關(guān)于基于Android上ArcGIS Server GP服務(wù)的調(diào)用,已經(jīng)有前輩給出了很好的例子:

我們提供的服務(wù)有:成都網(wǎng)站制作、做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、永年ssl等。為千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的永年網(wǎng)站制作公司

http://blog.csdn.net/esrichinacd/article/details/9231815

以及官方的幫助文檔:

https://developers.arcgis.com/android/sample-code/viewshed/

詳細(xì)通過仔細(xì)學(xué)習(xí)上面的內(nèi)容,您也可以基本了解GP服務(wù)的使用過程。

本文我們主要將以下三部分內(nèi)容:

1.學(xué)會(huì)使用使用ArcMap構(gòu)建等值線GP服務(wù)模型

2.學(xué)會(huì)使用ArcGIS Server發(fā)布我們創(chuàng)建的GP服務(wù)模型

3.學(xué)會(huì)ArcGIS Runtime for Android下異步調(diào)用GP服務(wù),繪制等值線

其中前兩部分可本博客其他文章有詳細(xì)說明可參考:

http://www.cnblogs.com/potential/archive/2012/10/27/2742355.html

這篇文章使用的是10.0的ArcGIS Server,而這里我們使用的是10.1的 ArcGIS Server,因此在此我們也會(huì)提到10.1下如何來發(fā)布我們的服務(wù)。如果您熟悉GP服務(wù)的發(fā)布過程,可直接跳轉(zhuǎn)至第三部分。

第三部分的內(nèi)容主要解決以下幾個(gè)問題:

1.如果根據(jù)現(xiàn)有的坐標(biāo)信息和對(duì)應(yīng)的屬性數(shù)據(jù),構(gòu)造相應(yīng)的地理要素?例如:現(xiàn)在有某個(gè)省的個(gè)監(jiān)測點(diǎn)的降雨數(shù)據(jù)(監(jiān)測點(diǎn)經(jīng)緯度,及監(jiān)測點(diǎn)的降雨量),那么如何在地圖上對(duì)這些監(jiān)測點(diǎn)的數(shù)據(jù)進(jìn)行反映?

2.如何在Android平臺(tái)上根據(jù)這些監(jiān)測點(diǎn)的數(shù)據(jù)來對(duì)整個(gè)地區(qū)進(jìn)行插值呢?并將等值線添加到Android移動(dòng)平臺(tái)的地圖中?

3.如何根據(jù)等值線的值,動(dòng)態(tài)設(shè)置其不同的顏色呢?

一、使用ArcMap構(gòu)建等值線的GP服務(wù)模型

既然我們要?jiǎng)?chuàng)建等值線那么,肯定需要繪制等值線的數(shù)據(jù),即進(jìn)行等值線繪制的點(diǎn)。而等值線又是怎么得到的呢?很簡單,根據(jù)這些點(diǎn)的位置和其表示的值(如該店的降雨量,濃度值等)對(duì)其進(jìn)行插值。插值的過程就是根據(jù)已有的點(diǎn)來計(jì)算某一未知區(qū)域的點(diǎn)的濃度值。

常用的插值方法有拉格朗日插值,克里金插值,反距離插值,樣條函數(shù)插值等。一般情況下我們選擇反距離和克里金插值,如果想得到非常平滑的插值結(jié)果,則可以采用三次樣條插值。

     插值完成之后,實(shí)際上得到的是更多的點(diǎn),而繪制等值線就是將具有相同屬性值的點(diǎn)連接起來得到等值線。通常情況下我們需要自己代碼完成插值過程和追蹤等值點(diǎn)的算法。并連接等值點(diǎn)。但是在ArcGIS中有內(nèi)置的插值工具和等值線工具供我們使用。但是在ArcGIS中各個(gè)功能模塊都是一個(gè)單獨(dú)的工具,而通過上面的分析我們知道繪制等值線至少有兩個(gè)過程:1.插值,2.依據(jù)插值結(jié)果繪制等值線

    因此依據(jù)上面的分析我們通過ArcMap的Model Builder可以構(gòu)建如下的工具模型:

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

    但是通常情況下上述得到的等值線有可能不會(huì)很平滑,如果需要較平滑的等值線可以再加上一個(gè)平滑工具,如:

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

      通過加上平滑工具,設(shè)置平滑容差,可以得到較為平滑的等值線。

二、  發(fā)布GArcMap構(gòu)建的GP服務(wù)模型

     在ArcGIS Server 10.1中,發(fā)布GP服務(wù)的方式較之前有所改變,不再是發(fā)布GP服務(wù)模型本身,而是發(fā)布在GP服務(wù)模型在ArcMap運(yùn)行之后的結(jié)果,如圖所示:

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

       然后出現(xiàn)發(fā)布服務(wù)的選項(xiàng):

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

  •     publish a service:直接將現(xiàn)有模型結(jié)果發(fā)布為GP服務(wù)。

  •     Save a service definition file:保存為服務(wù)定義文件,可以用于在ArcGIS Server Manager中發(fā)布為服務(wù)。

  •     Overwrite an existing service:覆蓋當(dāng)前的ArcGIS Server 服務(wù)。

  • 這里我們選擇第二個(gè)選項(xiàng),Save a service definition file.這樣的好處是可以在ArcGIS Manager上遠(yuǎn)程發(fā)布。同時(shí)sd文件也很容易遷移到其他的機(jī)器。

     保存為sd文件之后,登陸ArcGIS Server Manager頁面,點(diǎn)擊發(fā)布服務(wù):

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

      然后點(diǎn)擊選擇文件,選擇之前在ArcMap中保存的服務(wù)定義文件(.sd).然后點(diǎn)擊下一步。

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

     之后選擇發(fā)布服務(wù)的名稱,和所在服務(wù)的目錄。

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

最后點(diǎn)擊下一步,發(fā)布服務(wù)。在服務(wù)發(fā)布之后登陸服務(wù)的rest頁面可以查看服務(wù)的具體參數(shù)信息:

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

     接下來我們就需要開始編碼來調(diào)用我們這里的GP服務(wù)實(shí)現(xiàn)繪制等值線的功能。到此我們的繪制等值線的GP服務(wù)以及發(fā)布完成,接下來就是編碼的過程。當(dāng)然為了確保您的GP服務(wù)能夠正確運(yùn)行,建議在編碼之前,通過ArcMap來驗(yàn)證一下您的GP服務(wù)。驗(yàn)證過程可參考之前的博文,鑒于篇幅在此不再贅述。

三、  ArcGIS Runtime for Android 調(diào)用異步GP服務(wù)繪制等值線

     本文開發(fā)環(huán)境:

  • ArcGIS Runtime for Android -10.2.2

  • Eclipse Java EE IDE for Web Developers - Version: Juno Service Release 2

  • JDK-7

  • Android 4.0.3及以上(ArcGIS Runtime for Android 10.2.2要求OPENGL 2.0環(huán)境,Android 4.0.3及以上版本的模擬器支持2.0的OPENGL)

  • ArcGIS Server 10.1

    調(diào)試過程在真機(jī)上實(shí)現(xiàn)

3.1 ArcGIS Runtime for Android GP服務(wù)調(diào)用過程

    首先我們需要了解GP服務(wù)的幾個(gè)問題:

   3.1.1.查看當(dāng)前GP服務(wù)是異步還是同步

   ArcGIS 的GP服務(wù)有異步和同步的兩種模式,默認(rèn)情況下(ArcGIS Server 10.1)使用的是異步模式。

   通過REST頁面的參數(shù)我們也可以知道GP服務(wù)時(shí)何種模式:

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

     或者

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

     Asynchronous表示的是異步模式,Submit Job也表示異步模式,他們是對(duì)應(yīng)的。

3.11.2 異步和同步的區(qū)別

     異步模式通常適用于模型較復(fù)雜,運(yùn)行時(shí)間較長的GP服務(wù),而同步適用于模型較簡單,運(yùn)行時(shí)間較短的GP服務(wù)。

  •    對(duì)于同步的GP服務(wù),需要等待服務(wù)執(zhí)行完成,然后再去獲取結(jié)果

  •    對(duì)于異步的GP服務(wù),無需客戶端等待,但是需要客戶端去查詢GP服務(wù)執(zhí)行的狀態(tài),如果執(zhí)行完成,然后再去獲取結(jié)果,所有的過程需要開發(fā)人員自己編寫代碼,包括服務(wù)調(diào)用,狀態(tài)輪詢等。在ArcGIS Runtime for Android中并沒有提供類似與.net下的回調(diào)函數(shù),以方便我們獲取GP服務(wù)結(jié)果(如果您使用過C#+Silverlight/WPF/Win8/Windows Phone下的GP服務(wù),我們知道異步執(zhí)行GP服務(wù)有個(gè)JobCompeleted事件,我們可以在該事件回調(diào)函數(shù)中寫獲取GP服務(wù)結(jié)果的代碼)。而ArcGIS Runtime for Android中并沒有這樣的事件供我們使用。

3.2  ArcGIS Runtime 調(diào)用GP服務(wù)的詳細(xì)過程

    ArcGIS Runtime for Android 中調(diào)用GP服務(wù)的核心類是:Geoprocessor.該類封裝了調(diào)用GP服務(wù)所需的方法。其中較為重要的如下表所示:

               方法名稱        返回值描述
execute(List<GPParameter> parameters)GPResultResource用于開始調(diào)用同步GP服務(wù),GP服務(wù)執(zhí)行完成之后,返回GP服務(wù)的結(jié)果
submitJob(List<GPParameter> parameters)GPJobResource

用于開始調(diào)用異步GP服務(wù),并返回本次GP服務(wù)調(diào)用的相關(guān)信息(如標(biāo)示id,狀態(tài)等)。和同步不同的是每一次異步調(diào)用GP服務(wù)都會(huì)生成一個(gè)jobID來標(biāo)示每一次GP調(diào)用的任務(wù),通過這個(gè)jobId我們可以找到該次GP服務(wù)調(diào)用的狀態(tài),結(jié)果。

checkJobStatus(String jobId)GPJobResource檢查指定jobid對(duì)于GP服務(wù)的當(dāng)前狀態(tài),如服務(wù)是否提交,是否執(zhí)行成功了,或者是否執(zhí)行失敗了等。
getResultData(String jobId, String parameterName)GPParameter根據(jù)指定的jobid,獲取指定的名稱的GP服務(wù)結(jié)果,注意所有的GP服務(wù)參數(shù)類型都繼承至GPParameter
getResultImage(String jobId, String parameterName)GPParameter獲取GP服務(wù)的結(jié)果,并以圖片的方式返回(GPMapImage,GPRasterDataLayer),主要用于結(jié)果地圖服務(wù)

Geoprocessor構(gòu)造函數(shù)有兩個(gè)重載,都必須傳入GP服務(wù)的地址。

   下面我們以上述繪制等值線的基礎(chǔ)為例子,來具體說明如何讓調(diào)用GP服務(wù)。

   通過之前繪制等值線GP服務(wù)的REST頁面,我們知道請(qǐng)求GP服務(wù)需要三個(gè)輸入?yún)?shù)和一個(gè)輸出參數(shù)(計(jì)算結(jié)果這里即表示等值線),我們先看一看輸入?yún)?shù):

  • ForecastPoints:預(yù)測點(diǎn)要素集,表示進(jìn)行等值線繪制的點(diǎn),且必須帶有concentration屬性,concentration屬性即為點(diǎn)要素的屬性,表示改點(diǎn)代表的濃度值,類型是GPFeatureRecordSetLayer

  • Contour_interval :等值線間距,類型是:GPDouble

  • Smoothing_Tolerance :平滑容差,類型 GPLinearUnit

    而在調(diào)用GP服務(wù)時(shí),我們需要將上述的參數(shù)添加到GPParameter類的集合中(List<GPParameter>),最后調(diào)用GP服務(wù)傳遞的是List< GPParameter>集合。

 下面我們來構(gòu)造上述GP服務(wù)參數(shù),首先我們新建一個(gè)類,取名:GPService,然后定義所所需的參數(shù):

private static final String FORECAST = "FORECAST";// 調(diào)試標(biāo)示
    private Geoprocessor geoprocessor = null;// GP服務(wù)變量
    private GPFeatureRecordSetLayer forecastPointFeatures = null;// 預(yù)測點(diǎn)要素集
    private GPDouble contour_interval = null;// 等值線間距
    private GPLinearUnit smoothing_Tolerance = null;// 平滑容差
    private ArrayList<GPParameter> gpParameters = null;// GP服務(wù)參數(shù)集合
    public static GraphicsLayer contourLineGraphicsLayer;// 等值線圖層
    public GraphicsLayer gridPointGraphicsLayer;// 網(wǎng)格點(diǎn)圖層
    private static MapView mapView = null;// MapView控件
    private ArrayList<Graphic> forecastGraphicList = null;// 預(yù)測點(diǎn)集合
    double startx, starty;// 繪制網(wǎng)格的起始
    private Timer checkStatusTimer;// 時(shí)鐘,用于輪詢GP服務(wù)執(zhí)行的狀態(tài)

并實(shí)例化:

//實(shí)例化參數(shù)
       geoprocessor = new Geoprocessor("http://192.168.1.181:6080/arcgis/rest/services/Interpolation/ContourServiceWithSmoothOption/GPServer/ContourToolWithSmoothOption");
       forecastPointFeatures = new GPFeatureRecordSetLayer("ForecastPoints");
       contour_interval = new GPDouble("Contour_interval");
       smoothing_Tolerance = new GPLinearUnit("Smoothing_Tolerance");
       gpParameters = new ArrayList<GPParameter>();
       gridPointGraphicsLayer = new GraphicsLayer(GraphicsLayer.RenderingMode.DYNAMIC);
       contourLineGraphicsLayer = new GraphicsLayer(GraphicsLayer.RenderingMode.DYNAMIC);
       forecastGraphicList = new ArrayList<Graphic>();
       startx = x;
       starty = y;
                                       
       //取得當(dāng)前的MapView對(duì)象
       setMapView(map);
       //設(shè)置GP服務(wù)的默認(rèn)參數(shù)
       contour_interval.setValue(3);//設(shè)置默認(rèn)等值線間距是3
       smoothing_Tolerance.setDistance(30);//設(shè)置默認(rèn)容差是30
       smoothing_Tolerance.setUnits("esriMeters");//設(shè)置容差單位為米

說明:10.2的ArcGIS Runtime for Android 的API中對(duì)于GraphicsLayer有了很大的改進(jìn),在聲明GraPhicsLayer對(duì)象時(shí)可以指定Gphics的渲染模式,當(dāng)指定為DYNAMIC時(shí)可以極大優(yōu)化Graphic的加載速度,從而提高用戶體驗(yàn)。同時(shí)為了簡化整個(gè)過程,這里我們用于繪制等值線的點(diǎn),以及其對(duì)于的濃度值并不是真實(shí)的數(shù)據(jù),我們將采用代碼來生成模擬的數(shù)據(jù),具體過程是:用戶輸入一個(gè)點(diǎn),以該點(diǎn)為中心生成21x41個(gè)網(wǎng)格點(diǎn)。當(dāng)然換成真實(shí)數(shù)據(jù)的過程一樣。下面是生成模擬數(shù)據(jù)的方法,這里我們使用了一個(gè)橢圓的函數(shù)來構(gòu)造濃度值,因此我們預(yù)期的等值線應(yīng)該是一個(gè)一個(gè)的橢圓,此外還需要注意的是用于預(yù)測的點(diǎn)要素集必須包含concentration屬性,因?yàn)槲覀冞@里服務(wù)器端的GP服務(wù)是根據(jù)concentration屬性來繪制等值線的。要素的的屬性數(shù)據(jù)是以鍵值對(duì)的方式存放的。

private void CreateGrid()
    {
        int drawOrder = 1;
        for (int i = -10; i <= 10; i++)
        {
            for (int j = -20; j <= 20; j++)
            {
                Map<String, Object> attributes = new HashMap<String, Object>();
                attributes.put("concentration", Math.pow(i, 2) / 10 + Math.pow(j, 2) / 20);
                attributes.put("xindex", i);
                attributes.put("yindex", j);
                drawOrder++;
                Graphic graphic = createGraphic(startx + i * 400, starty + j * 200, attributes, drawOrder);
                //網(wǎng)格點(diǎn)圖層
                gridPointGraphicsLayer.addGraphic(graphic);
                //預(yù)測點(diǎn)要素集
                forecastGraphicList.add(graphic);
            }
        }
    }

在構(gòu)造完所需的參數(shù)之后,我們添加集合輔助方法:

  
//設(shè)置等值線間距參數(shù)
    public void setContourIntervalValue(double interval)
    {
        contour_interval.setValue(interval);
    }
    //設(shè)置平滑容差
    public void setSmoothToleranceValue(double tolerance, String units)
    {
        smoothing_Tolerance.setDistance(tolerance);
        smoothing_Tolerance.setUnits(units);
    }
                 //創(chuàng)建漸變的顏色
    public int[] createColorSet()
    {
        int[] colors = new int[6];
        for (int i = 0; i <= 5; i++)
        {
            colors[i] = Color.argb(254, i * 51, 255 - i * 51, 0);
        }
        return colors;
    }
    //構(gòu)建用于分類渲染的樣式
    public ClassBreaksRenderer createClassBreaksRenderer(int[] colors, double maxValue, double minValue)
    {
        ClassBreaksRenderer contourBreaksRenderer = new ClassBreaksRenderer();
        double stepValue = (Math.ceil(maxValue) - Math.floor(minValue)) / colors.length;
        for (int i = 0; i < colors.length; i++)
        {
            ClassBreak classBreak = new ClassBreak();
            double max = (i + 1) * stepValue + Math.floor(minValue);
            double min = i * stepValue + Math.floor(minValue);
            classBreak.setClassMaxValue(max);
            classBreak.setClassMinValue(min);
            classBreak.setSymbol(new SimpleLineSymbol(colors[i], 3, com.esri.core.symbol.SimpleLineSymbol.STYLE.SOLID));
            contourBreaksRenderer.addClassBreak(classBreak);
        }
        return contourBreaksRenderer;
    }
    //夠著GraPhic對(duì)象,并輸入指定的屬性數(shù)據(jù)
    public Graphic createGraphic(double x, double y, Map<String, Object> attributes, int drawOrder)
    {
        Graphic graphic = new Graphic(new Point(x, y), new SimpleMarkerSymbol(Color.BLUE, 6, STYLE.CIRCLE), attributes, drawOrder);
        return graphic;
    }

注意:在ArcGIS Runtime for Android的API中,沒有單獨(dú)為Graphic提供添加屬性(Attributes,如果您熟悉.net下的ArcGIS api,那么您應(yīng)該知道可以通過Graphic的addAttributes方法來為Graphic添加屬性),由于沒有類似.net下的addAttributes方法,因此在需要給Graphic添加方法時(shí)只能通過兩種方式:

  • 在構(gòu)造Graphic的時(shí)候就將我們的屬性數(shù)據(jù)傳遞過去,比如本文使用的方法。

  • 通過將Graphic添加到GraPhicsLayer,然后調(diào)用GarphicsLayer的updateGraphic(int id, Map<String, Object> attributes)方法來更新Graphic的Attributes屬性。

定義好參數(shù)以及相關(guān)的輔助方法后,下面就來完成請(qǐng)求GP服務(wù)的代碼,定義一個(gè)StartGPService方法:

為了使得請(qǐng)求GP服務(wù)時(shí)不影響前臺(tái)的UI線程,因此我們重新new一個(gè)線程,因?yàn)槿绻苯釉赨I線程來添加用于預(yù)測的網(wǎng)格點(diǎn)(21x41)會(huì)有卡頓的現(xiàn)象。

public void StartGPService()
    {
        new Thread(new Runnable()
        {
            public void run()
            {
                // TODO Auto-generated method stub
                CreateGrid();
                // 輸入要素的要素類型,必須與GP服務(wù)所對(duì)應(yīng)
                forecastPointFeatures.setGeometryType(Type.POINT);
                // 設(shè)置坐標(biāo)系為102100坐標(biāo)系
                forecastPointFeatures.setSpatialReference(SpatialReference.create(SpatialReference.WKID_WGS84_WEB_MERCATOR_AUXILIARY_SPHERE));
                geoprocessor.setOutSR(forecastPointFeatures.getSpatialReference());
                geoprocessor.setProces***(forecastPointFeatures.getSpatialReference());
                // 將裁剪要素的坐標(biāo)系設(shè)置為與預(yù)測點(diǎn)要素的坐標(biāo)系一致
                forecastPointFeatures.setGraphics(forecastGraphicList);
                for (Graphic testGraphic : forecastPointFeatures.getGraphics())
                {
                    Log.i(FORECAST,
                            "(" + testGraphic.getAttributeValue("xindex").toString() + "," + testGraphic.getAttributeValue("yindex").toString() + ")="
                                    + testGraphic.getAttributeValue("concentration").toString());
                }
                gpParameters.add(forecastPointFeatures);
                gpParameters.add(contour_interval);
                Log.i(FORECAST, "Submitting job thread is: " + Thread.currentThread().getName());
                getMapView().post(new Runnable()
                {
                    public void run()
                    {
                        // TODO Auto-generated method stub
                        getMapView().addLayer(gridPointGraphicsLayer);
                        Log.i(FORECAST, "ADD FORECAST POINT TO LAYER COMPLETED");
                    }
                });
                submitJobandPolling(geoprocessor, gpParameters);
            }
        }).start();
    }

這里的submitJobandPolling方法如下,大致過程是:
1.提交當(dāng)前的GP服務(wù)請(qǐng)求繪制等值線。

2.提交完成之后,取得當(dāng)前的請(qǐng)求的JobId。

3.通過Timer,同時(shí)根據(jù)當(dāng)前的JobId輪詢?cè)揋P服務(wù)的執(zhí)行狀態(tài)

4.如果GP服務(wù)執(zhí)行完成,則停止輪詢

5.如果GP服務(wù)執(zhí)行成功,則獲取GP服務(wù)的結(jié)果:getResultData(jobId,"ContourLine"),得到GPParameter

6.因?yàn)槭堑戎稻€,所以結(jié)果是線要素,因此我們將GPParameter轉(zhuǎn)為GPFeatureRecordSetLayer。

7.讀取GPFeatureRecordSetLayer中的Graphic,即等值線

8.根據(jù)等值線的值(contour屬性)分類渲染等值線。

9.將等值線圖層添加到地圖中

代碼如下:

void submitJobandPolling(final Geoprocessor gp, List<GPParameter> params)
   {
       try
       {
           GPJobResource gpjobResource = gp.submitJob(params);
           JobStatus jobstatus = gpjobResource.getJobStatus();
           final String jobid = gpjobResource.getJobID();
           Log.i(FORECAST, "jobid " + jobid);
           Log.i(FORECAST, "jobstatus " + jobstatus);
           if (jobstatus != JobStatus.SUCCEEDED)
           {
               Log.i(FORECAST, "Start Check GP Status...");
               checkStatusTimer = new Timer();
               checkStatusTimer.schedule(new TimerTask()
               {
                   @Override
                   public void run()
                   {
                       // TODO Auto-generated method stub
                       try
                       {
                           Log.i(FORECAST, "Checking Status is running...");
                           Log.i(FORECAST, "Polling thread is: " + Thread.currentThread().getName());
                           GPJobResource gpjobResource = gp.checkJobStatus(jobid);
                           JobStatus status = gpjobResource.getJobStatus();
                           Log.i(FORECAST, "jobstatus " + status);
                           boolean jobcomplete = false;
                           if (status == JobStatus.CANCELLED || status == JobStatus.DELETED || status == JobStatus.FAILED || status == JobStatus.SUCCEEDED || status == JobStatus.TIMED_OUT)
                           {
                               jobcomplete = true;
                           }
                           if (jobcomplete)
                           {
                               if (status == JobStatus.SUCCEEDED)
                               {
                                   Log.i(FORECAST, "START GETTING GP Service Result... ");
                                   GPParameter result = gp.getResultData(jobid, "ContourLine");
                                   Log.i(FORECAST, "GETTING GP Service Result COMPLETED");
                                   Log.i(FORECAST, "convert GP Service Result to GPFeatureRecordSetLayer");
                                   GPFeatureRecordSetLayer resultLayer = (GPFeatureRecordSetLayer) result;
                                   Log.i(FORECAST, "convert GP Service Result Type completed");
                                   Log.i(FORECAST, "Create Graphics from GP Service Result");
                                   double maxContour = 0;
                                   double minContour = 0;
                                   for (Graphic graphic : resultLayer.getGraphics())
                                   {
                                       if (Double.parseDouble(graphic.getAttributeValue("Contour").toString()) > maxContour)
                                       {
                                           maxContour = Double.parseDouble(graphic.getAttributeValue("Contour").toString());
                                       } else if (Double.parseDouble(graphic.getAttributeValue("Contour").toString()) < minContour)
                                       {
                                           minContour = Double.parseDouble(graphic.getAttributeValue("Contour").toString());
                                       }
                                       contourLineGraphicsLayer.addGraphic(graphic);
                                   }
                                   Log.i(FORECAST, "Create Render Colors");
                                   int[] colors = createColorSet();//
                                   for (int i = 0; i < colors.length; i++)
                                   {
                                       Log.i(FORECAST, "Color[" + i + "] = " + colors[i]);
                                   }
                                   Log.i(FORECAST, "MAXVALUE: " + maxContour + ";MINVALUE: " + minContour);
                                   ClassBreaksRenderer classBreaksRenderer = createClassBreaksRenderer(colors, maxContour, minContour);
                                   classBreaksRenderer.setField("Contour");
                                   classBreaksRenderer.setMinValue(0.0);
                                   contourLineGraphicsLayer.setRenderer(classBreaksRenderer);
                                   Log.i(FORECAST, "Create Graphics Completed");
                                   Log.i(FORECAST, "Add Graphics to MapLayer");
                                   getMapView().post(new Runnable()
                                   {
                                       public void run()
                                       {
                                           // TODO Auto-generated method stub
                                           getMapView().addLayer(contourLineGraphicsLayer);
                                           if (MainActivity.dialog.isShowing())
                                           {
                                               MainActivity.dialog.dismiss();
                                           }
                                           Log.i(FORECAST, "Add Graphics to map layer Completed");
                                       }
                                   });
                               } else
                               {
                                   Log.i(FORECAST, "GP failed");
                               }
                               checkStatusTimer.cancel();
                           }
                       } catch (Exception e)
                       {
                           // TODO Auto-generated catch block
                           e.printStackTrace();
                           if (MainActivity.dialog.isShowing())
                           {
                               MainActivity.dialog.dismiss();
                           }
                           checkStatusTimer.cancel();
                       }
                   }
               }, 1000, 2000);
           }
       } catch (Exception e)
       {
           // TODO Auto-generated catch block
           e.printStackTrace();
           if (MainActivity.dialog.isShowing())
           {
               MainActivity.dialog.dismiss();
           }
       }
   }

到此關(guān)于GP服務(wù)的準(zhǔn)備過程全部完成,下面我們開始編寫調(diào)用的代碼,有了上面的工作,下面的就很容易了:
首先我們看一下Android界面的布局:

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

這里加載本地?cái)?shù)據(jù)為預(yù)留功能。

然后我們實(shí)例化一個(gè)GPService對(duì)象,傳入自動(dòng)繪制預(yù)測點(diǎn)要素集所需的起點(diǎn)坐標(biāo)和MapView對(duì)象,然后設(shè)置等值線間距和平滑容差,最后調(diào)用GP服務(wù)即可。代碼如下:

if (current_Point == null)
                {
                    Toast.makeText(MainActivity.this, "請(qǐng)先在地圖上添加計(jì)算計(jì)算原點(diǎn)", Toast.LENGTH_LONG).show();
                    return;
                }
                EditText intervalEditText=(EditText)MainActivity.this.findViewById(R.id.interval_value_EditText);
                EditText toleranceEditText=(EditText)MainActivity.this.findViewById(R.id.smooth_value_EditText);
                if(Double.parseDouble(intervalEditText.getText().toString())<=0){
                    Toast.makeText(MainActivity.this, "等值線間隔必須大于0", Toast.LENGTH_LONG).show();
                    return;
                }
                if(Double.parseDouble(toleranceEditText.getText().toString())<=0){
                    Toast.makeText(MainActivity.this, "平滑容差必須大于0,且注意單位是米", Toast.LENGTH_LONG).show();
                    return;
                }
                  
                GPService gpservice = new GPService(current_Point.getX(), current_Point.getY(), mMapView);
                gpservice.setContourIntervalValue(Double.parseDouble(intervalEditText.getText().toString()));
                gpservice.setSmoothToleranceValue(Double.parseDouble(toleranceEditText.getText().toString()), "esriMeters");
                dialog= ProgressDialog.show(MainActivity.this, "繪制等值線...", "正在請(qǐng)求GIS服務(wù)....請(qǐng)稍後!"); 
                gpservice.StartGPService();

最后等待我們的等值線出來吧。

最后的效果圖:

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

ArcGIS Runtime for Android 使用異步GP服務(wù)繪制等值線

總結(jié):

關(guān)于GP服務(wù),實(shí)際上無論Java平臺(tái)還是C#平臺(tái),無論Silverlight,F(xiàn)lex還是JavaScript,無論Window Phone 還是Android(IOS沒有了解過,不是很清楚,屌絲沒有蘋果機(jī)真啊....)他們調(diào)用GP服務(wù)的過程基本上都是一樣一樣的,注意是基本上。因此多少還是有些差別,但是總體上來說都遵循這樣的過程:

1.聲明Geoprocessor變量,指定GP服務(wù)地址。

2.根據(jù)GP服務(wù),聲明其所需的參數(shù),并添加到GPParameter集合(其他平臺(tái)名字也行稍有不一樣)

3.根據(jù)異步和同步,執(zhí)行調(diào)用GP服務(wù)的方法

4.獲取GP服務(wù)的結(jié)果

了解了這個(gè)過程那么您就知道GP服務(wù)該如何使用了。

一點(diǎn)題外話:

     再次寫博客,發(fā)現(xiàn)上一次還是一年以前,不由的感慨時(shí)間飛逝,這一年中,渾渾噩噩的感覺就過去了,然后匆匆忙忙的找了份工作,然后馬上就要畢業(yè)了...留給自己的時(shí)間也已不再太多,聽很多工作的朋友說工作了就身不由己了,甚至連自己的時(shí)間也不是自己的啦,所以我想趁著自己還沒有被剝削自己,干點(diǎn)自己想干的事情...

    一年了,說長不長,說短不短,失去了很多,也收獲了很多,我想至少博客園收獲了100個(gè)粉絲,雖然不多,但是卻也是一筆不小的財(cái)富,或者這是筆者有生以來最大的粉絲群了。因此我想既然寫了這個(gè)博客,那么就得繼續(xù)努力,就得堅(jiān)持。

    最后感謝您能讀完這篇博文,因?yàn)樗_實(shí)長了點(diǎn),但是還是希望您能有所收獲,希望或多或少能幫助您解決遇到的問題,也希望您繼續(xù)關(guān)注我的博客,如果您覺得好就點(diǎn)個(gè)贊,有什么建議也歡迎您留言一起討論...

本文題目:ArcGISRuntimeforAndroid使用異步GP服務(wù)繪制等值線
URL網(wǎng)址:http://bm7419.com/article28/pscjcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站面包屑導(dǎo)航、網(wǎng)站維護(hù)、關(guān)鍵詞優(yōu)化、做網(wǎng)站、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)