转:ArcGIS Mobile9.4学习笔记

原文:http://www.cnblogs.com/ECNU-GIS-LIUJIE

ArcGIS Mobile在9.3版本中作为ArcGIS Server高级版的一部分(如下图左),在9.4 Beta2(以下简称9.4)中被剥离了出来,作为一个独立的文件进行安装,由此产生了一些变化。我们知道在9.3版本中,登陆ArcGIS Server Manager管理页面,展开Applications面板后,会出现Web Applications, Mobile Projects等应用程序类型(如下图右)。点击Mobile Projects类型,利用其后向导页面可以很方便的构建ArcGIS Mobile Applications(Mobile开箱即用的应用程序),但在9.4中没有了Mobile Projects类型,类似功能的实现方法在寻找中。。。

 
  在服务的发布方面,9.3在发布Map Service服务的过程中确保选中“Mobile Data Access"能力,用来支持移动应用的地图服务,服务创建成功后,你将获得访问Mobile Service的url格式为: http://(Server)/arcgis/services/(ServiceName)/MapServer/MobileServer。在9.4中专门提供了用于移动地图服务的“Mobile Data Access”类型的服务,访问服务的Url格式: http://(Server)/arcgis/services/(ServiceName)/MobileServer,同9.3相比,中间去掉了“MapServer”。虽然没进行相关测试,但我相信在性能上,专门的移动地图服务类型肯定比9.3中附加了“Mobile Data Access"能力的普通地图服务要高很多,毕竟移动设备由于CUP、内存等有限,对性能的敏感度还是很高的。
 
  在地图服务缓存的创建方面,在ArcToolbox的Mobile Tools中,9.3(下左)和9.4(下右)也有变化(顺便说下,ArcGIS 9.4的界面有些Visual Studio的风格~),9.4中的Create Mobile Map的功能貌似和Generate Mobile Service Cache相同,用来为所有Operational layers生成mobile service cache,而为背景图层生成高压缩比例Cache的"Create Mobile Basemap"的GP Tool目前还不知道用什么东西替代了。
 
  ArcGIS9.4在安装后,在ArcGIS大目录下,Server、Desktop、Mobile等程序将创建各自独立的文件夹,针对于ArcGIS Mobile,将在默认路径C:\Program Files\ArcGIS下产生一个Mobile9.4的文件夹,其下Bin文件夹下的ESRI.ArcGIS.Mobile.dll等程序集用于部署到Windows平台上的程序;其下DeveloperKit\CompactFramework文件夹下的ESRI.ArcGIS.Mobile.dll等程序集用于部署到移动设备(安装了Windows Mobile等操作系统)的程序。
ArcGIS M0bile 9.4 Beta2的安装程序包含了5个部分(如下图),其中最重要的Software Developer Kit可以用来拓展ArcGIS Mobile Applications的功能(9.4中怎样创建此现成的应用程序还不知道,因为上篇中提到ArcGIS Server Manager中此功能已被移出)。ArcGIS Mobile SDK还可以把GIS功能嵌入到已有的移动设备应用程序中,所以利用ArcGIS 9.4 Mobile SDK进行开发,最好先要有Windows Mobile SDK的开发经验,毕竟ArcGIS Mobile SDK是Windows Mobile SDK在GIS功能方面的拓展(如:1.浏览空间数据2. 捕捉、标注GPS位置3. 创建或更新点、线、面等要素4. 自动从GIS服务器同步更新数据等等)。

  Tips:应先安装Windows Mobile SDK,然后再安装ArcGIS Mobile SDK,如果ArcGIS Mobile SDK安装早于Windows Mobile SDK或其它相关程序,则可能会造成Visual Studio 的工具箱中Windows Mobile SDK的相关控件不能显示出来。解决办法:在工具箱上右击,选中“重置工具箱”命令;如果还是不能显示,则只能在控制面板下的添加或删除程序中Repair你的ArcGIS Mobile SDK程序,然后再“重置工具箱”;如果还是不行,那么恭喜你,你可以去问上帝了~

 

  ArcGIS Mobile 9.4提供的的控件(下右图)和9.3(下左图)相比,CatalogService控件被删除(组件尚在);增加了TokenCredential控件;MobileService控件的功能被拆分到MobileCache和MobileServiceConnection两个控件中。ArcGIS Mobile 9.4新增了一个ESRI.ArcGIS.Mobile.Client程序集,命名空间和相关类也进行了比较大的调整(具体内容尚在学习中,发现某些命名空间下没有一个类,估计9.4Beta2也在完善中)

   

  最后在说下2个参数的设置,MobileServiceConnection控件的Url属性设置为你服务器上发布的某个"Mobile Data Access”类型服务的Url(这个Url9.3和9.4中是不同的,具体见上篇),MobileCache控件的StoragePath属性设置为地图缓存的文件夹名(地图缓成的创建见上篇),这里要注意了,如果用GP工具生成了一个名为"XYZ"的文件夹,并把这个文件夹拷贝到移动设备的My Documents文件夹下,那么StoragePath的设置应为\My Documents\XYZ\MobileCache("XYZ"文件夹下包含MobileCache文件夹和XYZ.amp文件,amp文件是ArcGIS Mobile Project File的简称)

