版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ArcGIS移动客户端离线底图的几种解决方案移动GIS中,通常将数据分为两大类:basemap layer和operational layer。前者是指漫游或导航时起参考作用的图层,这些图层内容通常不会变化,只起到视觉辅助作用,称为底图图层;后者是指存储GIS数据的图层,比如可通过这些图层来提供属性/空间查询操作,或者对其内容进行编辑,然后与服务器端进行同步,称为业务图层。目前ArcGIS移动产品有5种,基于Windows Mobile平台的ArcPad和ArcGIS Mobile,这两个产品已经很成熟了,都有各自的离线缓存格式,其中ArcGIS Mobile从10版本开始,可以直接读取Arc
2、GIS Server缓存地图服务的切片文件做为basemap layer,支持exploded和compact两种格式。$ q9 l. T8 e9 l! k 相对于以上两个老牌移动产品,三个刚出道的小弟ArcGIS for iOS,ArcGIS for Android和ArcGIS for Windows Phone就走了不同路线:依赖于ArcGIS Server的REST服务。因此几乎所有操作,包括显示地图,都需要用到ArcGIS Server发布的各种服务。这三个产品的离线功能将来肯定是会有的,但具体的时间表还无法确定。针对ArcGIS for iOS/Android/Windows Ph
3、one,本文提出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方法提供如何获得指定参数的切片文件,最后拼接成完整的地图。0
4、& . V! E! K& T因此我们可以通过继承ArcGISTiledMapServiceLayer的父类,TiledMapServiceLayer或TiledLayer,来实现自己的自定义图层,比如用它来加载Google Maps,天地图等各种地图。加载这些在线地图都是通过重写GetTileUrl()方法来实现的。N6 v$ cq/ o6 l5 L( H对于已经存放在硬盘上的缓存文件,该如何加载呢?这几个图层还有一个方法,GetTileSource。这个方法有一个onComplete action,可以传入ImageSource类型的参数,它比GetTileUrl来的更直接。其实GetTil
5、eSource方法中调用了GetTileUrl方法的结果(一个获得tile的url字符串),利用这个字符串向服务器端发送请求,请求回来的结果就是切片图片的二进制流,再将这个二进制流形成ImageSource,通过onComplete方法返回。J& H% Z- x, x) z所以我们可以抛开GetTileUrl,直接重写GetTileSource方法,来根据row,col,level参数,读取地图服务的缓存文件。首先将Exploded格式的地图服务缓存文件拷贝到手机中:包含conf.cdi(ArcGIS Server 10版本中才有,记录了缓存的全图范围)和conf.xml文件的好处是,我们可以
6、在代码中读取这两个文件来动态生成我们的Tiling Scheme,以完成图层初始化的工作。从配置文件中读取参数后,就可以重写GetTileSource方法了。部分代码如下:1. 1: protected override void GetTileSource(int level, int row, int col, Action onComplete)2. 2: 3. 3: string f = string.Empty;4. 4: if (_cacheTileFormat.ToLower().Contains(png)5. 5: f = .png;6. 6: else if (_cacheT
7、ileFormat.ToLower().Contains(jpeg) | _cacheTileFormat.ToLower().Contains(jpg)7. 7: f = .jpg;8. 8: else9. 9: throw new Exception(切片格式不明: + _cacheTileFormat);10. 10: #region Exploded读取11. 11: if (_storageFormat = StorageFormat.esriMapCacheStorageModeExploded)12. 12: 13. 13: string baseUrl = _path;/ /W
8、P_LocalCacheReader;component/Assets/usa_exploded/14. 14: baseUrl += /_alllayers;15. 15: string l = L;16. 16: l = level.ToString().PadLeft(2, 0);17. 17: string r = R;18. 18: r = String.Format(0:X, row).PadLeft(8, 0);19. 19: string c = C;20. 20: c = String.Format(0:X, col).PadLeft(8, 0);21. 21: string
9、 str = baseUrl22. 22: + /L + l23. 23: + /R + r24. 24: + /C + c + f;25. 25: BitmapImage img = new BitmapImage(new Uri(str,UriKind.RelativeOrAbsolute)26. 26: 27. 27: CreateOptions = BitmapCreateOptions.DelayCreation28. 28: ;29. 29: img.ImageFailed += (s, a) =30. 30: 31. 31: string uri = _path + /missi
10、ng + _tileRows.ToString() + f;32. 32: BitmapImage image = new BitmapImage(new Uri(uri, UriKind.RelativeOrAbsolute)33. 33: 34. 34: CreateOptions = BitmapCreateOptions.DelayCreation35. 35: ;36. 36: onComplete(image);37. 37: return;38. 38: ;39. 39: onComplete(img);40. 40: 41. 41: #endregion42. 42: 当指定的
11、切片文件不存在(也许还未创建)时,可以加载事先准备好的missing图片来替换。2、ArcGIS Server地图服务的Compact格式缓存文件这是ArcGIS Server 10推出的新的缓存格式,缓存图片都保存在.bundle文件中,一个bundle目前可存储128*128张切片。切片文件更少,主要目的是为了迁移方便。文档中并未给出读取这种格式文件的方法,不过牛魔王已经凭空推断出了这种格式的内容,这里就借鉴了他的方法。还是先将缓存文件拷贝到手机中:3 z& u$ 5 g) l( b* F8 C$ e利用conf.cdi和conf.xml获得tiling scheme,之后重写GetTil
12、eSource方法。具体思路牛魔王文中已经给出,感兴趣的同学还是看原文,学习牛牛的思路比较好。/ r2 r1 g8 e. I7 Q _5 / s n1 B( 下面是读取两种缓存文件的效果:2 M$ Un A: E7 q3、第三方离线地图文件除了ArcGIS Server的缓存切片之外,我们还可以读取第三方的离线地图文件来做为我们的底图。比如以前面介绍过的Mobile Atlas Creator为例,我现在已经有了很多自己下载好的离线地图,如果能在ArcGIS移动客户端使用起步两全其美?其实在目前的离线导航软件中,很多都用sqlite数据库做为地图存储格式,因为它应用广泛,轻巧,紧凑,Andro
13、id,iOS,Symbian等系统对它都有原生的支持。Mobile Atlas Creator中,RMaps和OruxMaps都用Sqlite保存离线地图。这里以应用较为广泛的RMaps格式为例,进行试验。: T4 M2 e N7 t创建好的RMaps地图文件如下:9 H3 : l9 V9 C* K4 l我们利用FireFox里的Sqlite Manager插件先来查看一下数据库的内容: 可以看出,我们所需的内容都保存在tiles这张表中,而x,y,z三个参数与我们所需的row,col,level很像。经过试验(保存一个全球范围的地图),很快验证出level=17-z。6 x( K; G) y
14、5 Y) t I8 Z参数有了,要如何读取切片呢?对于Sqlite,虽然目前Windows Phone还没有提供原生的支持,不过codeplex上已经有不少项目都提供了解决办法。我选择Sqlite Client for Windows Phone来读取RMaps的地图文件。下面是RMaps离线地图(Bing Maps)和ArcGIS Online上StreetMap叠加的效果:) A0 |8 V8 i5 k/ D% f8 e5 k/ Y* 9 O需要说明的是,不论是RMaps还是OruxMaps,都没有在数据库中保存tiling scheme的相关参数,所以我们不能为图层提供诸如FullExt
15、ent之类的参数。但这丝毫不影响我们的使用,我们可以为Map控件显示指定Extent,这样就可以直接显示我们的离线地图了。除了自己的地图数据之外,基本上所有数据源都使用一种空间参考,或者3857,你懂的。/ f: ?9 J* B4 W2 w9 + * p这样即使我们没有ArcGIS Server软件,也能制作自己的底图了。这里有网友们已经下载好的各个城市的RMaps格式文件。# M6 : J相对于RMaps之类的离线地图软件,ArcGIS的移动产品的优势除了不仅能够任意叠加地图数据,还有GraphicsLayer和服务器端强大的功能支持,在配合Windows Phone本身的SDK功能,你也可
16、以做出一个功能全面的导航软件来。关于离线地图文件的打包。1、在Silverlight程序中,Build Action的选择决定了文件最后的保存位置,比如你选择Resource,则会嵌入到工程的dll中,如果选择Content,则会保存在dll之外,xap文件之内。以上三种解决方案里,我们可以选择任意的Build Action,这样地图都会通过xap部署到手机里;如果有需要,我们还可以将文件拷贝到程序的IsolatedStorage中去。2、对于Exploded格式的缓存,WP的编程建议中提到,媒体文件Build Action设为Content效率会更高。3、对于Exploded格式的缓存,如果
17、为了拷贝方便,我们也可以将其打包为.zip文件,部署到手机中,在程序加载的时候再将其解压缩来读取。6 F3 x+ S& M4 S# k: H本文以ArcGIS for Windows Phone为例,讨论了3种离线底图的解决方案,文中所涉及的所有功能,ArcGIS for iOS和ArcGIS for Android同样适用。ArcGIS移动客户端业务数据离线方案的讨论我们知道对于移动GIS来说,数据主要分为两种类型:底图数据(basemap layers)和业务数据(operational layers)。在ArcGIS移动客户端离线底图的几种解决方案一文中,已经讨论了ArcGIS for
18、iOS/Windows Phone/Android三种客户端底图离线的方案和解决办法,本文中则来讨论一下业务数据离线的可能性。首先我们得考虑一下业务数据离线的实际需求。以成熟的ArcGIS Mobile产品为例,它拥有完整的离线缓存(MobileCache)。而ArcGIS新的移动客户端中,目前均以在线服务数据为基础,没有离线数据的存储格式,因此我们首先得解决如何存储离线业务数据这个问题。我想到的格式有四种:json文本,shapefile,Sqlite,和Spatialite。因为这四种格式均已少量文件形式存在,且对空间数据有不同程度的支持,比较适合移动平台利用。对于MobileCache的
19、使用,最常见的需求有两种,一种是数据采集(增/删/改),另一种是对离线数据的查询和分析。我们来分别考虑这两种需求。一、数据采集ArcGIS for iOS/Windows Phone/Android三种移动客户端中,在线的数据采集和同步是通过FeatureLayer+FeatureService的方式来完成的。而离线的情况下,没有了FeatureService的支持,我们主要通过GraphicsLayer或FeatureLayer来完成数据的采集工作。需要考虑两个问题,一个是离线数据的获取(比如需要编辑已有图形的属性数据),另一个是离线数据的提交(将改动同步回服务器数据库中)。而在离线数据获取
20、之后,提交之前的这段时间内,就需要以某种格式来支持数据的编辑。ArcGIS客户端API在2.0版本后,提供了Editor类,可以很容易完成对GraphicsLayer的图形编辑,属性编辑就不用多说了。比如ArcGIS API for Windows Phone中,我们就可以用同样的思路来完成离线编辑过程。这就是我们离线数据采集的思路。3 k6 h0 ; m$ hjson文本格式。esri在REST API中定义了自己的基于json的数据存储方式,包括空间和属性数据。通过FeatureLayer加载在线服务,将其中所有的要素通过通过ToJson方法(或FeatureSet.ToJson()保存为
21、json文本格式,就完成了数据的下载工作;离线后,可通过GraphicsLayer来加载这些json文本数据(FeatureSet.FromJson(),使用Editor类对其图形和属性进行编辑,或对新增数据进行采集。完成后,就得到了一个经过编辑的json文本;之后网络条件允许时,再次通过在线FeatureLayer的方式,将编辑后的json数据加载,利用FeatureService同步回服务器端。此方法对于iOS API和Windows Phone API可直接适用,Android API在正式版发布后应该会完善其对json格式的支持。7 0 N; N$ P) q1 zshapefile格式
22、。由于shapefile格式公开,有许多现成的类库提供了支持,因此可以考虑将它作为离线数据的载体。离线数据的获取非常方便,只需在服务器将数据导出为shapefile格式,即可分发到移动设备上。而在移动设备上加载shapefile,绘制成GraphicsLayer,每个平台都可以找找现成的类库来使用,Windows Phone见这里,iOS见这里;依然利用Editor类对GraphicsLayer的数据进行编辑和采集;最后需要将GraphicsLayer的数据写回shapefile中。之后回到室内,可将shapefile再倒入服务器数据库中。关于.NET中可供参考的几个包含Shapefile读写
23、功能的库:sharpmapv2,egis,NetTopologySuite等。 S Spatialite数据库。Spatialite是基于Sqlite的一个C语言库,支持空间数据操作的单文件数据库(类似于Postgresql+PostGIS),支持WKT,WKB和自己的三种空间数据格式,此外通过PROJ.4支持动态投影,还支持Buffer,Union等空间操作,是移动平台上空间数据存储的理想选择。编辑和采集依然通过GraphicsLayer和Editor类来完成。但和上面的shapefile一样,数据的获取和提交需要做转换工作。7 & o. 0 e) B4 M; M) Sqlite数据库。把它
24、放在最后有两方面原因。一是在离线方案的讨论中,我们已经知道几乎每个移动平台上对Sqlite数据库都有很好的支持;二是它本身并不支持空间数据格式,所以不仅要进行格式转换,还要自己来解决空间数据的存储。但对于在不支持Spatialite的移动平台上又想使用数据库来管理数据的情况,可以考虑Sqlite。此处就不详细讨论了。对于数据采集这个需求,四种数据格式从理论上均可很好地支持。API中对json方式的读写有原生的支持,因此不需要进行任何格式转换;而后三种存储均需要自己来完成与Graphic的数据转换工作。总的来说,由于移动数据采集工作一般携带的业务数据量较少,因此用json文本来存储数据比较方便,也非常容易实现。二、查询和分析离线的业务数据,经常需要进行一些属性查询工作,除此之外,还有空间的查询和简单的几何运算或关系判断。在ArcGIS Mobile的离线缓存中,这些功能都提供了很好的支持,但ArcGIS for iOS/Windows Phone/Android中,上述需求都是通过各种Task配合在线服务来完成的,上不支持离线功能。/ * A& E) P. H8 R& B6 Qjson文本格式。对于这种格式,在加载为GraphicsLayer后,我们可以利用Linq语言来进行类似属性查询工作,但空间查询及分析工作无法完成。Shape
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江汉大学《行进管乐训练》2024-2025学年第二学期期末试卷
- 2026云南省昆明市寻甸县融媒体中心招聘1人笔试模拟试题及答案解析
- 《中国消防》杂志社招聘1人考试参考试题及答案解析
- 2026年宣城市人民医院(皖南医学院附属宣城医院)高层次人才招聘笔试备考题库及答案解析
- 2026福建厦门市集美区侨英小学产假顶岗教师招聘1人考试参考题库及答案解析
- 2026广东佛山市顺德区华南师范大学附属北滘学校招聘临聘教师笔试模拟试题及答案解析
- 修改完善内部管理制度
- 华为内部提建议制度
- 企业内部三项制度
- 保安内部品质部管理制度
- 质量文化建设的重要性
- 中信建投笔试题库及答案
- 2026年江苏航空职业技术学院单招综合素质考试必刷测试卷必考题
- GB/T 26951-2025焊缝无损检测磁粉检测
- RTAF 009-2024 终端智能化分级研究报告
- 医院人事科人事专员笔试题库及答案解析
- 2025-2030中国沿海港口液体化工码头运营与布局规划报告
- 《国家十五五规划纲要》全文
- 2025年护士长选拔理论考核试题及答案
- 养老院护理流程培训
- 2026年黑龙江旅游职业技术学院单招职业倾向性考试必刷测试卷必考题
评论
0/150
提交评论