ArcGIS移动客户端业务数据离线方案的讨论Word格式.docx
- 文档编号:15966224
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:10
- 大小:809.69KB
ArcGIS移动客户端业务数据离线方案的讨论Word格式.docx
《ArcGIS移动客户端业务数据离线方案的讨论Word格式.docx》由会员分享,可在线阅读,更多相关《ArcGIS移动客户端业务数据离线方案的讨论Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
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<
System.Windows.Media.ImageSource>
onComplete)
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:
.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,'
19.
19:
stringc="
C"
20.
20:
c=String.Format("
col).PadLeft(8,'
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 移动 客户端 业务 数据 离线 方案 讨论