You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:12:45