ArcGIS API for Windows Phone开发实例(7):利用Geoprocessing分析超市的营业状况

  本文内容:Geoprocessing
  前几节中,我们利用GIS这个工具,对连锁超市店面的营业状况做了充分的展示。这一节中,我们利用GIS特有的Geoprocessing功能,结合超市的营业数据统计,对超市的营业状况做一个比较合理的判断,从而有助于经营者及时调整策略,适应市场的变化。
  我们的大致分析思路是这样的:对于每个超市来说,会有固定的消费群体,一般通常是距离该超市一定范围内的常驻居民,这部分占绝大多数(一次性路过的消费者人数较少,可以忽略不计);首先我们利用GIS这个工具,设法得到每个超市周围一定范围内的常驻人口数,做为该超市的潜在消费群体;然后根据过去一定时间内,这个品牌所有超市的营业额统计,计算出所有超市店面潜在消费群体每人每天的大约消费额度是多少,做为该品牌超市的一个平均竞争力(每人/天购买力是多少);这样就能利用这个平均竞争力数值和某个超市潜在消费人口数,预估出该超市一定时期内大约的营业额收入。如果实际营业额与这个预估相差不大,我们认为该超市营业状况正常;如果营业额统计明显小于这个预估值,则有可能是该超市营业范围内新增了竞争对手的店面,或竞争对手采取了促销措施等手段分流了购买力,从而提醒经营者及时对营业策略做出调整,避免进一步的损失。
  超市店面的营业额统计我们有了,下一步就需要获得每个超市潜在的消费人群数量。我们分两步来完成这项工作:第一步计算出距离某个超市店面一定时间车程的地理范围,作为该超市潜在消费群体的居住区域;第二部查询出该区域内的常驻人口数。
  GIS正是用于处理所有与地理分布相关任务的一个有力工具,Geoprocessing则是它的核心所在。上面的两个步骤我们就可以利用Geoprocessing轻松完成。ArcGIS Server中,将具有一定逻辑相关的一组任务封装成一个处理流程,发布成Geoprocessing Service(简称GP服务),通过Task的形式供客户端调用。客户端只需提供相关的参数后,就可直接得到处理结果,而不需要理会服务器端复杂的处理流程。ArcGIS Online为我们提供了两个现成的Geoprocessing Service:CreateDriveTimePolygonsPopulationSummary。前者用来获得距某点一定时间的车程范围,后者用来获得某范围的常驻人口,刚好符合我们的需求。因此只需调用这两个GP服务,即可得到我们想要的数据,从而完成相关计算工作。
  注:CreateDriveTimePolygons适用于美国境内,在此仅作说明之用;由于数据原因,程序内所使用的北京市内的对应GP服务无法公开。PopulationSummary适用于全世界范围,但结果精度不做保证。关于两个服务的使用限制,请查看相关页面。
  我们依然创建一个工具类,取名Analysis,该类包含两个GeoProcessing Task(Geoprocessor):_gpDriveTime和_gpPopulation,分别用于获取某超市的营业范围和该范围内的常驻人口数。

   1: private Geoprocessor _gpDriveTime = new Geoprocessor(App.Current.Resources["GPDriveTime"] as string);

   2: private Geoprocessor _gpPopulation = new Geoprocessor(App.Current.Resources["GPPopulation"] as string);

   3: Time.ExecuteCompleted += gpDriveTime_ExecuteCompleted;

   4:                 _gpDriveTime.Failed += (s, a) =>

   5:                 {

   6:                     MessageBox.Show("ServiceArea"+a.Error.Message + "n" + a.UserState);

   7:                 };

   8:                 _gpPopulation.ExecuteCompleted += gpPopulation_ExecuteCompleted;

   9:                 _gpPopulation.Failed += (s, a) =>

  10:                 {

  11:                     ChangeMapOpacity(-1);

  12:                     MessageBox.Show("Population"+a.Error.Message + "n" + a.UserState);

  13:                 };

  GP Task是ArcGIS API for Windows Phone提供给我们用来调用Geoprocessing Service的类,与Query Task,Identify Task等相同,使用分为三个步骤:准备参数,提交请求,处理结果。我们首先来看一下CreateDriveTimePolygons这个GP服务所需的参数:

