【环境】Windows XP SP3,ArcGIS Server 9.3,Visual Studio 2008,Windows Mobile 6 Professional SDK
ArcGIS Mobile简介
随 着3G移动通讯时代的到来,移动设备开始扮演越来越重要的角色。包括各种智能手机、PDA、导航设备、平板电脑在内的各种移动终端,在人们生活和业务中发 挥越来越重要的作用。对于移动设备来说,构建其上的GIS应用天生与目前基本属于移动设备标准配置的GPS关系密切;同时,有了3G高速带宽的支 持,GIS在移动设备上的各种应用,也能够凭借互联网的东风,扶摇直上。这个时候,ArcPad以及其它很多嵌入式GIS开发工具已经不能满足这样的需求 了,ArcGIS Mobile应运而生。
ArcGIS Mobile开发的应用,不仅支持在线应用,它同时也支持离线应用。在应用程序有可用的网络使用时,ArcGIS Mobile应用可以在线同步更新数据,并下载到本地设备上作为缓存;当网络暂时不可用时,ArcGIS Mobile应用同样可以通过操作缓存数据来使用;甚至在应用部署的时候,我们可以预先生成缓存直接部署到目标设备上。这种灵活的模式使ArcGIS Mobile应用在移动环境下有着非常好的伸缩性。
通过SDK我可以做什么?
通过ArcGIS Mobile SDK,我们可以实现以下一些主要功能:
1. 浏览空间数据
2. 捕捉、标注GPS位置
3. 创建或更新点、线、面等要素
4. 通过ADO.Net编辑表格数据
5. 自动从GIS服务器同步更新数据
我们看到,以上的这些功能,基本上已经可以满足移动GIS应用的需求了。那么我们再来看一看从整体流程上如何创建一个移动应用。
从上图我们可以看到,通过ArcGIS Mobile创建一个移动应用大体可以通过这几个步骤完成:
1. 在ArcGIS Desktop中设计创建地图
2. 将地图通过ArcGIS Server发布
3. 使用ArcGIS Mobile SDK创建移动应用程序
4. 将程序部署到目标设备上
是不是很简单?对于了解并熟悉ArcGIS Server和.Net程序开发的人来说,开发移动应用无非是换了一个开发环境——在ArcGIS Server强大的支持下,万变不离其宗。
好,让我们开始开发我们的第一个ArcGIS Mobile应用吧!
准备数据并发布服务
对 于熟悉ArcGIS Desktop和ArcGIS Server的人来说,这和桌面应用的数据准备没有任何区别。我们首先使用ArcMap进行地图的组织,然后通过ArcCatalog或者ArcGIS Server Manager将这个地图发布成服务,只需注意,为了支持我们的移动应用,在发布服务时,选中“Mobile Data Access”。
我们在移动设备上使用的地图服务一般应该是如下的这种URL形式:
http://
支持的设备平台
ArcGIS Mobile 9.3支持以下这些智能设备平台:
- Windows Mobile 6 Professional
- Windows Mobile 6 Standard
- Windows Mobile 5 Pocket PC
- Windows Mobile 5 Smartphone
- Windows Mobile 2003
- Windows CE .NET 5.0
以 上这些移动设备平台SDK都可以在微软的网站上免费下载。另外需要说明的是,除了这些智能设备,ArcGIS Mobile支持完整的.Net框架,因此ArcGIS Mobile也支持开发能够在Ultra-Mobile PC(超便携移动个人电脑,操作系统可能包括Windows XP、Windows XP Tablet PC edition和Windows Vista)上运行的桌面程序。当然,在进行开发之前,你首先需要确定你的应用最终是要部署到哪里的,为智能设备开发的应用和为PC开发的应用是不能通用 的。
使设备联网
如今我们的移动应用大部分都要整合到Internet中去,形成 MID(Mobile Internet Device)应用。ArcGIS Mobile也需要Internet与ArcGIS Server进行同步和交互,所以,我们需要首先想办法让我们的设备能够联网。
关于使模拟器上网,你可以在Google搜索“模拟器 上网”,有很多可供参考的材料。这里选择的是适合只有一个IP地址的上网方法:通过ActiveSync连接PC上网。
1. 打开ActiveSync ,点击“文件”—>“连接设置”,在“允许连接到以下其中一个端口”下选择“DMA”。
2. 打开Visual Studio,点击菜单“工具”—>“设备仿真管理器”,选择模拟器,在右键菜单中点击“连接”。等模拟器启动后,再点击“插入底座”(Cradle),此时,通过ActiveSync来连接到模拟器,并进行数据同步。
3. 在模拟器中,点击“开始”—>“设置”,点击“连接”选项卡。
(1)选择“网卡”-“我的网卡连接到”选“默认单位设置”。在 “点击适配器以修改设置:”下面选“AsyncMac NDISWAN Miniport”,选中“使用服务器分配的IP地址”,点击右上角的“ok”,连续确认后结束设置。
(2)在“连接”选项卡中选择“连接”。在“高级”选项卡中,点击“选择网络”,在“在程序自动连接到Internet时,使用:”下面选“单位设置”(默认是“Internet设置”),然后,连续点击右上角的“ok”确认设置。
4. 在“设备仿真器管理器”中选中该模拟器,先点击右键菜单中的“移除底座”,再点击“插入底座”,重新与ActiveSync连接一次后就可以上网了。打开浏览器,输入Google的网址,它还很智能唉,自动跳转到布局比较小的Mobile页面上去了。
测试Mobile服务和设备连接情况
在 正式动手开发我们的移动应用之前,先不要着急,我们还没有检查我们的Mobile服务是否正常,我们也没有检查设备能否通过网络连接到GIS服务器,获得 Mobile地图数据。所以,最好还是先测试一下看看效果再说。但是,我们还没有开发任何一个哪怕“Hello World”程序,怎么测试呢?
ArcGIS Mobile想得很周到,你从浏览器打开ArcGIS Server Manager可以看到,首页很醒目的一个选项是“Create a mobile project”。跟Web程序很类似,通过这个向导我们可以快速地生成一个Mobile应用。
哦,这里插播一句,如果你对智能设备调试比较熟悉的话,你也可以使用Sample程序(比如:
“%ARCGIS_HOME%\DeveloperKit\SamplesNET\Server\Mobile_Applications\MapViewer_PPC05CSharp.zip”)来测试,效果也很不错的。
这 个向导很简单,无非根据一些提示选择一些数据源,一路next而已。套用一句书面语:“此处不再赘述”——听说有一部明朝历史剧,愣是能把一个太监泡茶拍 了小半集,我想如果是我看一定会睡着的。OK,新建完成以后我们再点击“View Mobile Project via the web”,在跳转的页面中点击“ArcGIS Mobile Application”,下载“ArcGISMobile.cab”到本地。这个cab文件可以在设备中进行安装,跟PC上经常出场的 “Setup.exe”类似。这这里,我这个应用的名称叫“WuMobileMap”。
我 们的阵地要转移到模拟器上了,当然,目前为止这个可爱的“ArcGISMobile.cab”文件还在PC硬盘上,先想办法给挪到设备上去。这个很简单, 在模拟器菜单“File”->“Configure…”中设置“Share folder”到你PC上的一个目录,这个目录就好像一张存储卡一样插到设备中去了。
好 了,一切完成以后,我们可以从模拟器的资源管理器中找到“Storage Card”,运行上面的那个cab文件,把ArcGIS Mobile Application安装到设备上。OK,运行它!它会提示你需要你指定一下下载应用的位置,我输入了我的机器名和arcgis服务名称,在这个位置, 程序可以找到我们刚刚生成的Mobile应用“WuMobileMap”。
再继续,不出意外的话,我们很快就看到了服务器上发布地图。嗯,证明了服务和连接都没有问题。
新建项目
从这里开始,我们从零开始构建我们自己的移动设备应用,这才是我们的目的所在。
新建一个Smart Device项目,选择目标平台,这里选择的是Windows Mobile 5 Pocket PC。同时,选择.Net框架版本为2.0 。
点击确定按钮以后,经过短暂的等待(多短暂视你的机器强劲程度),和桌面应用开发一样,我们看到项目解决方案里面有一些自动生成的文件和目录,仔细一看,竟然还有一个Form1,看名字就是那么的熟悉!看,这和桌面开发有什么区别?
有个地方值得我们稍微注意一下,看下图的下拉框:
这 个下拉框包括了所有你可用的目标设备(视你安装了多少个智能设备SDK),最后以Emulator结尾的表明是模拟器,如果你手边没有一个真实的智能设 备,那当然要选择模拟器进行开发;显然,还有一个选项是为真实设备准备的,如果你手头有一个真实的智能设备,并且这个设备已经成功地和电脑连接,那么你可 以选择这个直接在机器上开发。
上面的Square表示模拟器的屏幕是方形的,当然,对应的还有长方形的,一般来说是4:3,比如 320×240像素大小。这个通常在模拟器名称上可以看出来。对于计算机屏幕大小还有一些术语,比如VGA、QVGA等等,等你看到的时候,适时 Google一下就知道了。
最后再唠叨一句,如果你开发的是中文程序(废话…),最好还是要下载一个中文版的模拟镜像装上,要不然在调试的时候中文内容只能看到方块字(是真的方块字,每个字都是一个方块…)是一件很郁闷的事情。
Windows Mobile 6 Professional SDK: Windows Mobile 6 Professional中文镜像: |
好了,调试一下,在模拟器中我们可以看到一个空白的窗体,表明我们的工程创建成功了。好了,这个模拟器你可以放在那里不要关掉,好节省它每次启动花费的时间。
顺便打开Toolbox(工具箱)看看,在ArcGIS Mobile Controls选项卡下可以看到ArcGIS Mobile SDK提供的若干开发控件。让我们还是从听名字就最熟悉的Map控件开始吧……
Map控件
和 桌面程序类似,Map控件提供了对地图内容进行管理和控制的功能。当我们给窗体添加了一个Map对象时,我们可以发现Map自动绑定了一个 MobileService对象,在ArcGIS Mobile中,地图内容通过MobileService控件获得和发送,Map则主要负责表现。MobileService对象同时还能够管理缓存。
我们指定MobileService对象的Url属性为上面发布的Mobile地图服务地址:http://wuyf-winxp/arcgis/services/California/MapServer/MobileServer。
接 下来,我们需要给Map控件指定若干操作,比如平移、缩放等等。这可以在Map控件的MapActions集合中进行设置,这里首先先添加 PanMapAction、ZoomInMapAction等几个基本操作。在我们预先设定的工具条按钮上(当然,如果你喜欢使用菜单也是一样的),将每 个按钮的点击事件设定到对应的地图操作上去。我是这样做的(每个按钮设置一个Tag):
private void toolBar_ButtonClick(object sender, ToolBarButtonClickEventArgs e) |
好 了,Map控件的基本雏形完成,万事俱备、只欠东风,只要有数据过来,我们就可以渲染出来,并且进行操作了。让我们想一想现在我们有什么,还需要什么。我 们有的就是这个Map对象和在服务器上发布的Mobile地图服务,显然,要想显示地图,我们还需要把Mobile服务的数据下载到本地设备上来,好,这 就是我们剩下的目标。
对于第一个应用,本地设备上没有缓存,需要首先初始化缓存的目录(btw:智能设备上的目录结构和PC不同,它有一个根目录,所有文件在这个根目录下组织,比如“\Storage Card\cache”),在此基础上打开缓存,用以接受数据。
这一切都完成以后,程序就要告诉服务器,嗨,把数据发过来了。好的,我现在需要获得所有的Feature,那么就用MobileService的GetFeatureDataAsync方法通知服务器,服务器很聪明的把结果全部给你返回过来。
以上这一切,我都让它在窗体的Load事件中完成。
private void FormMain_Load(object sender, EventArgs e) if (!this.mobileService.IsValid) if (this.mobileService != null && this.mobileService.IsOpen) try |
好了,我们现在已经可以浏览地图了,运行一下,看看我们的成果:
到这里,可以算完成了一个简单似“Hello World”的移动GIS应用了。在本文的后续,将对ArcGIS Mobile的其他功能开始展开叙述,本篇先暂告一段落:)
52 条评论:
您好,写的很不错
我现在在做一个移动线路巡检的毕业设计,看了您的文章有了点头绪,还希望得到您的指教,在初步的时候,我的mapcache总是打不开,提示文件路径找不到,我不知道按您的方式把storagePath具体创建在什么地方,所以想请您详细指教下,另外是否创建的文件夹中本身为空,利用GetFeatureDataAsync来获取数据就行吗?
storagePath就是一个变量,你喜欢放哪里就放在哪里。你可能需要注意一下Windows Mobile的文件系统和桌面Windows不同,Windows Mobile所有的文件都组织在一个根目录“\”下,比如“\Windows”。
有了文件夹以后,使用GetFeatureDataAsync就可以获得数据,甚至可以选择刷新数据还是仅仅获得数据。
您好!
很高兴看到您及时的回复,我今天重新试一试了,还是不行,
1.我创建了一个map服务,并发布了,支持mobile access ,其地址是:http://ycncepu/arcgis/services/MobileMap/MapServer/MobileServer,启动服务,并设置了模拟器可以访问网络;
2.设置storagePath为一目录,之后使用
if (!mapCache1.IsValid)
{
MessageBox.Show("地图缓存无效,请检查!");
return;
}
if (this.mapCache1 != null && this.mapCache1.IsOpen)
{
this.mapCache1.Close();
}
try
{
this.mapCache1.Open();
this.mapCache1.GetFeatureDataAsync(this.map1, true, null);
}
catch(Exception ex)
{
MessageBox.Show("不能打开地图缓存!"+ex.ToString());
}
来访问,但是还是不成功,异常仍然提示了filenotfound,感觉代码肯定不错,就是一条open(),真不知道为什么?
我使用的版本是9.2server,我还是用现有的实例MobilePocketPCApp同样做了测试,如果我把现有的map文件Redlands文件夹复制过去,模拟器本地有数据就可以成功浏览地图,否则一样报错filenotfound;请不吝赐教!
另外由于自己个人学习,没有资源依靠,还奢望您能否提供些开发学习资料,不胜感激!都要疯了,呵呵我的qq是344268673,急盼你的回复和联系!!!
注:绝不是商业行为
没有数据的时候,Open()之前先Create()
ArcServer9.2环境下,如果没有数据的时候,Open()之前先Create()后,还是异常
不知道具体的异常是什么,请参考看这个官方网站的例子:
// Method 1: Access map cache via Map
Map myMap = new Map();
PanMapAction panMapAction = new PanMapAction();
myMap.CurrentMapAction = panMapAction;
MapCache myMapCache = new MapCache();
myMapCache.StoragePath = "c:\\temp\\dasfasdf";
myMapCache.Url = "http://tyranus/arcgis/services/Redlands/MapServer/MobileServer";
myMap.MapCache = myMapCache;
if (myMapCache.Exists)
myMapCache.Delete();
myMapCache.Create();
myMapCache.Open();
Controls.Add(myMap);
myMap.Location = new System.Drawing.Point(0, 0);
myMap.Size = this.Size;
myMapCache.GetDataAsync(myMap, true, null);
// Method 2: Access local map cache through FileOpenDialog
ESRI.ArcGIS.Mobile.Map myMap = new ESRI.ArcGIS.Mobile.Map();
ESRI.ArcGIS.Mobile.PanMapAction panMapAction = new ESRI.ArcGIS.Mobile.PanMapAction();
myMap.CurrentMapAction = panMapAction;
Controls.Add(myMap);
myMap.Location = new System.Drawing.Point(4, 4);
myMap.Size = this.Size;
ESRI.ArcGIS.Mobile.MapCache myMapCache = new ESRI.ArcGIS.Mobile.MapCache();
FolderBrowserDialog myFolderBrowserDlg = new FolderBrowserDialog();
if (myFolderBrowserDlg.ShowDialog() == DialogResult.OK)
{
myMapCache.StoragePath = myFileOpenDlg.SelectedPath;
myMap.MapCache = myMapCache;
myMapCache.Open();
}
您好,您的这篇博客对我启发很大,我想知道ArcPAD与Mobile SDK的最大区别是什么?你开篇说ArcPad不能满足应用了,主要是指什么?请不吝赐教。谢谢
ArcPad是工作组级的移动GIS应用,提供有限的脚本扩展功能,业务模式一般是:野外数据采集->回到数据中心同步,主要适合专业GIS数据采集工作;ArcGIS Mobile是企业级的应用,提供完整的二次开发能力,业务模式一般是:实时数据更新->实时数据同步,主要适合普通GIS应用。
粗略类比一下,可以将ArcPad理解为移动的ArcGIS Desktop,将ArcGIS Mobile理解为移动的ArcGIS Engine。
你好,我想了解一下,ArcGIS Mobile SDK 9.3 ,能不能进行路径分析?
路径分析不能
那路径分析的有没有推荐可以使用的哦,谢谢哦。
不好意思,在移动设备上我还不清楚怎么可以做路径分析,不过提供一个思路就是在服务器上发布相关的GP服务,在移动端发送请求并获得结果。
牛兄那里下载arcgis9.3 server
上网搜一下吧……
为什么ArcGIS server9.3 自带的sample程序中的ppc程序都不能用vs2005打开呢?打开时出现“从用户数据存储中检索信息时出错。未找到平台。”
“由于数据存储中不存在项目引用的设备平台,因此无法打开项目。”提示不能打开,为什么啊?我环境都装了啊,是不是需要配置什么啊?
你装 Windows Mobile SDK 了么?
装过了,我装的是Mobile 6 sdk,也装过Mobile 5 sdk,我自己写的ArcGIS Mobile程序就能运行?但系统自带的for ppc的程序都有这问题,这到底是怎么回事?我一整套Arcgis产品都装过了!
我看了一下,这是因为项目找不到PPC平台所致,Sample是在Window Mobile 5 上做的,你的Windwos Mobile 6会找不到平台。
解决方法:在解决方案里右键项目,选择编辑项目属性,把第一个“PropertyGroup”元素中的内容删掉,重新添加“DeployDeviceID”元素。比较简单的办法就是把你自己的项目的.csproj文件打开,从中找到相关的内容复制过来。
我通过ArcGIS catalog做好mobile cache缓存后,当我用mobile app加载时,能对图层进行选择性加载吗?比如说,有的图层不加载!该怎么写呢?能给个Demo吗?谢了!
每个MobileService对应一个地图服务,如果你有多个图层需要选择性加载,应该把它们发布成不同的地图服务,然后通过不同的MobileService加载。最后,选择性地在Map的Datasources中添加MobileService对象。
牛哥,看了你的博客写的很不错,但是对于ArcGIS Mobile的内容太少了,不能满足需求啊,呵呵!希望牛哥多写点关于这方面的内容啊!牛哥加油啊!做好写几个Demo程序发布一下就最好了!我们会持续关注的!
为什么我发布Mobile地图服务的时候用IE打开ArcGIS Server Manager却是连接不到网络,这是怎么回事?
你的IIS起来了么?
启动了了,打开就是HTTP 500内部错误!
不好意思,没遇到过这样的问题,我也不知道
ArcGIS Mobile对于转换出来的cache图层一定要为SDE图层才能编辑吗?能直接编辑吗?这样做好像比较麻烦啊.还有别的方法吗?
一定要SDE数据,而且这仅仅是一个必要条件。
为什么我按照你的步骤新增多边形,保存后在地图上没有显示呢?新增的多边形保存到了什么地方呢?能够给多边形填充颜色么?该怎么做呢?谢谢了!
请看以下http://wu-yongfeng.blogspot.com/2008/08/arcgis-mobile-sdk-93_14.html 其中的“离线编辑”段落,最后有图层是否可以编辑的条件。编辑是可以设定填充色的。
我的所有的图层均为能编辑的SDE数据,Global id也是全部都有的,只是画完后,点击保存也说保存了,但是图上却没有显示,也不知道保存到哪了?我就是参考的你的代码写的!这是为什么呢?
你把代码发给我看吧
请问 我的ArcGIS Server Manager 里没有
arcgis mobile applicatiton 这一项 这是怎么回事 谢谢
.Net的 ArcGIS Server Manager才有,你的是Java版的吧?
我想请问一下我的map控件加不上是什么原因呢,都重装系统了一次还是不行,它总是提示:
创建组件“Map"失败。错误消息为:
”System.IO.FileLoadException:给定程序集名称或基本代码无效。(异常来自HRESULT:Ox80131047)
在System.Reflection.AssemblyName.nInit(Assembly& assembly,Boolean forIntrospection,
Boolean raiseResolveEvent)
请问这是什么原因呢?谢谢。
你的vs打sp1补丁了么?
刚装上SP1,现在好了,哈哈,谢谢牛哥!
你好,我请问下我装了arcgis server9.3 dotnet edition 为什么没有 ArcGIS Server Manager 呢?谢谢
没装好
"this.mobileService.Open (ESRI.ArcGIS.Mobile.MobileServices.CacheOpenMode.Create);"
出现错误:"Client found response content type of 'text/html; charset=utf-8', but expected 'text/xml'."
怎么回事?
你好,我想请问下arcmobile 93里带的例子里面都有一个mapcache文件夹里面放的是bin二进制文件是地图数据,如果我要想打开自己的一个地图缓存数据,比如一个shp文件,要怎么转成bin文件呢?
用ArcToolbox可以
已经转好了,十分感谢啊!
急,急,急
Map myMap = new Map();
PanMapAction panMapAction = new PanMapAction();
myMap.CurrentMapAction = panMapAction;
MapCache myMapCache = new MapCache();
myMapCache.StoragePath = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + @"\WuMobileMap_Cache";
myMapCache.Url = "http://pc-200903091527/arcgis/services/DeYang/MapServer";
myMap.MapCache = myMapCache;
if (myMapCache.Exists)
myMapCache.Delete();
try
{
myMapCache.Create();
myMapCache.Open();
}
catch (Exception ee)
{
MessageBox.Show(ee.Message );
}
Controls.Add(myMap);
myMap.Location = new System.Drawing.Point(0, 0);
myMap.Size = this.Size;
myMapCache.GetDataAsync(myMap, true, null);
在Create的地方出错,提示”未能与网络的连接“
但是我的模拟器可以打开WWW.GOOGLE.COM
请问错在哪里?
把机器名改成ip
先感谢你的回复哈!
也不行啊
提示如下错误:
"WebException"
然后显示排错提示:
检查异常的response属性以确定请求失败的原因。
检查异常的status属性以确定请求失败的原因。
还有我的Services manage 里面怎么没有Create a arcgid mobile appliction?
vs2005 完全安装是不是自带了 windows mobile 6 sdk?
真的很感谢你!
你的URL错了,应该要用http://ip/arcgis/services/DeYang/MapServer/MobileServer
为什么Services manage 里面没有Create a arcgis mobile Projection?
而vs2005 里面所有的GIS Mobile 控件都有?
9.2 里面怎么制作Mobile的cache数据?
我用generate map server cache
但是总是错:“Invalid Number of Levels Specified”
9.2我不熟悉
还很感谢你的关注
之前的问题已经基本解决
现在我想问一下:
我现在要实现的是在图上加点,并用自己定义的标记符号
我用DrawGeometry 画点 只能是实现画一些不同大小不同颜色的点
请问该怎么着手?
用DrawMapimage或者DrawPlogon 行吗?
安装程序有自己带的例子吗?
(我现在非常着急,希望在你方便的时候尽早回复我,我将不甚感激,先谢过)
你自己查一下9.2的API,有DrawPolygon的话就可以
啊牛,我发现用ArcGIS mobile SDK9.3做查询,不论用FeatureLayer.GetDataTable或者是GetDataReader()都很慢。你有没有碰到这种情况?知道是什么原因吗?
谢谢
发表评论