麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

ArcGIS Runtime 入门(5-2)ArcGIS Runtime运行剖析-缓冲区分析为例

该 DEMO 的界面如下图:

arcgis runtime 入门

授权服务器

ArcGISRuntime.SetLicense("输入相应的许可信息");

ArcGISRuntime.Initialize()

启动ArcGIS Runtime本地服务器

LocalServer是一个静态类,包含了对服务器的授权,启动等信息。而从这个词的字面意思也暗示我们Runtime其实就是一个本地服务器。通过我们的理解,我们可以这样认为许可号其实就是控制这个本地服务器的。

LocalServer.InitializeAsync(() =>
{

  if (LocalServer.Status == LocalServerStatus.NotInitialized) {

    MessageBox.Show("服务器没有初始化!"); return;

  }

}

);

ArcGIS Runtime服务器初始化成功之后会在VS的输出窗口中出现这样的地址:

http://127.0.0.1:50000/BQqGPY/arcgis/rest/services

这个就是我们熟悉的Rest,在浏览器中输入这个地址就可以看到如下页面:

arcgis runtime 入门

这个很容易解释,因为我们现在还没有服务。根据在ArcGIS Server下的习惯我们可以输入以下地址:

http://127.0.0.1:50000/BQqGPY/arcgis/rest/admin这时候就会在浏览器中看到如下页面:

arcgis runtime 入门

当我们点击Start a new Service,我们会看到如下界面:

arcgis runtime 入门

从这个页面很容易理解,这个是让我们创建服务,输入的参数有服务的类型,名称以及相应的数据源等。可以看出ArcGIS Runtime支持地图服务,地理编码服务,地处理服务和几何服务。

定义服务

我们将地图服务卸载XAML文件中,如下图:

<esri:Map x:Name="MyMap" Extent="-15000000,2000000,-7000000,8000000"
Background="#FFE3E3E3">
  <esri:ArcGISLocalTiledLayer ID="BaseMap" Path="radialflow.tpk"/>
  <esri:GraphicsLayer ID="MyGraphicsLayer"/>
</esri:Map>

我们以异步的方式创建一个缓冲区的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地址,如下:

arcgis runtime 入门

我们用异步的执行方式获取这个服务,当然对于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服务,如下图:

arcgis runtime 入门

双击这个服务,可以看到更详细的信息,比如GP服务的输入,输出参数,如下所示:

arcgis runtime 入门

我们再回去看我们的admin地址中,看到下面的:

arcgis runtime 入门

在这里,我们可以对这个服务进行删除操作等。

执行分析

当这些服务都有了,我们在地图上单击,就会出现缓冲区分析的结果如下图:

arcgis runtime 入门

代码如下:

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<GPParameter> pGParams = new List<GPParameter>();
  double pDist = System.Convert.ToDouble(txtBoxDist.Text);
  Graphic pGraphic = new Graphic { Geometry = e.MapPoint };
  FeatureSet pFeatureSet = new FeatureSet(new List<Graphic> { 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中调用,结果如下:

arcgis runtime 入门

但是这个地址只能本地使用,而不能在其他机器上上用,这点必须清楚,因为50000这端口是私有的。

手册目录

本手册的全部内容: ArcGIS Runtime新手入门手册

相关阅读

麻辣GIS-Christina

作者:

地理小学生。

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子

留言板(小编看到第一时间回复)