該 DEMO 的界面如下圖:

授權伺服器
ArcGISRuntime.SetLicense("輸入相應的許可資訊");
ArcGISRuntime.Initialize()
啟動ArcGIS Runtime本地伺服器
LocalServer是一個靜态類,包含了對伺服器的授權,啟動等資訊。而從這個詞的字面意思也暗示我們Runtime其實就是一個本地伺服器。通過我們的了解,我們可以這樣認為許可号其實就是控制這個本地伺服器的。
LocalServer.InitializeAsync(() =>
{
if (LocalServer.Status == LocalServerStatus.NotInitialized) {
MessageBox.Show("伺服器沒有初始化!"); return;
}
}
);
ArcGIS Runtime伺服器初始化成功之後會在VS的輸出視窗中出現這樣的位址:
這個就是我們熟悉的Rest,在浏覽器中輸入這個位址就可以看到如下頁面:
這個很容易解釋,因為我們現在還沒有服務。根據在ArcGIS Server下的習慣我們可以輸入以下位址:
當我們點選Start a new Service,我們會看到如下界面:
從這個頁面很容易了解,這個是讓我們建立服務,輸入的參數有服務的類型,名稱以及相應的資料源等。可以看出ArcGIS Runtime支援地圖服務,地理編碼服務,地處理服務和幾何服務。
定義服務
我們将地圖服務解除安裝XAML檔案中,如下圖:
Background="#FFE3E3E3">
我們以異步的方式建立一個緩沖區的GP服務如下:
//擷取本地GP服務
LocalGeoprocessingService.GetServiceAsync(@"SimpleBuffer.gpk", GPServiceType.Execute, (gpService) =>
{
if (gpService.Error != null)
{
MessageBox.Show(gpService.Error.Message);
}
//建立Geoprocessor pGPTask = new Geoprocessor(gpService.UrlGeoprocessingService + "/" + "SimpleBuffer");
MyMap.MouseClick += MyMap\_MouseClick;
});
建立服務(服務是在伺服器的狀态為Runing的時候建立)
既然說了一切都是服務,而且是和REST相關的,那麼要和這個緩沖區這個服務打交道,就要有一個URL位址,當我們的GP服務擷取成功之後就可以看到這個 UrlGeoprocessingService位址,如下:
我們用異步的執行方式擷取這個服務,當然對于GP來說也有同步的方式。當服務啟動後,緊接着回調了一個匿名函數,在這個回調函數中我們可以做相關的操作,比如說服務是否有錯誤等,當服務沒有問題的話,我們可以在這個回調函數中建立Geoprocessor,在這個時候就需要用到我們GP服務的位址,代碼如下:
//擷取本地GP服務
LocalGeoprocessingService.GetServiceAsync(@"SimpleBuffer.gpk", GPServiceType.Execute, (gpService) =>
{
if (gpService.Error != null)
{
MessageBox.Show(gpService.Error.Message);
}
//建立Geoprocessor pGPTask = new Geoprocessor(gpService.UrlGeoprocessingService + "/" + "SimpleBuffer");
MyMap.MouseClick += MyMap\_MouseClick;
});
截取這個位址,在浏覽器中可以看到GP服務,如下圖:
輕按兩下這個服務,可以看到更詳細的資訊,比如GP服務的輸入,輸出參數,如下所示:
我們再回去看我們的admin位址中,看到下面的:
在這裡,我們可以對這個服務進行删除操作等。
執行分析
當這些服務都有了,我們在地圖上單擊,就會出現緩沖區分析的結果如下圖:
代碼如下:
private void MyMap_MouseClick(object sender, ESRI.ArcGIS.Client.Map.MouseEventArgs e)
{
pGPTask.CancelAsync();
GraphicsLayer pGraphicsLayer = MyMap.Layers["MyGraphicsLayer"] as GraphicsLayer;
pGraphicsLayer.ClearGraphics();
e.MapPoint.SpatialReference = MyMap.SpatialReference;
Graphic graphic = new ESRI.ArcGIS.Client.Graphic()
{
Geometry = e.MapPoint,
Symbol = LayoutRoot.Resources["DefaultClickSymbol"] as
ESRI.ArcGIS.Client.Symbols.Symbol
};
graphic.SetZIndex(1);
pGraphicsLayer.Graphics.Add(graphic);
//構造GP的參數,2個,一個表示FeatureSet,一個表示緩沖距離
List pGParams = new List();
double pDist = System.Convert.ToDouble(txtBoxDist.Text);
Graphic pGraphic = new Graphic { Geometry = e.MapPoint };
FeatureSet pFeatureSet = new FeatureSet(new List { pGraphic });
pGParams.Add(new GPFeatureRecordSetLayer("InputFeatures", pFeatureSet));
pGParams.Add(new GPLinearUnit("Distance", esriUnits.esriKilometers, pDist));
pGPTask.ExecuteCompleted += (s, e1) =>
{
GPExecuteResults results = e1.Results;
GPFeatureRecordSetLayer rs = results.OutParameters[0] as
GPFeatureRecordSetLayer;
Graphic graphicBuff = new ESRI.ArcGIS.Client.Graphic()
{
Geometry = rs.FeatureSet.Features[0].Geometry,
Symbol = LayoutRoot.Resources["ResultsFillSymbol"] as
ESRI.ArcGIS.Client.Symbols.Symbol
};
pGraphicsLayer.Graphics.Add(graphicBuff);
};
pGPTask.Failed += (s2, e2) =>
{
MessageBox.Show(e2.Error.Message);
};
pGPTask.ExecuteAsync(pGParams);
}
關閉服務
使用LocalServer.Shutdown()就可以關閉我們的服務,這時候我們可以在VS界面中看到下面的URL位址:http://127.0.0.1:50000/BQqGPY/arcgis/rest/admin/shutdown
小結
通過這些分析,我們可以将ArcGIS Runtime 稱之為一個本地Server,而 ArcGISRuntime 也隻不過是将本地資源,通過内部嵌入的WEB伺服器,釋出一個供自己使用的rest服務,這個rest隻能通過自身的API使用,而不能向ArcGIS Server一樣釋出服務,當停止Runtime之後,這個URL将不能使用。我們也看到了ArcGIS Runtime 對這些操作的實作也是通過産生和ArcGIS Server向類似結構的REST,是以說這些ArcGIS Runtime的API 實質是通過調用自己的rest對服務進行操作,比如當關閉的時候,它調用 http://127.0.0.1:50000/BQqGPY/arcgis/rest/admin/shutdown
一個問題:ArcGIS Runtime在運作時候産生的服務或者說釋出的服務能否被外界使用? 答案是可以的,下面的是我捕捉到的一個位址,在javascript中調用,結果如下:
但是這個位址隻能本地使用,而不能在其他機器上上用,這點必須清楚,因為50000這端口是私有的。
手冊目錄