有两个主要工作流可用于部署离线数据。 第一种是将数据复制到设备上的已知位置,然后使用 AppStudio Framework 确定存储位置。 第二种是在应用程序安装到设备上之后,将数据作为 Qt 资源捆绑到应用程序中,并将数据复制到已知位置。 本主题概述了每个工作流的步骤。
通过应用程序手动部署数据
要将数据手动部署到设备中,请执行以下步骤:
- 在 ArcGIS Pro 中创建 TPK、地理数据库、离线定位器和离线网络数据集。
- 在 QML 代码中引用这些文件时,请参阅存储数据的相对位置。
import ArcGIS.AppFramework 1.0 property string localTPK: AppFramework.userHomePath + "/ArcGIS/Runtime/data/Topographic.tpk"
- 在构建应用程序之前,请在侧面板中可访问的设置工具中,选择功能选项卡上的启用外部存储选项。
- 使用文件资源管理器应用程序将数据复制到指定的数据位置。
每个操作系统都有类似但略有不同的数据位置,如下所示:
- Android:Android/data/<your_app>/files/ArcGIS/Runtime/Data。
- iOS:<your_app>/Documents/ArcGIS/Runtime/Data。
- macOS:~/ArcGIS/Runtime/Data。
- Windows:%userprofile%\ArcGIS\Runtime\Data。
- Ubuntu:$HOME/ArcGIS/Runtime/Data。
通过确保数据存储在这些位置,并使用 AppFramework.userHomeFolder 函数,您可以确保您的应用程序能够在任何已部署的操作系统上读取和写入数据。
注:
如果您使用的是 iOS 设备,则必须使用 iOS 文件浏览器应用程序。在 macOS Catalina 10.15 或更高版本中,可以使用 Finder 作为文件浏览器。 在较早版本的 macOS 或 Windows 中,可以使用 iTunes 或其他文件浏览器应用程序。
将数据捆绑为 Qt 资源
虽然 Qt 支持从嵌入式资源读取,但 Esri 的基础 Runtime Core 并不支持此功能,因为它依赖于不支持 Qt 资源的标准 C I/O。 这意味着您可以将离线数据与应用程序进行捆绑部署,但需要将数据从嵌入式资源复制到设备的物理位置上。 AppStudio Framework 包含 copyFile 函数,该函数可将文件从嵌入式资源文件复制到物理位置。
要将您的数据与应用程序捆绑,请执行以下操作:
- 将 JavaScript 函数添加到应用程序中,应用程序会使用 copyFile 函数并返回输出数据的路径。
- 将组件的路径属性设置为等于执行复制的 JavaScript 函数。
当应用程序启动时,它将执行 copyFile 函数,且使用本地数据的组件将正确加载。
- 在构建应用程序之前,请在侧面板中转至设置 > 功能, 然后启用外部存储。
以下代码演示了将数据从嵌入式资源复制到物理位置。 您必须向工程中名为 Data 的子文件夹添加源文件(本示例中为 Topographic.tpk),以使此代码示例得以运行。
import QtQuick 2.7
import QtQuick.Controls 2.1
import ArcGIS.AppFramework 1.0
import Esri.ArcGISRuntime 100.8
App {
id: app
width: 640 * AppFramework.displayScaleFactor
height: 480 * AppFramework.displayScaleFactor
property string fileName: "Topographic.tpk"
property FileFolder sourceFolder: app.folder.folder("Data")
property FileFolder destFolder: AppFramework.userHomeFolder.folder("ArcGIS/Runtime/Data")
property string destPath: destFolder.filePath(fileName)
property url destUrl: destFolder.fileUrl(fileName)
function copyLocalData() {
destFolder.makeFolder();
sourceFolder.copyFile(fileName, destPath);
return destUrl;
}
MapView {
anchors.fill: parent
Map {
Basemap {
ArcGISTiledLayer {
url: copyLocalData()
}
}
}
}
}
此示例中每个平台的输出位置与上述通过应用程序手动部署数据部分列出的位置相同。 此工作流最适合处理小文件(例如,小型地理数据库或 TPK);出于性能原因,不推荐用于大型数据集。