ArcGIS Mobile9.4 Beta2的安装程序包含了一项Mobile Project Center,从安装说明上可以看出,它的作用是创建和管理用于移动设备的ArcGIS Mobile Applications,原来从ArcGIS Server Manager中移出的功能放到这里来了。虽然文档上对Mobile Project Center功能的描述和实际有些出入,但创建ArcGIS Mobile Applications这一功能还是可用的,这也说明Mobile Project Center还在继续开发完善中,希望9.4正式版的功能比文档描述的更加强大^_^

  

  为了配合使用Mobile Project Center,我们先发布一个名为MobilePd的“Mobile Data Access”类型的服务(如下左图,9.4界面的风格是不是和Visual Studio很像呢,Catalog和Search界面如同原来的ArcToolBox一样加到了ArcMap中),打开Mobile Project Center,然后点击"New...”后显示下右图的界面,分别对左边的Mobile Map、Tasks、Capablilities进行设置。比如先对Mobile Map的Operational Map Layers进行设置,在Find Mobile Service栏中输入http://vmserver/arcgis (服务器名/实例名)后点击List,在下面后显示出我们发布的MobilePd服务,在下面的Cache Name中填入名后字再点击Add按钮。 

 

 

  在进行了所以相关设置后,单击左上角的按钮,然后选择保存按钮,在下面的页面中在左边选择"On a Web Server",然后填入你想保存项目的位置,并填写Project的名称(如PbMobileApp)后,点击OK按钮完成保存操作,在C:\Inetpub\wwwroot\ArcGIS\Mobile目录下会有相应变化(遗憾的是文档描述和事实变化有差别,具体变化自己去看)

 

  我们完成了用于移动设备的应用程序的创建工作,现在是Windows Mobile上的操作了,首先打开ArcGIS Mobile9.4,然后输入ServerName/Instance,然后选择你要下载的Project,下载数据,选择要下载的图层,最后就可以显示你的Task List和Map View上相应的操作了~

 

  

在上篇中我们可以看到,利用Mobile Project Center可以方便的创建直接可用的ArcGIS Mobile应用程序,这里我们介绍如何利用ArcGIS Mobile SDK把GIS功能嵌入到已有的移动设备应用程序中。首先利用Visual Studio创建一个智能设备项目,在VS2005新建项目对话框的左侧点击智能设备,在下面的子节点中选择项目平台(如Windows Mobile 6 Professional), 在VS2008新建项目对话框中,先在右上角选择.NET Framework 2.0,按确定按钮在随后出现的对话框中选择目标平台(如下左图),把一个Map控件拖到界面中,我们会发现一个MobileCache1控件自动添加到下面,项目的引用中也会自动添加程序集ESRI.ArcGIS.Mobile(如下右图)

Tips:如果一开始选错了目标平台也没关系,在解决方案资源管理器的项目上右击,然后选择“更改目标平台”命令,就可以修改到你期望的目标平台。

查看Map控件的DataSources属性,我们会发现MobileCache1 自动列在那里,如果没有列出,请自己添加(一般都是自动添加,除非你的RP。。。)

 

   在笔记二的最后一段我们通过属性对话框来进行参数设置,现在我们通过代码来进行同样的设置,为Form1添加Load事件,在其中添加如下代码:

