두 가지 기본 워크플로를 사용하여 오프라인 데이터를 배포할 수 있습니다. 그 중 한 가지 옵션은 기기의 알려진 위치에 데이터를 복사한 다음 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 파일 브라우저 앱을 사용해야 합니다. Catalina macOS 버전 10.15 이상에서는 찾기를 파일 브라우저로 사용할 수 있습니다. macOS 이전 버전 또는 Windows에서는 iTunes 또는 다른 파일 브라우저 앱을 사용할 수 있습니다.
데이터를 Qt 리소스로 지정하여 번들로 포함
Qt를 사용할 때는 임베드된 리소스에서 데이터를 읽을 수 있지만 Esri의 기본 Runtime Core에서는 이러한 읽기가 지원되지 않습니다. Runtime Core는 Qt 리소스를 지원하지 않는 표준 C I/O를 사용하기 때문입니다. 즉, 오프라인 데이터를 배포용으로 앱과 함께 번들로 포함할 수는 있지만 해당 데이터를 임베드된 리소스에서 기기의 실제 위치로 복사해야 합니다. AppStudio Framework에는 임베드된 리소스 파일에서 실제 위치로 파일을 복사하는 copyFile 함수가 포함되어 있습니다.
앱과 함께 데이터를 번들로 포함하려면 다음을 수행하세요.
- copyFile 함수를 사용하며 결과 데이터의 경로를 반환하는 JavaScript 함수를 앱에 추가합니다.
- 컴포넌트의 경로 등록정보를 복사를 수행하는 JavaScript 함수와 동일하게 설정합니다.
앱을 실행하면 copyFile 함수가 실행되며 로컬 데이터를 사용하는 컴포넌트를 올바르게 불러옵니다.
- 앱을 만들기 전에 측면 패널에서 설정 > 기능으로 이동하여 외부 저장소를 활성화합니다.
다음 코드는 임베드된 리소스에서 실제 위치로 데이터를 복사하는 과정을 보여 줍니다. 이 샘플 코드가 작동되도록 하려면 원본 파일(이 샘플의 경우 Topographic.tpk)을 Data라는 하위 폴더의 프로젝트에 추가해야 합니다.
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와 같이 크기가 작은 파일에서 가장 효율적으로 작동합니다. 성능상의 이유로 대형 데이터셋에는 이 워크플로를 사용하지 않는 것이 좋습니다.