image

  总共有三个参数。Direction为Input的参数,即输入参数,有两个:Input_Location和Drive_Times。因此我们只需准备好这两个参数,即可调用该服务。最后结果中,会包含Direction为Output的参数,即就是我们的结果了(esriGeometryPolygon)。

   1: void _FLayer_MouseLeftButtonDown(object sender, GraphicMouseButtonEventArgs e)

   2: {

   3:     //……

   4:     //prepare parameters for GP Service

   5:     GraphicCollection gc = new GraphicCollection();

   6:     gc.Add(e.Graphic);

   7:     CalculateServiceArea(gc);

   8:     //……

   9: }

  10: mary>

  11: /// find the service area of a given supermarket

  12: /// </summary>

  13: /// <param name="gc">the graphic collection contains the supermarket</param>

  14: private void CalculateServiceArea(GraphicCollection gc)

  15: {

  16:     ESRI.ArcGIS.Client.Projection.WebMercator wm = new ESRI.ArcGIS.Client.Projection.WebMercator();

  17:     GraphicCollection graphicCollection = new GraphicCollection();//using new gc to remain point(121000) stay on map

  18:     foreach (Graphic g in gc)

  19:     {

  20:         Graphic graphic = new Graphic()

  21:         {

  22:             Geometry=wm.ToGeographic(g.Geometry)

  23:         };

  24:         graphicCollection.Add(graphic);

  25:     };

  26:  

  27:     FeatureSet fs = new FeatureSet(graphicCollection);

  28:     List<GPParameter> parameters = new List<GPParameter>();

  29:     parameters.Add(new GPFeatureRecordSetLayer("Input_Facilities", fs));

  30:     parameters.Add(new GPString("Drive_Time_Values", "20 40"));

  31:     //execute the GP Task

  32:     _gpDriveTime.ExecuteAsync(parameters);

  33: }

  34:  

  35: riveTime_ExecuteCompleted(object sender, GPExecuteCompleteEventArgs e)

  36: {

  37:     ESRI.ArcGIS.Client.Projection.WebMercator wm = new ESRI.ArcGIS.Client.Projection.WebMercator();

  38:     foreach (GPParameter parameter in e.Results.OutParameters)

  39:     {

  40:         if (parameter is GPFeatureRecordSetLayer)

  41:         {

  42:             GPFeatureRecordSetLayer gpLayer = parameter as GPFeatureRecordSetLayer;

  43:             //40 min

  44:             gpLayer.FeatureSet.Features[0].Symbol = new SimpleFillSymbol()

  45:             {

  46:                 Fill=new SolidColorBrush(Color.FromArgb(119,153,255,153)),

  47:                 BorderBrush=new SolidColorBrush(Color.FromArgb(255,153,255,153)),

  48:                 BorderThickness=2

  49:             };

  50:             gpLayer.FeatureSet.Features[0].Geometry = wm.FromGeographic(gpLayer.FeatureSet.Features[0].Geometry);

  51:             _GLayer.Graphics.Add(gpLayer.FeatureSet.Features[0]);

  52:             //20 min

  53:             gpLayer.FeatureSet.Features[1].Symbol = new SimpleFillSymbol()

  54:             {

  55:                 Fill = new SolidColorBrush(Color.FromArgb(119, 153, 153, 255)),

  56:                 BorderBrush = new SolidColorBrush(Color.FromArgb(255, 153, 153, 255)),

  57:                 BorderThickness = 2

  58:             };

  59:             gpLayer.FeatureSet.Features[1].Geometry = wm.FromGeographic(gpLayer.FeatureSet.Features[1].Geometry);

  60:             _GLayer.Graphics.Add(gpLayer.FeatureSet.Features[1]);

  61:  

  62:             map1.ZoomTo(gpLayer.FeatureSet.Features[0].Geometry);

  63:             

  64:             //……

  65:             (_BusyIndicator.Child as TextBlock).Text = "查询服务区内人口数......";

  66:             //继续查询该范围人口数

  67:             //……

  68:         }

  69:     }

  70: }

image

  可以看到,我们在parameters集合中添加了GP服务所要求的所有输入参数,然后执行;而结果中,我们也取得了GP服务中的输出参数。这里说明一点,GP服务的参数GPParameter比较灵活,新建参数时的名称,类型一定要保持与Service Directory服务列表中一致,否则可能导致调用失败。另外由于GP服务的空间参考(4326)与我们的底图(102100)不一致,所以做了坐标转换。
  此外我们还注意到一点,CreateDriveTimePolygons服务的执行方式是“esriExecutionTypeSynchronous”即同步调用。这种方式一般用于执行过程时间较短的GP服务,缺点是客户端需要在返回结果之前等待。具体可参考这里
  获得了超市的服务范围之后,需要用第二个GP服务,PopulationSummary来获得该范围内的人口总数;之后就可按照前面的分析思路,来计算出该超市的营业额预期,与实际营业状况比较后,可得出相应的结论。

image

参考资料:
Geoprocessing概念:http://help.arcgis.com/en/arcgisdesktop/10.0/help/002s/002s00000001000000.htm

ArcGIS Server中的Geoprocessing Service:http://help.arcgis.com/en/arcgisserver/10.0/help/arcgis_server_dotnet_help/index.html#//009300000028000000.htm

ArcGIS API for Windows Phone中调用Geoprocessing Service:http://help.arcgis.com/en/arcgismobile/10.0/apis/windowsphone/help/011v/011v0000001m000000.htm

  至此,《ArcGIS API for Windows Phone开发实例》已经结束,希望大家能通过这几篇文章对ArcGIS API for Windows Phone有所了解。目前API的版本是2.2 beta,这仅仅是一个开始,随着以后大家对移动GIS的关注越来越多,相信esri也会在API中逐步推出更多的功能来满足我们更多的应用需求。
  在前不久召开的MIX11大会上,微软展示了新的Windows Phone Mongo,该版本的SDK中不仅WP的性能有了很大提升,而且有着全面支持真正的多任务,Silverlight 4,内嵌全功能IE9浏览器,支持socket通信,允许同时使用Silverlight和XNA编程模型(SL中就会有原生3D功能支持)等令人兴奋的新特性。伴随着市场占有率不断提升的这一事实,有着真正硬实力的Windows Phone有理由让我们相信不仅对于开发者,同样对于用户而言,它能给我们带来更多机会。

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>