Form1_Load相应函数
 1           private   void  Form1_Load( object  sender, EventArgs e)
 2          {
 3               // Environment.GetFolderPath(Environment.SpecialFolder.Personal) ==  "\My Documents"
 4               this .mobileCache1.StoragePath  =   @" \My Documents\XYZ\MobileCache " ;
 5               if  ( ! this .mobileCache1.IsValid)
 6              {
 7                  MessageBox.Show( " Map Cache is not valid! " );
 8                   return ;
 9              }
10               if  ( this .mobileCache1  !=   null   &&   this .mobileCache1.IsOpen)
11              {  this .mobileCache1.Close(); }
12               try
13              {
14                   this .mobileCache1.Open(); // 原来9.3中CacheOpenMode枚举类型的参数取消了=。=
15              }
16               catch
17              {
18                  MessageBox.Show( " Cannot open map cache " );
19              }
20          }

       因为地图缓存是事先通过笔记一中介绍的Create Mobile Map这个GP工具生成(放在文件夹XYZ中),然后把文件夹拷贝到移动设备的My Documents文件夹下的,还有一种通过访问地图服务直接创建缓存的方法在下一篇介绍。既然说到文件拷贝,那就具体介绍下模拟器配置,点击VS“工具”菜单下的“设备仿真器模拟器”,在你期待的目标平台上右击,连接后插入底座(Cradle如下左图),就可以同步了,前提是你打开了ActiveSync的wcescomm.exe程序。现在在“我的电脑”目录下,打开“移动设备”,就可以把文件拷贝到你想要的位置。

Tips:要运用ArcGIS Mobile应用程序,需要把C:\Program Files\ArcGIS\Mobile9.4\Install下的ArcGISMobile.CAB或AGMRuntime.CAB拷贝到移动设备上并安装 

        现在实现地图的移动、放大、缩小等基本功能,点击Map控件的MapAction属性,弹出如上右图的编辑框,加入你想要的操作,如PanMapAction, ZoomInMapAction、ZoomOutMapAction等,为3个menuItem添加相应函数:

地图操作
 1           private   void  menuItemPan_Click( object  sender, EventArgs e)
 2          {
 3               this .map1.CurrentMapAction  =   this .map1.MapActions[ 0 ];
 4          }
 5 
 6           private   void  menuItemIn_Click( object  sender, EventArgs e)
 7          {
 8               this .map1.CurrentMapAction  =   this .map1.MapActions[ 1 ];
 9          }
10 
11           private   void  menuItemOut_Click( object  sender, EventArgs e)
12          {
13               this .map1.CurrentMapAction  =   this .map1.MapActions[ 2 ];
14          }

   最后,我们再实现一个Identify的功能,添加一个menuItem( menuItemIdentify),为其添加处理函数,并且为Map控件添加MouseDown的相应函数,代码如下:

Identify
 1           private   void  menuItemIdentify_Click( object  sender, EventArgs e)
 2          {
 3               this .map1.CurrentMapAction  =   null ;
 4          }
 5 
 6           private   void  map1_MouseDown( object  sender, ESRI.ArcGIS.Mobile.MapMouseEventArgs e)
 7          {
 8               if  (map1.CurrentMapAction  !=   null )
 9              {  return ; }
10 
11              Cursor.Current  =  Cursors.WaitCursor;
12              MapMouseEventArgs me  =  e  as  MapMouseEventArgs;
13              Envelope qEnv  =   new  Envelope(me.MapCoordinate, me.MapCoordinate);
14 
15               double  mapTolerance  =  map1.ToMap( 3 );
16              qEnv.Resize(mapTolerance, mapTolerance);
17 
18              QueryFilter qFilter  =   new  QueryFilter(qEnv, GeometricRelationshipType.Intersect);
19 
20               string  txtResult  =   " Identify Results:  " ;
21               int  intFields;
22                   foreach  (MobileCacheLayer MCLayer  in  mobileCache1.Layers)
23                  {
24                       if  (MCLayer  is  FeatureLayer)
25                      {
26                          txtResult  +=   " \r\n Layer  "   +  MCLayer.Name;
27                          FeatureLayer FLayer;
28                          FLayer  =  (FeatureLayer)MCLayer;
29                           using  (FeatureDataReader featReader  =  FLayer.GetDataReader(qFilter))
30                          {
31                              intFields  =  featReader.FieldCount;
32                               while  (featReader.Read())
33                              {
34                                   for  ( int  i  =   0 ; i  <  intFields; i ++ )
35                                  { txtResult  +=   " \r\n "   +  featReader.GetName(i)  +   " "   +  featReader.GetValue(i).ToString(); }
36                              }
37                          }
38                      }
39                  }
40              Cursor.Current  =  Cursors.Default;
41              MessageBox.Show(txtResult.ToString());
42          }

 

 代码执行到32行的while (featReader.Read())时,此处耗费很多时间,本人开发环境是虚拟机+模拟器,所以显得更慢(Oh~,my bloom) 如果不报错,建议耐心等待,最终结果如下图:

  

转载于:https://www.cnblogs.com/gxiang/archive/2010/03/10/1682960.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值