ArcGIS Runtime 100 SDK保存URL图层实现离线访问技术求助
我来帮你理清楚ArcGIS Runtime 100 SDK里离线保存图层数据的具体操作,其实核心是用**离线地图任务(OfflineMapTask)**或者针对单个图层的专属离线任务来实现,分两种常见场景给你拆解:
一、如果要保存整个地图(包含所有操作图层)
这种方式适合一次性把当前地图里的所有操作图层都离线化,步骤如下:
- 第一步:初始化离线地图任务
先获取你当前的地图实例,用它来创建OfflineMapTask对象:// Swift示例,C#/Java逻辑一致,语法略有差异 let offlineMapTask = OfflineMapTask(onlineMap: yourCurrentMap) - 第二步:生成离线地图参数
需要指定离线范围(比如当前地图视图的可见范围),还可以自定义哪些图层要包含进去、是否下载附件等:// 获取当前视图范围作为离线区域 let areaOfInterest = yourMapView.visibleArea.extent // 生成默认参数,也可以手动修改 let parameters = try! await offlineMapTask.makeDefaultGenerateOfflineMapParameters(areaOfInterest: areaOfInterest) // 只包含操作图层,忽略底图(如果不需要底图离线) parameters.layersToInclude = yourCurrentMap.operationalLayers - 第三步:执行离线下载任务
指定本地存储路径,启动任务并监听进度,完成后就能得到离线地图:// 选择应用有权限访问的存储目录,比如iOS的Documents let outputDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("MyOfflineMap") // 创建下载任务 let downloadJob = offlineMapTask.generateOfflineMap(with: parameters, downloadDirectory: outputDir) // 可选:监听进度,给用户显示进度条 downloadJob.progress.addObserver(self, forKeyPath: "fractionCompleted", options: .new, context: nil) // 启动任务 let result = try! await downloadJob.start() if result.isSuccessful { // 离线地图生成成功,加载到地图视图 yourMapView.map = result.offlineMap } else { // 处理错误,比如网络问题、权限不足 print("离线下载失败:\(result.error?.localizedDescription ?? "未知错误")") }
二、如果只需要保存单个操作图层
如果不需要整个地图,只想离线特定的某几个图层,可以针对不同图层类型用对应的离线任务:
1. 要素图层(FeatureLayer)
要素图层可以通过生成本地地理数据库来离线:
// 获取在线要素图层对应的服务要素表 let onlineFeatureTable = yourFeatureLayer.featureTable as! ServiceFeatureTable // 定义离线范围和参数 let areaOfInterest = yourMapView.visibleArea.extent let gdbParams = GenerateGeodatabaseParameters() gdbParams.geodatabaseExtent = areaOfInterest gdbParams.includeAttachments = true // 如果需要离线附件 // 指定本地地理数据库存储路径 let gdbUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("MyFeatureLayer.gdb") // 启动下载任务 let downloadJob = onlineFeatureTable.generateGeodatabase(with: gdbParams, downloadFileURL: gdbUrl) let result = try! await downloadJob.start() if result.isSuccessful { // 加载离线要素表并创建图层 let offlineFeatureTable = GeodatabaseFeatureTable(geodatabase: result.geodatabase, tableName: onlineFeatureTable.tableName) let offlineLayer = FeatureLayer(featureTable: offlineFeatureTable) // 添加到地图 yourCurrentMap.operationalLayers.add(offlineLayer) }
2. 切片图层(ArcGISTiledLayer)
切片图层需要用ExportTileCacheTask下载切片缓存:
let onlineTileLayer = yourTileLayer as! ArcGISTiledLayer // 初始化切片导出任务 let tileExportTask = ExportTileCacheTask(url: onlineTileLayer.url!) // 定义离线范围和缩放级别 let areaOfInterest = yourMapView.visibleArea.extent let tileParams = try! await tileExportTask.makeDefaultExportTileCacheParameters(areaOfInterest: areaOfInterest, minScale: onlineTileLayer.minScale, maxScale: onlineTileLayer.maxScale) // 指定切片缓存存储路径(.tpkx格式) let tileCacheUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("MyTiles.tpkx") // 启动下载任务 let downloadJob = tileExportTask.exportTileCache(with: tileParams, downloadFileURL: tileCacheUrl) let result = try! await downloadJob.start() if result.isSuccessful { // 加载离线切片图层 let offlineTileLayer = ArcGISTiledLayer(tileCache: result.tileCache) yourCurrentMap.operationalLayers.add(offlineTileLayer) }
三、关键注意事项
- 服务权限检查:确保你要离线的在线服务支持离线功能——要素服务需要启用「允许生成地理数据库」,切片服务需要支持「导出切片缓存」,否则会下载失败。
- 认证处理:如果服务需要登录,要先通过
AuthenticationManager添加凭证,比如用户名密码或OAuth令牌。 - 存储权限:要选择应用有权限读写的目录,比如Android的内部存储、iOS的Documents目录,避免因权限不足导致保存失败。
- 进度提示:离线下载可能耗时较长(尤其是大区域或高分辨率切片),建议给用户显示进度条或加载提示,提升体验。
内容的提问来源于stack exchange,提问作者Parv Bhasker
相关产品推荐
相关产品推荐

