Tag Archives: Mobile GIS

ArcGIS移动客户端离线底图的几种解决方案

  移动GIS中,通常将数据分为两大类:basemap layer和operational layer。前者是指漫游或导航时起参考作用的图层,这些图层内容通常不会变化,只起到视觉辅助作用,称为底图图层;后者是指存储GIS数据的图层,比如可通过这些图层来提供属性/空间查询操作,或者对其内容进行编辑,然后与服务器端进行同步,称为业务图层。  目前ArcGIS移动产品有5种,基于Windows Mobile平台的ArcPad和ArcGIS Mobile,这两个产品已经很成熟了,都有各自的离线缓存格式,其中ArcGIS Mobile从10版本开始,可以直接读取ArcGIS Server缓存地图服务的切片文件做为basemap layer,支持exploded和compact两种格式。  相对于以上两个老牌移动产品,三个刚出道的小弟ArcGIS for iOS,ArcGIS for Android和ArcGIS for Windows Phone就走了不同路线:依赖于ArcGIS Server的REST服务。因此几乎所有操作,包括显示地图,都需要用到ArcGIS Server发布的各种服务。这三个产品的离线功能将来肯定是会有的,但具体的时间表还无法确定。  针对ArcGIS for iOS/Android/Windows Phone,本文提出3种可行的离线底图(basemap layer)的解决方案,供各位参考。以ArcGIS for Windows Phone为例。 1、ArcGIS Server地图服务的Exploded格式缓存文件   ArcGIS API for Windows Phone中,提供了ArcGISTiledMapServiceLayer用来加载ArcGIS Server发布的缓存地图服务,它的原理是Map控件计算好需要加载的切片的row,col,level参数,利用ArcGISTiledMapServiceLayer里的GetTileUrl方法提供如何获得指定参数的切片文件,最后拼接成完整的地图。  因此我们可以通过继承ArcGISTiledMapServiceLayer的父类,TiledMapServiceLayer或TiledLayer,来实现自己的自定义图层,比如用它来加载Google Maps,天地图等各种地图。加载这些在线地图都是通过重写GetTileUrl()方法来实现的。  对于已经存放在硬盘上的缓存文件,该如何加载呢?这几个图层还有一个方法,GetTileSource。这个方法有一个onComplete action,可以传入ImageSource类型的参数,它比GetTileUrl来的更直接。其实GetTileSource方法中调用了GetTileUrl方法的结果(一个获得tile的url字符串),利用这个字符串向服务器端发送请求,请求回来的结果就是切片图片的二进制流,再将这个二进制流形成ImageSource,通过onComplete方法返回。  所以我们可以抛开GetTileUrl,直接重写GetTileSource方法,来根据row,col,level参数,读取地图服务的缓存文件。首先将Exploded格式的地图服务缓存文件拷贝到手机中:   包含conf.cdi(ArcGIS Server 10版本中才有,记录了缓存的全图范围)和conf.xml文件的好处是,我们可以在代码中读取这两个文件来动态生成我们的Tiling Scheme,以完成图层初始化的工作。从配置文件中读取参数后,就可以重写GetTileSource方法了。部分代码如下: 1: protected override void GetTileSource(int level, int row, int col, Action<System.Windows.Media.ImageSource> onComplete) 2: { 3: string f = string.Empty; 4: if (_cacheTileFormat.ToLower().Contains(“png”)) 5: f = “.png”; 6: … Continue reading ArcGIS移动客户端离线底图的几种解决方案 »

ArcGIS API for Windows Phone开发实例(5):对超市信息进行空间查询

  本文内容:ArcGIS API中Task的概念,QueryTask的使用,以及Draw对象。  空间查询GIS中一个非常常用的功能:在地图上画出任意多边形,从自己感兴趣的事物中筛选出与所画多边形有指定空间关系(通常是相交)的要素来,进一步查看。在本次开发实例中,第二个功能就是空间查询。用手势在地图上画一个范围,筛选出落入该范围的超市店面,从而进一步查看它们的营业额统计信息。  ArcGIS API中,给我们提供了许多Task类,来完成一些常见的GIS功能,比如属性/控件查询,几何对象的拓扑处理,特定工作流的地理任务等。它们都是已经封装好的Task类,使用起来都遵循3个步骤的原则:1、为某个Task设置所需的相应参数;2、通过Task对象向服务器发送处理请求;3、接受服务器端返回的结果。所有的计算和处理工作都是由ArcGIS Server发布的REST服务来完成,是典型的客户端请求,服务器端相应的流程。  QueryTask是ArcGIS API提供的诸多Task之一,它接受Query类型的参数。该参数有几个常用的属性,比如Where属性和Geometry属性,通过对这两个属性的设置,我们就可以完成最常见的属性查询和空间查询功能。依然将空间查询这个功能封装成一个工具,在主界面中进行调用。   这里为了清晰起见,我省去与空间查询功能无关的代码(所有程序代码会在教程完结后提供下载)。要使用QueryTask的功能,我们按照前面说三个步骤来做。首先设置好查询参数Query,然后通过QueryTask对象提交查询请求: 1: void _draw_DrawComplete(object sender, DrawEventArgs e) 2: { 3: Polygon polygon = null; 4: if (_usingFreeHand) //geometry is freehand polyline 5: { 6: Polyline polyline = e.Geometry as Polyline; 7: ESRI.ArcGIS.Client.Geometry.PointCollection pc = polyline.Paths[0]; 8: pc.Add(pc[0]); 9: polygon = new Polygon() 10: { 11: SpatialReference = map1.SpatialReference, 12: }; 13: polygon.Rings.Add(pc); 14: } 15: else //geometry is polygon 16: … Continue reading ArcGIS API for Windows Phone开发实例(5):对超市信息进行空间查询 »

ArcGIS API for Windows Phone开发实例(4):点击查看超市信息

  本文内容:Silverlight的自定义UserControl,NavigationService(页面导航),WP的Application Bar,ArcGIS API的ElementLayer。  上一节中,已经完成了程序的准备工作,利用FeatureLayer来显示超市位置,接下来的几篇文章中我们就来依次实现程序的四个功能点: 点击查看某个超市的详细信息; 按空间范围查看某几个店面的销售总额; 按时间的方式动态查看每个店面的营业情况; 对某个店面的近期营业情况做出具体分析。   第一个功能在GIS中叫做Identify。这个功能的作用是,当使用者激活该功能后,点击地图上的某个超市图标,会弹出一个类似气泡的小窗口(InfoWindow)显示超市名称,点击这个气泡后,程序可导航到另一个页面来显示该超市的详细信息。  由于很多功能都是利用单击地图的方式来实现,为了不让这些功能混淆,我将程序中的四个功能分别做成不同的工具(封装成不同的类),点击某个工具后就激活它,此时地图或其中的控件就响应该工具的功能。  我们在工程中新建一个文件夹Tools,放置与功能点有关的类;并在其中新建一个Identify.cs的文件,用来实现我们的第一个功能点。 1: public class Identify 2: { 3: private bool _isActivated; 4: private ElementLayer _elementLayer; //InfoWindow layer 5: public Map _map1 { get; set; } 6: public GraphicsLayer GLayer { get; set; } //supermarket layer 7: public bool IsActivated 8: { 9: get { return _isActivated; } 10: set 11: { 12: if (_isActivated != value) 13: { … Continue reading ArcGIS API for Windows Phone开发实例(4):点击查看超市信息 »

ArcGIS API for Windows Phone开发实例(3):在地图上显示超市数据

  本文内容:GraphicsLayer,FeatureLayer,自定义地图符号。  我们的应用场景是对超市数据进行展示,查询和分析,因此第一步当然是要将超市显示在地图之上。如所有的GIS软件一样,要将数据加载到地图里面,需要图层的概念,这里我们也需要合适的图层,将超市数据加载进来。  先看一下ArcGIS API for Windows Phone/Silverlight/WPF中的主要图层类型。 Layer  |–TiledMapServiceLayer  |       |–ArcGISTiledMapServiceLayer  |–DynamicLayer  |       |–DynamicMapServiceLayer  |                 |–ArcGISDynamicMapServiceLayer  |                 |–ArcGISImageServiceLayer  |                 |–GPResultImageLayer  |–GraphicsLayer  |       |–FeatureLayer  |–ElementLayer   Layer最基本的基类,常用的几种图层类型我已经用红色标记出来了。前两种ArcGISTiledMapServiceLayer和ArcGISDynamicMapServiceLayer分别用于加载ArcGIS Server发布的缓存地图服务和动态地图服务,这个在上一节中已经说过。再来看一下中间的GraphicsLayer和FeatureLayer,可以说这是API中最常用的两种图层,大部分的程序功能都要基于它们来完成。  GraphicsLayer是保留在内存中的一种图层(与ArcMap、ArcGIS Engine、ArcGIS Server ADF程序中的相应概念类似),顾名思义是很多Graphic的集合,而所有与用户交互的内容通常都用Graphic来显示。比如多边形查询中用户画出的多边形,属性/空间查询结果中的所有要素等内容,都是Graphic。可以说,除了地图本身,基本上看到的所有与地理位置有关的东西都可以用Graphic来表示。Graphic对象有3个重要的属性:Geometry,Symbol和Attributes。Geometry代表了一个Graphic的几何形状(可疑是点、线、面任意一种)或地理位置,而Symbol则表示Graphic的呈现样子,比如颜色、效果,同时有了这两个属性(缺一不可),Graphic就可以显示到地图上了。而Attributes是键值对集合,可在里面存储任意类型的对象,比如一个要素的属性信息。  FeatureLayer继承自GraphicsLayer,它与后者的区别是,GraphicsLayer中的Graphic都是人为创建出来的,而FeatureLayer中的Graphic都是从ArcGIS Server发布的服务中读取出来的,因此FeatureLayer比GraphicsLayer多了一个URL属性。这个URL通常指向一个ArcGIS Server发布的,MapService或FeatureService的子图层(对应一个FeatureClass)。FeatureLayer有了这个URL后,就可以读取出该服务对应子图层里的所有要素内容,因此FeatureLayer里Graphic的Geometry属性会自动被FeatureClass的Shape字段填充,而Graphic的Attributes字段则会根据要求,被FeatureClass中的属性信息所填充。如果发布服务的服务器是ArcGIS Server 10版本,则Graphic的Symbol属性会自动被服务的DrawingInfo信息填充。另外,FeatureLayer是客户端API中对FeatureService的唯一载体,这是它另一个非常重要的作用(也是主要作用),以后的文章中会提到。  ArcGIS API for Windows Phone/Silverlight/WPF/Javascript/Flex/iOS/Android都是基于ArcGIS Server所发布的REST服务,所以,在开始之前,我们需要将超市数据用ArcGIS Server发布成MapService。这个过程不属于本文要讨论的内容,不熟悉的同学可自己查阅相关资料。超市图层的属性表如下,前面是每个店面的基本信息,后面是该月每天的营业额信息:   超市的ShapeFile在这,点我下载。在我本机上发布出来的地址是:http://localhost/ArcGIS/rest/services/supermarket/MapServer/0。  现在打开上一节我们完成的HelloMap程序,来继续改造之。底图服务我们依旧使用ArcGIS Online提供的StreetMap数据http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer,然后我们在Map控件中加入一个FeatureLayer,其URL属性指向发布在本机的超市地图服务。由于我们的数据范围仅限于北京市附近,因此我们可以利用Map的Extent属性指定地图的初始范围,代码现在看起来是这样的: 1: <esri:Map x:Name=”map1″ Extent=”12926244,4840437,12982108,4878585″> 2: <esri:Map.Layers> 3: <esri:ArcGISTiledMapServiceLayer ID=”BaseMap” Url=”http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer” /> 4: <esri:FeatureLayer ID=”BusinessLayer” 5: Url=”http://localhost/arcgis/rest/services/supermarket/MapServer/0″ 6: OutFields=”*” /> 7: </esri:Map.Layers> 8: </esri:Map>   其中FeatureLayer的OutFields属性代表从服务器端返回的属性字段,这里“*”表示返回所有属性字段,也就是我们的Graphic对象的Attributes里自动填充了超市的所有属性值。  需要注意,在xaml代码中,最靠上的图层在显示时会出现在Map控件的最底端,如图:   Silverlight中,可以将常用的任何资源保存到Resource集合中,以便重复利用。因此我们将两个服务地址保存到App.xaml文件的ResourceDictionary中(可在所有页面中直接引用): 1: … Continue reading ArcGIS API for Windows Phone开发实例(3):在地图上显示超市数据 »

ArcGIS API for Windows Phone开发实例(2):HelloMap

  本文内容:WP开发环境的搭建和第一个程序HelloMap。所有参考资料都会给出相应链接,供仔细的朋友进一步学习,后同。 一、开发环境搭建   1、安装微软的Windows Phone Developer Tools。微软的开发离不开Visual Studio,Silverlight开发又需要Silverlight Tools for Visual Studio,WP的开发需要Windows Phone Developer Tools…看起来有点复杂,其实很简单,只需到APP HUB网站,按照1、2、3的说明依次安装即可。如图:   其中最主要的是1中提到的Windows Phone Developer Tools,它会下载一个3.2M大小的vm_web.exe安装程序,这其实是一个安装工具,不管你的机器是否安装了VS 2010(不支持以前的版本),是否安装了Silverlight Tools,它都会检测你机器开发WP程序所需的所有工具,并提示你进行安装(比如没有VS的话会为你安装VS 2010 Express,已有的就不再重复提示了),有点类似1 click install,非常方便。如果你的机器上什么都没有,那么它会依次提示你安装以下几个工具:   另外APP HUB网页上第二步中提到的Windows Phone Developer Tools January 2011 Update修复了最初版本中的bug,提供了一个新的模拟器,以及一些新的特性,比如拷贝和粘贴。第三步中提到的Windows Phone Developer Tools Fix修正了不能给真机上部署超过64M大小的XAP文件的bug。所以,2、3属于选装,但强烈推荐安装。  安装完成之后,打开VS 2010,新建工程中应该能够看到以下画面:   至此,我们已经可以用Silverlight开发WP的应用程序了。  另外,与Silverlight Toolkit类似,微软还提供了Silverlight for Windows Phone Toolkit,地址都在这里。它们都是封装好的,开源的一些控件或效果,用来补充自带控件的不足,为你的程序增加效果。  2、安装Esri的ArcGIS API for Windows Phone。ArcGIS API for Windows Phone与ArcGIS for Silverlight/WPF一样,是Esri免费提供给我们的开发包,里面包含了几个dll文件(包含各种类,函数)供我们引用。目前最新版本是2.2 beta,可利用自己的Esri Global Account(可免费申请)登陆Beta Community后进行下载。如果你不想参与beta community,也可以在这里按照提示下载2.1版本的API。2.2 beta版本的API提供了exe安装程序(2.1版本没有),安装好后,你可以在安装目录中找到以下内容: ESRI.ArcGIS.Client.dll。这是API中的核心类库,包括最常用的Map控件,各种图层类,Graphics,Geometry,Symbols等,同时还包括了各种Task:Identity,Find,Query,Geoprocessing等; ESRI.ArcGIS.Client.Bing.dll。如果你需要在程序中调用Bing Maps的底图或使用它的Geocoding或Routing服务,则需要这个dll; ESRI.ArcGIS.Client.Toolkit.dll。类似Silverlight Toolkit,是Esri提供的已经封装好的,开源的,一些常用控件,比如缩略图,书签,导航条,InfoWindow等,可以在这里下载它们的源码; … Continue reading ArcGIS API for Windows Phone开发实例(2):HelloMap »

ArcGIS API for Windows Phone开发实例(1):准备工作

  本文有三部分内容。注:以后的文章中以WP作为Windows Phone的简写。 一、Windows Phone开发需要哪些知识?   先来看一下WP的整体结构:   最底下是通用的基础类库,可以当做是.NET Framework中保留了核心功能的简化版CLR;最上层是WP特有的类库,提供给开发者与手机相关的功能,比如说屏幕控制,摄像头控制,获取位置等等。  中间这层是WP为我们提供的两套开发框架:Silverlight或XNA。也就是说,你可以利用Silverlight技术或者XNA技术来开发运行在WP上的应用程序。大致地,在WP上,Silverlight适合编写大多数应用程序,XNA适合编写游戏程序。XNA是微软提供的一套游戏开发环境,它有多强大,看看XBOX有多成功就知道了,感兴趣的同学可以深入研究。Silverlight是微软抢占RIA市场的有力武器之一,也是以后微软.NET Framework中主打开发技术之一——WPF——的子集。作为.NET开发人员,如果还不熟悉的话,有必要赶紧熟悉一下。关于它的介绍很多,可以参考我之前写的这篇,或者自己搜索。  要强调的一点是,你在别处写的Silverlight或XNA程序基本不需要或只需要进行少量的更改(比如屏幕尺寸调整或使用WP的硬件功能),便可顺利运行在WP上,这是微软统一的开发平台给我们带来的好处。  这次,我们只关心Silverlight,它就是开发WP程序所需的知识。 二、ArcGIS API for Silverlight/WPF和ArcGIS API for Windows Phone的异同?   在比较Esri的这几个客户端API之前,我们需要看一看Windows Phone上使用的Silverlight技术和普通的Silverlight技术有什么区别。目前是WP的第一个版本,也就是Windows Phone 7,它所使用的Silverlight开发技术是基于3版本的,在WP开发中你基本可以使用Silverlight 3的所有特性,还包括WP特有的触控功能。具体可参考这两篇文章:Features Supported in Silverlight for Windows Phone和Differences Between Silverlight and Silverlight for Windows Phone。需要强调的一点是,Silverlight 4的新特性在WP上基本无法使用,对此我们只能表示遗憾。但可以期待在以后的WP版本中,Silverlight版本能够与其他平台统一起来。  那么Esri的这三个API(最新的2.2beta版本中已将Silverlight和WPF两个API分开)就比较好理解了。ArcGIS API for Silverlight,ArcGIS API for WPF,ArcGIS API for Windows Phone三者的功能,架构,包括源代码完全一致,只是编译的目标平台不同。对于Esri的这三个API,你只需熟悉其中之一,就可以在其他两个平台上进行开发。  所以,如果你没有学过ArcGIS API for Silverlight的话也没有关系,会了Windows Phone API,你也就学会了Silverlight API。 三、我们要完成的工作   在上一篇文章中,我们已经了解到,最终我们需要完成这么一个WP上的应用程序:连锁超市的老板出差在外,在机场候机的过程中想查看一下自己的几家店面最近的营业情况。传统的统计报表只能通过电子邮件发送给老板,他需要不停的查看自己的邮箱;而里面的内容既不直观也不易懂。将报表数据发布成地图服务,这样即可在任何时间任何地点访问业务数据,也可通过地图的方式充分挖掘数据的潜在价值。老板通过windows phone7上的地图应用,对自己店面近来营业情况一目了然,利用应用所提供的分析功能,即使在千里之外也能随时对自己的生意轻松经营。  好了,要了解的预备知识已经梳理完毕。有人可能说,都看了这么多了,还没进入动手阶段?我是希望大家每时每刻都知道我们在做什么,为什么要这么做,知其然也知其所以然。就跟听别人的PPT一样,对于我们不熟悉的内容,如果前面两页他交代不清楚,可能整个PPT就是在浪费我们的时间。凡事皆如此。

ArcGIS API for Windows Phone开发实例(0):为什么选择Windows Phone?

为什么要了解Mobile GIS?   GIS技术固然有自己独特的理论知识,但GIS的实际应用离不开IT技术,GIS应用的发展离不开主流IT技术的发展。上面这句话我们可以看做一条公理,公理是不需要证明的。GIS技术的应用,从C/S到B/S,从SOAP到REST,从SOA到云,都印证了这条公理。  从台式机到笔记本,从上网本到平板电脑和遍地开花的智能手机,移动不仅是IT技术的发展趋势之一,也是所有硬件的发展趋势。  综上所述,作为GISser的你,没有理由不了解Mobile GIS技术。 ArcGIS移动产品线   为什么要学习ArcGIS API for Windows Phone?从两个角度来回答:ArcGIS和Windows Phone。ArcGIS目前有5种移动产品,所有产品的介绍,帮助,下载详见这里。 ArcPad。这是一个开箱即用的软件产品,基于Windows Mobile平台,最新版本是ArcPad 10(支持Windows Mobile 6.5)。特点是数据采集精度高(可到分米级),支持并推荐采用完全离线作业方式,包含丰富的GIS功能,比如图形(有捕捉功能)/属性/符号编辑,图层管理等,界面类似ArcMap,适合GIS专业人员使用,可通过界面或脚本语言进行定制。由于推出早(历经5.X,6.X,7.0,7.1,8.0.10几个版本),功能实用而丰富,收到广大用户青睐,目前全球用户超过100,000。 ArcGIS Mobile。是目前ArcGIS应用最广的移动产品之一,基于Windows Mobile平台,最新版本是ArcGIS Mobile 10.0(支持Windows Mobile 6.5)。特点是拥有自己的离线缓存格式,可完全离线使用,也可与ArcGIS Server随时进行各种粒度的缓存同步;基于任务模式,由工作流驱动,非GIS人员可以很快上手;可进行离线数据编辑,属性/空间查询,外业人员协作等任务;具有丰富的定制功能,并提供功能全面的SDK可进行二次开发。软件历经9.2,9.3,9.3.1,10.0几个版本,在国内拥有广大的用户群体。 ArcGIS for iOS。包括一个开箱即用的应用程序(ArcGIS for iOS Application,可在App Store中免费下载)和提供二次开发功能的ArcGIS API for iOS。基于苹果公司的iOS系统,可在iPhone,iPad,iPod Touch产品上运行。最初于2010年4月发布,目前应用程序和API版本是1.8。 ArcGIS for Windows Phone。包括一个开箱即用的应用程序(ArcGIS for Windows Phone Application,可在MarketPlace中免费下载)和提供二次开发功能的ArcGIS API for Windows Phone。基于微软公司的Windows Phone系统,可在基于该系统的手机上运行。最初于2010年9月发布,目前应用程序和API版本是2.2 beta。 ArcGIS for Android。基于Google公司的Android系统。目前ArcGIS API for Android处于public beta阶段,可在ArcGIS Beta Community中免费申请试用。正式版推出后,应该也会有开箱即用的应用程序,照惯例可通过Android Market免费下载。最初与2010年10月内测,今年2月底开始公测。   以上三个产品(ArcGIS for iOS,ArcGIS for Windows Phone,ArcGIS … Continue reading ArcGIS API for Windows Phone开发实例(0):为什么选择Windows Phone? »

ArcGIS for iOS开发中Base SDK Missing的解决办法

      目前ArcGIS API for iOS的版本是1.0final,而它本身是用iOS SDK 4.0.2版本编译的,所以要求开发环境的iOS SDK是3.2或4版本以上。于是你按照要求,下载了最新的iOS SDK 4.2(November 22,2010)和ArcGIS API for iOS 1.0并安装之后,在XCode中按照ArcIGS模板新建一个简单的View-based ArcGIS Mapping Application,但这是会发现出现Base SDK Missing的编译错误。       Google一下,这个问题很普遍,解决办法就是Project->Edit Project Settings->Build标签页中的将默认的Base SDK从3.2版本选择成现有的iOS SDK 4.2。可这样依旧不能解决问题。关键还有一个步骤,Project->Set Active Target,选择成你现在的工程。尽管你会看到,Project->Set Active Target中只有你现在工程的名称,并且已经打钩了,但你仍然要用鼠标点击一下。       之后编译,便会在模拟器中看到HelloMap程序了。