文档详情

arcgis移动客户端几种离线地图的加载方案

公****
实名认证
店铺
DOCX
929.16KB
约9页
文档ID:393053746
arcgis移动客户端几种离线地图的加载方案_第1页
1/9

移动 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:protectedoverridevoidGetTileSource(int level, int row, int col,ActiononComplete)2:{3:string f = string.Empty;4:if (_cacheTileFormat.ToLower.Contains(“png“))5:f“=.png“;6:elseif (_cacheTileFormat.ToLower.Contains(“jpeg“) ||_cacheTileFormat.ToLower.Contains(“jpg“))7:8:elsef“=.jpg“;9:thrownew Exception(“切片格式不明:“ + _cacheTileFormat);10:#region Exploded 读取11:if (_storageFormat == StorageFormat.esriMapCacheStorageModeExploded)12:{13:stringbaseUrl = _path;// “/WP_LocalCacheReader;component/Assets/usa_exploded/“ 14:baseUrl += @“/_alllayers“;15:string l = “L“;16:17:string r = “R“; 18:19:string c = “C“;20:l = level.ToString.PadLeft(”20,”);r = String.Forma“t{(0:X}“, row).PadLeft(8, ”0”);c = String.Forma“t{(0:X}“, col).PadLeft(8, ”0”);21:stringstr = baseUrl22: @“+/L“ + l23: @“+/R“ + r24: @“+/C“ + c + f;25:BitmapImageimg = newBitmapImage(new Uri(str,UriKind.RelativeOrAbsolute))26:{27:CreateOptions = BitmapCreateOptions.DelayCreation28:};29:img.ImageFailed += (s, a) =>30:{31:stringuri = _path + “/missing“ + _tileRows.ToString + f;32:BitmapImage image = newBitmapImage(new Uri(uri, UriKind.RelativeOrAbsolute))33:{34:CreateOptions = BitmapCreateOptions.DelayCreation35:36:onComplete(image); 37:return;};38: };39:onComplete(img);40:41:#endregion}42:}当指定的切片文件不存在〔或许还未创立〕时,可以加载事先预备好的missing 图片来替换。

2、ArcGIS Server 地图效劳的 Compact 格式缓存文件这是 ArcGIS Server 10 推出的的缓存格式,缓存图片都保存在.bundle 文件中,一个 bundle 目前可存储 128*128 张切片切片文件更少,主要目的是为了迁移便利文档中并未给出读取这种格式文件的方法,不过牛魔王已经凭空推断出了这种格式的内容,这里就借鉴了他的方法还是先将缓存文件拷贝到中:利用 conf.cdi 和 conf.xml 获得 tiling scheme,之后重写 GetTileSource 方法具体思路牛魔王文中已经给出,感兴趣的同学还是看原文,学习牛牛的思路比较好下面是读取两种缓存文件的效果:3、第三方离线地图文件除了 ArcGIS Server 的缓存切片之外,我们还可以读取第三方的离线地图文件来做为我们的底图比方以前面介绍过的 Mobile Atlas Creator 为例,我现在已经有了很多自己下载好的离线地图,假设能在 ArcGIS 移动客户端使用起步两全其美?其实在目前的离线导航软件中,很多都用 sqlite 数据库做为地图存储格式,由于它应用广泛,轻松,紧凑,Android,iOS,Symbian 等系统对它都有原生的支持。

Mobile Atlas Creator 中,RMaps 和 OruxMaps 都用 Sqlite 保存离线地图这里以应用较为广泛的 RMaps 格式为例,进展试验创立好的 RMaps 地图文件如下:我们利用 FireFox 里的 Sqlite Manager 插件先来查看一下数据库的内容:可以看出,我们所需的内容都保存在tiles 这张表中,而x,y,z 三个参数与我们所需的 row,col,level 很像经过试验〔保存一个全球范围的地图〕, 很快验证出 level=17-z参数有了,要如何读取切片呢?对于 Sqlite,虽然目前 Windows Phone 还没有供给原生的支持,不过 codeplex 上已经有不少工程都供给了解决方法我选择 Sqlite Client for Windows Phone 来读取 RMaps 的地图文件下面是 RMaps 离线地图〔Bing Maps〕和 ArcGIS Online 上 StreetMap 叠加的效果:需要说明的是,不管是 RMaps 还是 OruxMaps,都没有在数据库中保存 tiling scheme 的相关参数,所以我们不能为图层供给诸如FullExtent 之类的参数。

但这丝毫不影响我们的使用,我们可以为 Map 控件显示指定 Extent,这样就可以直接显示我们的离线地图了除了自己的地图数据之外,根本上全部数据源都使用一种空间参考,102100 或者 3857,你懂的这样即使我们没有 ArcGIS Server 软件,也能制作自己的底图了这里有网友们已经下载好的各个城市的 RMaps 格式文件相对于 RMaps 之类的离线地图软件,ArcGIS 的移动产品的优势除了不仅能够任意叠加地图数据,还有 GraphicsLayer 和效劳器端强大的功能支持,在协作Windows Phone 本身的 SDK 功能,你也可以做出一个功能全面的导航软件来关于离线地图文件的打包1、在 Silverlight 程序中,Build Action 的选择打算了文件最终的保存位置,比方你选择 Resource,则会嵌入到工程的 dll 中,假设选择 Content,则会保存在 dll 之外,xap 文件之内以上三种解决方案里,我们可以选择任意的 Build Action,这样地图都会通过 xap 部署到里;假设有需要,。

下载提示
相似文档
正为您匹配相似的精品文档