ArcGIS移动客户端业务数据离线方案的讨论.docx
- 文档编号:3055279
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:10
- 大小:809.69KB
ArcGIS移动客户端业务数据离线方案的讨论.docx
《ArcGIS移动客户端业务数据离线方案的讨论.docx》由会员分享,可在线阅读,更多相关《ArcGIS移动客户端业务数据离线方案的讨论.docx(10页珍藏版)》请在冰豆网上搜索。
ArcGIS移动客户端业务数据离线方案的讨论
ArcGIS移动客户端离线底图的几种解决方案
移动GIS中,通常将数据分为两大类:
basemaplayer和operationallayer。
前者是指漫游或导航时起参考作用的图层,这些图层内容通常不会变化,只起到视觉辅助作用,称为底图图层;后者是指存储GIS数据的图层,比如可通过这些图层来提供属性/空间查询操作,或者对其内容进行编辑,然后与服务器端进行同步,称为业务图层。
目前ArcGIS移动产品有5种,基于WindowsMobile平台的ArcPad和ArcGISMobile,这两个产品已经很成熟了,都有各自的离线缓存格式,其中ArcGISMobile从10版本开始,可以直接读取ArcGISServer缓存地图服务的切片文件做为basemaplayer,支持exploded和compact两种格式。
$q9l.T8e9l!
k'{ 相对于以上两个老牌移动产品,三个刚出道的小弟ArcGISforiOS,ArcGISforAndroid和ArcGISforWindowsPhone就走了不同路线:
依赖于ArcGISServer的REST服务。
因此几乎所有操作,包括显示地图,都需要用到ArcGISServer发布的各种服务。
这三个产品的离线功能将来肯定是会有的,但具体的时间表还无法确定。
针对ArcGISforiOS/Android/WindowsPhone,本文提出3种可行的离线底图(basemaplayer)的解决方案,供各位参考。
以ArcGISforWindowsPhone为例。
1、ArcGISServer地图服务的Exploded格式缓存文件
ArcGISAPIforWindowsPhone中,提供了ArcGISTiledMapServiceLayer用来加载ArcGISServer发布的缓存地图服务,它的原理是Map控件计算好需要加载的切片的row,col,level参数,利用ArcGISTiledMapServiceLayer里的GetTileUrl方法提供如何获得指定参数的切片文件,最后拼接成完整的地图。
0]&@.V!
E!
K&T 因此我们可以通过继承ArcGISTiledMapServiceLayer的父类,TiledMapServiceLayer或TiledLayer,来实现自己的自定义图层,比如用它来加载GoogleMaps,天地图等各种地图。
加载这些在线地图都是通过重写GetTileUrl()方法来实现的。
N6v$c q/o6l5L(H
对于已经存放在硬盘上的缓存文件,该如何加载呢?
这几个图层还有一个方法,GetTileSource。
这个方法有一个onCompleteaction,可以传入ImageSource类型的参数,它比GetTileUrl来的更直接。
其实GetTileSource方法中调用了GetTileUrl方法的结果(一个获得tile的url字符串),利用这个字符串向服务器端发送请求,请求回来的结果就是切片图片的二进制流,再将这个二进制流形成ImageSource,通过onComplete方法返回。
J&H%Z-x,x)z 所以我们可以抛开GetTileUrl,直接重写GetTileSource方法,来根据row,col,level参数,读取地图服务的缓存文件。
首先将Exploded格式的地图服务缓存文件拷贝到手机中:
包含conf.cdi(ArcGISServer10版本中才有,记录了缓存的全图范围)和conf.xml文件的好处是,我们可以在代码中读取这两个文件来动态生成我们的TilingScheme,以完成图层初始化的工作。
从配置文件中读取参数后,就可以重写GetTileSource方法了。
部分代码如下:
1. 1:
protectedoverridevoidGetTileSource(intlevel,introw,intcol,Action
2. 2:
{
3. 3:
stringf=string.Empty;
4. 4:
if(_cacheTileFormat.ToLower().Contains("png"))
5. 5:
f=".png";
6. 6:
elseif(_cacheTileFormat.ToLower().Contains("jpeg")||_cacheTileFormat.ToLower().Contains("jpg"))
7. 7:
f=".jpg";
8. 8:
else
9. 9:
thrownewException("切片格式不明:
"+_cacheTileFormat);
10. 10:
#regionExploded读取
11. 11:
if(_storageFormat==StorageFormat.esriMapCacheStorageModeExploded)
12. 12:
{
13. 13:
stringbaseUrl=_path;//"/WP_LocalCacheReader;component/Assets/usa_exploded/"
14. 14:
baseUrl+=@"/_alllayers";
15. 15:
stringl="L";
16. 16:
l=level.ToString().PadLeft(2,'0');
17. 17:
stringr="R";
18. 18:
r=String.Format("{0:
X}",row).PadLeft(8,'0');
19. 19:
stringc="C";
20. 20:
c=String.Format("{0:
X}",col).PadLeft(8,'0');
21. 21:
stringstr=baseUrl
22. 22:
+@"/L"+l
23. 23:
+@"/R"+r
24. 24:
+@"/C"+c+f;
25. 25:
BitmapImageimg=newBitmapImage(newUri(str,UriKind.RelativeOrAbsolute))
26. 26:
{
27. 27:
CreateOptions=BitmapCreateOptions.DelayCreation
28. 28:
};
29. 29:
img.ImageFailed+=(s,a)=>
30. 30:
{
31. 31:
stringuri=_path+"/missing"+_tileRows.ToString()+f;
32. 32:
BitmapImageimage=newBitmapImage(newUri(uri,UriKind.RelativeOrAbsolute))
33. 33:
{
34. 34:
CreateOptions=BitmapCreateOptions.DelayCreation
35. 35:
};
36. 36:
onComplete(image);
37. 37:
return;
38. 38:
};
39. 39:
onComplete(img);
40. 40:
}
41. 41:
#endregion
42. 42:
}
当指定的切片文件不存在(也许还未创建)时,可以加载事先准备好的missing图片来替换。
2、ArcGISServer地图服务的Compact格式缓存文件
这是ArcGISServer10推出的新的缓存格式,缓存图片都保存在.bundle文件中,一个bundle目前可存储128*128张切片。
切片文件更少,主要目的是为了迁移方便。
文档中并未给出读取这种格式文件的方法,不过牛魔王已经凭空推断出了这种格式的内容,这里就借鉴了他的方法。
还是先将缓存文件拷贝到手机中:
3z&u$@5g)l(b*F8C$e
利用conf.cdi和conf.xml获得tilingscheme,之后重写GetTileSource方法。
具体思路牛魔王文中已经给出,感兴趣的同学还是看原文,学习牛牛的思路比较好。
/r2r1g8e.I7Q"_5`/s"n1B(]
下面是读取两种缓存文件的效果:
2M$U n"A:
E7q
3、第三方离线地图文件 除了ArcGISServer的缓存切片之外,我们还可以读取第三方的离线地图文件来做为我们的底图。
比如以前面介绍过的MobileAtlasCreator为例,我现在已经有了很多自己下载好的离线地图,如果能在ArcGIS移动客户端使用起步两全其美?
其实在目前的离线导航软件中,很多都用sqlite数据库做为地图存储格式,因为它应用广泛,轻巧,紧凑,Android,iOS,Symbian等系统对它都有原生的支持。
MobileAtlasCreator中,RMaps和OruxMaps都用Sqlite保存离线地图。
这里以应用较为广泛的RMaps格式为例,进行试验。
:
T4M2e"N7t
创建好的RMaps地图文件如下:
9H3`:
l9V9C*K4l
我们利用FireFox里的SqliteManager插件先来查看一下数据库的内容:
可以看出,我们所需的内容都保存在tiles这张表中,而x,y,z三个参数与我们所需的row,col,level很像。
经过试验(保存一个全球范围的地图),很快验证出level=17-z。
6x(K;G)y5Y)t"I8Z 参数有了,要如何读取切片呢?
对于Sqlite,虽然目前WindowsPhone还没有提供原生的支持,不过codeplex上已经有不少项目都提
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ArcGIS 移动 客户端 业务 数据 离线 方案 讨论
![提示](https://static.bdocx.com/images/bang_tan.gif)