Work with offline data

Consider taking individual layers offline as offline data if you want to construct the map or scene yourself and provide users with up-to-date information from ArcGIS Online or ArcGIS Enterprise. This topic describes how to generate and download offline data to use the following layers offline:

You can export and download tiled layer caches locally and access them while your device is offline. It is important to note that you cannot edit tiled layer data (vector tiled data and image tiled data). If you require updates to the tiled layer data, you must export and download them again.

Feature and annotation layers

You can take features (including annotation, related records, and attachments) offline, from a feature service, by downloading them to geodatabase feature tables within a mobile geodatabase. To do this, the feature service must be hosted on ArcGIS Enterprise 10.2.2 or later for features or from a service hosted in ArcGIS Online, provided that the feature service has been sync enabled (allow disconnected editing with synchronization).

You can use an existing feature service or create features services for your own data. To enable sync for a feature service, do the following:

  • ArcGIS Online — Edit the feature service item and check the Sync check box.
  • ArcGIS Enterprise — See Prepare data for offline use in the ArcGIS Server documentation.

To create the mobile geodatabase, you must do the following:

  1. Generate geodatabase parameters and define the area of interest, the layers, any expression filters, and so on, if required.
  2. Create the geodatabase, populate it with all the relevant features, and download it to the user's device.

Generate geodatabase parameters

When you create a mobile geodatabase, you must provide a set of parameters, described below, to define exactly which data is downloaded.

  • The geographical area of interest. You typically supply the area of interest as an extent (in other words, an envelope) but point, line, and polygon (including multipart) geometries are also supported. This allows you to create more detailed areas of interest. Regardless of the geometry, any features that intersect with the supplied area of interest are extracted.
  • The spatial reference of the mobile geodatabase.
  • Individual layers can be managed using the GenerateGeodatabaseParameters::layerOptions property:
    • Determine which layers are included in the mobile geodatabase.
    • Subset the features by providing an expression that filters features by attribute values, such as ZONE = 'COM'.
    • The synchronization model controls how edits made to the mobile geodatabase are applied back to the feature service during synchronization. The model supported is defined by the data that was used to create the sync-enabled feature service. If the data is nonversioned, the synchronization model is per layer. This is the most flexible model, allowing you to synchronize on a layer-by-layer basis, based on the layers you specify. If the data is versioned, the synchronization model is per geodatabase. This synchronizes the entire geodatabase, including all layers and tables, at once.
    • Specify whether to include feature attachments in the mobile geodatabase and whether they can be uploaded during synchronization.
    • Identify whether tables related to the layer are also included in the geodatabase.

You can obtain a default set of parameters ( GenerateGeodatabaseParameters ) using the createDefaultGenerateGeodatabaseParameters method on the GeodatabaseSyncTask . If you provide the area of interest, the default parameters will be generated taking into account the capabilities supported by the ArcGIS feature service. You can update these default parameter values before creating the geodatabase.

Create the geodatabase

Obtain a job to generate and download the geodatabase by passing the GenerateGeodatabaseParameters to the GeodatabaseSyncTask::generateGeodatabase() method on the GeodatabaseSyncTask class. Run the job to generate and download the geodatabase to the device.

Use dark colors for code blocksCopy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
void CreateOfflineLayer::setupOfflineLayerTask()
{
    // Create the task to generate the offline geodatabase
    m_task = new GeodatabaseSyncTask(m_featureServiceUrl, this);
     // After the task loads, get the default parameters for generating a geodatabase
    connect(m_task, &GeodatabaseSyncTask::doneLoading, this, [this](Error error)
    {
        if (!error.isEmpty())
        {
            qDebug() << "Error loading GeodatabaseSyncTask:" << error.message() << ":" << error.additionalMessage();
        }
        else
        {
            Envelope extent = m_map->initialViewpoint().targetGeometry().extent();
            m_task->createDefaultGenerateGeodatabaseParameters(extent);
        }
    });
     // When the default parameters come back from the service, get ready to
    // generate the offline geodatabase
    connect(m_task, &GeodatabaseSyncTask::defaultGenerateGeodatabaseParametersCompleted,
            this, [this](QUuid, GenerateGeodatabaseParameters parameters)
    {
        generate(parameters);
    });
     m_task->load();
}
 void CreateOfflineLayer::generate(GenerateGeodatabaseParameters params)
{
    // Set some options to non-default values that reflect the layers
    // (and selected features within layers) we want in the geodatabase
    GenerateLayerOption marineAnimalLayerOption;
    marineAnimalLayerOption.setLayerId(0);
    marineAnimalLayerOption.setWhereClause(QString("type = 11"));  // dolphins only
    GenerateLayerOption birdLayerOption;
    birdLayerOption.setLayerId(1);
    params.setLayerOptions(QList {marineAnimalLayerOption, birdLayerOption});
     // We want to support per-layer sync with this geodatabase
    params.setSyncModel(SyncModel::Layer);
    // We don't need attachments from the service in the geodatabase
    params.setReturnAttachments(false);
     // Create the job and start it. Output geodatabase goes into a specified file.
    m_job = m_task->generateGeodatabase(params, m_pathToGeodatabaseFile);
     connect(m_job, &GenerateGeodatabaseJob::jobDone, this, [this]()
    {
        if (!m_job->error().isEmpty())
        {
            qDebug() << "Job completed with error:" << m_job->error().message() << ":" << m_job->error().additionalMessage();
        }
        else
        {
            qDebug() << "Job complete, geodatabase at " << m_pathToGeodatabaseFile;
        }
    });
     connect(m_job, &GenerateGeodatabaseJob::errorOccurred, this, [this](Error error)
    {
        if (!error.isEmpty())
        {
            qDebug() << "Error running job:" << error.message() << ":" << error.additionalMessage();
        }
    });
     m_job->start();
    qDebug() << "Job has been started.";
}

If you generate the geodatabase using these methods, it will automatically register the geodatabase with its original service. This allows the data in the geodatabase to be synchronized with the original service. If you want to load this geodatabase onto a number of devices and allow those users to synchronize changes with the original service, you must register these individual geodatabases with the original service.

Create layers from geodatabase feature tables

Now that you have a geodatabase on your local machine or device, you'll create the relevant layer from the geodatabase feature tables.

  1. Get the geodatabase from the generate geodatabase job.
  2. Load the geodatabase.
    1. Create feature layers from the geodatabase feature tables.
    2. Create annotation layers from the geodatabase annotation tables.

Tiled layers

Tiled layers typically provide geographical context to your map or scene as basemaps that display beneath your data layers. Tiled layers may also provide offline elevation data for visualizing 3D terrain in a scene. You can export and download tile caches directly to your device from any tiled data source that is export enabled. Esri provides a number of vector and raster basemaps for you to export and download:

Download vector tiled data

You can take vector tiled data offline by exporting it from an ArcGIS vector tile service and downloading it as a vector tile package (.vtpk) using the ExportVectorTilesTask  class. The vector tile service used for this operation must support the creation of an offline vector tile cache; specifically, it must enable the  exportTiles operation. Vector tiles contain vector representations of data that can be restyled for different purposes, such as day and night viewing. You can download default styling resources along with the vector tiles and custom style resources from ArcGIS Portal items that host vector tile layers.

You have a number of workflows available to you depending on whether your vector tiled data has custom style resources, whether you want to download many custom styles that you can apply to a number of tile caches, or whether you just want to obtain the default tile cache.

To create a vector tile package (.vtpk file) and vector tile style resources, do the following:

  1. Instantiate the export vector tiles task and check whether the vector tiles have custom style resources.
  2. Specify the export vector tiles task parameters for a specific maximum scale and area of interest.
  3. Export the vector tiles. The vector tile package is populated with vector tiles and the default style resources from the ArcGIS vector tile service.

Instantiate the export vector tiles task

Instantiate the ExportVectorTilesTask using a URL to the portal item that represents an ArcGIS vector tiled layer. Load the task, and upon completion, check whether the vector tiles have custom style resources by checking the hasStyleResources Boolean value.

Use dark colors for code blocksCopy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
void DownloadVectorTiledData::instantiateExportVectorTiles()
{
    // Connect to a portal (ArcGIS Online) to access a portal item ("Colored pencil" vector tile layer).
    m_portal = new Portal(QUrl("https://www.arcgis.com"), this);
    m_vectorTiledLayerItem = new PortalItem(m_portal, "4cf7e1fb9f254dcda9c8fbadb15cf0f8", this);

    // Initialize and load the export vector tile task with the portal item for a vector
    // tiled layer.
    m_exportVectorTileTask = new ExportVectorTilesTask(m_vectorTiledLayerItem, this);

    // Wait for the task to be loaded, then query its members.
    connect(m_exportVectorTileTask, &ExportVectorTilesTask::doneLoading, this, [this]()
        {
        // Check if the vector tile layer has style resources.
        bool hasStylesResources = m_exportVectorTileTask->hasStyleResources();
        if (hasStylesResources)
            {
              // Retrieve the export vector tiles parameters and export the vector
              // tiles with custom style resources...
            }
        else
            {
              // Retrieve the export vector tiles parameters and export the vector
              // tiles (with their default style)...
            }
        }
    );

    m_exportVectorTileTask->load();
}

Specify the export vector tiles task parameters

To obtain a default set of parameters, call the createDefaultExportVectorTilesParameters method and provide an area of interest (polygon or envelope) and a maximum scale. When you provide the maximum scale, you must be aware that there won't be any tiles when the map is zoomed in beyond this scale. If you set the maximum scale to 0, the export will include all levels of detail in the service.

This method returns the set of default parameters, ExportVectorTilesParameters , required to export the vector tiles to a vector tile package. The LODs have been calculated to support the maximum scale that you specified.

Use dark colors for code blocksCopy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
void DownloadVectorTiledData::specifyExportVectorTilesParam()
{
    // Create the default export vector tile cache job parameters from the export
    // vector tiles task (created in the previous section).
    connect(m_exportVectorTileTask, &ExportVectorTilesTask::createDefaultExportVectorTilesParametersCompleted, this, [this](QUuid /*taskId*/, const ExportVectorTilesParameters& parameters)
          {
            const QString tileCachePath(QDir::toNativeSeparators(QDir::homePath() + "/VectorMapTiles.vtpk"));
            qDebug() << QString("Saving the vector tiles in the path " + tileCachePath);

            // Create the job from the default parameters and path to the local cache.
            m_exportVectorTilesJob = m_exportVectorTileTask->exportVectorTiles(parameters, tileCachePath);

            // Export the vector tiles...
          });

    m_exportVectorTileTask->createDefaultExportVectorTilesParameters(m_mapView->visibleArea(), m_mapView->mapScale());
}

Export the vector tiles

Obtain a job to generate and download a vector tile package and its default style resources by passing the ExportVectorTilesParameters to the exportVectorTiles method on the ExportVectorTilesTask class. You must also provide a download path to store the vector tile package and its default style resources.

Run the ExportVectorTilesJob to export and download the vector tile package (.vtpk).

Use dark colors for code blocksCopy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
void DownloadVectorTiledData::exportVectorTiles()
{
    // Start the export vector tiles job (created in the previous section).
    // Handle the job status change and examine the results when the job is done.
    connect(m_exportVectorTilesJob, &ExportVectorTilesJob::jobDone, this, [this]()
          {
            // When the job succeeds, display the local vector tiles.
            if (!m_exportVectorTilesJob->error().isEmpty())
              qDebug() << m_exportVectorTilesJob->error().message() << ": " << m_exportVectorTilesJob->error().additionalMessage();
            if (m_exportVectorTilesJob->jobStatus() == JobStatus::Succeeded)
            {
              // Create a vector tile cache and item resource cache from the result.
              ExportVectorTilesResult* result = m_exportVectorTilesJob->result();
              VectorTileCache* vectorCache = result->vectorTileCache();

              // Create new vector tiled layer using the tile and resource caches.
              m_vectorTileLayer = new ArcGISVectorTiledLayer(vectorCache, this);

              // Display the layer as a basemap.
              m_map = new Map(new Basemap(m_vectorTileLayer), this);
              m_mapView->setMap(m_map);
            }
          });

    // Start the job.
    m_exportVectorTilesJob->start();
}

Export the vector tiles with custom style resources

Obtain a job to generate and download a vector tile package containing tiles and associated style resources by passing the ExportVectorTilesParameters to the exportVectorTiles method on the ExportVectorTilesTask class. The portal item's associated style resources will be downloaded and saved separately. You must also provide a download path to store the vector tile package and a separate download path for the style resources.

Run the job to export and download the vector tile package (.vtpk) and the style resources to the device.

Use dark colors for code blocksCopy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
void DownloadVectorTiledData::customStyleResources()
{
    m_exportVectorTileTask = new ExportVectorTilesTask(m_vectorTiledLayerItem, this);

    // Create the default export vector tile cache job parameters.
    connect(m_exportVectorTileTask, &ExportVectorTilesTask::createDefaultExportVectorTilesParametersCompleted, this, [this](const QUuid& /*taskId*/, const ExportVectorTilesParameters& parameters)
          {
            // Destination paths for the vector tile cache (.vtpk) and empty style resources folder.
            const QString folder(QDir::toNativeSeparators(QDir::homePath()));
            const QString tileCachePath(QDir::toNativeSeparators(folder + QString("/VectorMapTiles.vtpk")));
            const QString resourcePath(QDir::toNativeSeparators(folder + QString(("/resources"))));

            // Create the job from the parameters and paths to the local cache and resources.
            ExportVectorTilesJob* exportVectorTilesJob = m_exportVectorTileTask->exportVectorTiles(parameters, tileCachePath, resourcePath);

            // Handle job status change to check the status.
            connect(exportVectorTilesJob, &ExportVectorTilesJob::jobDone, this, [this, exportVectorTilesJob]()
                    {
                      if (!exportVectorTilesJob->error().isEmpty())
                        qDebug() << exportVectorTilesJob->error().message() << ":" << exportVectorTilesJob->error().additionalMessage();

                      // Show job status and progress.
                      if (exportVectorTilesJob->jobStatus() == JobStatus::Succeeded)
                      {
                        // Get the result from the job.
                        ExportVectorTilesResult* result = exportVectorTilesJob->result();

                        // Create a vector tile cache and item resource cache from the result.
                        VectorTileCache* vectorCache = result->vectorTileCache();
                        ItemResourceCache* resourceCache = result->itemResourceCache();

                        // Create new vector tiled layer using the tile and resource cache.
                        ArcGISVectorTiledLayer* vectorTileLayer = new ArcGISVectorTiledLayer(vectorCache, resourceCache, this);

                        // Display the layer as a basemap.
                        m_map = new Map(new Basemap(vectorTileLayer), this);
                        m_mapView->setMap(m_map);
                      }
                    });

            // Start the job.
            exportVectorTilesJob->start();
          });

    m_exportVectorTileTask->createDefaultExportVectorTilesParameters(m_mapView->visibleArea(), m_mapView->mapScale());
}

Export custom style resources

Obtain a job to download any custom style resources associated with the tasks vector tiles by passing a download path to the exportStyleResourceCache method on the ExportVectorTilesTask class.

Run the job to export the style resources. Obtain the itemResourceCache property from the ExportVectorTilesResult class.

Use dark colors for code blocksCopy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
void DownloadVectorTiledData::exportCustomStyleResources()
{
  // Initialize the export vector tile task with the portal item for a vector tiled layer.
  m_exportVectorTileTask = new ExportVectorTilesTask(m_vectorTiledLayerItem, this);

  // Destination path for the empty style resources folder.
  const QString folder(QDir::toNativeSeparators(QDir::homePath()));
  const QString resourcePath(QDir::toNativeSeparators(folder + QString(("/resources"))));

  // Create the job from the path to the local resources.
  ExportVectorTilesJob* exportStylesJob = m_exportVectorTileTask->exportStyleResourceCache(resourcePath);

  // Retrieve the local style resource cache when the job has completed.
  connect(exportStylesJob, &ExportVectorTilesJob::jobDone, this, [this, exportStylesJob]()
    {
      if (!exportStylesJob->error().isEmpty())
        qDebug() << exportStylesJob->error().message() << ": " << exportStylesJob->error().additionalMessage();

      // When the job succeeds, access the styles.
      if (exportStylesJob->jobStatus() == JobStatus::Succeeded)
        {
          // Obtain the styles' resource cache from the job's result.
          ExportVectorTilesResult* result = exportStylesJob->result();
          ItemResourceCache* resourceCache = result->itemResourceCache();
        }
    });

  // Start the job.
  exportStylesJob->start();
}

Download image tiled data

You can take image tiled data offline by exporting and downloading the image tiled data as a tile package (.tpk or .tpkx) using the ExportTileCacheTask  class. This task requires that the tiled map or image service support the creation of an offline tile cache; specifically, it must enable the exportTiles operation. This can be found at the bottom of the service's HTML page. Esri provided basemaps and elevation sources will be swapped for their export-enabled services.

To create the tile cache, do the following:

  1. Generate the default export image tile cache parameters and set any of the properties.
  2. Export and download the image tile cache using the methods on the ExportTileCacheTask .

Generate default export image tile cache parameters

Construct a default set of parameters ( ExportTileCacheParameters ) by passing an area of interest (polygon or envelope) along with the minimum and maximum scale thresholds to the createDefaultExportTileCacheParameters method on the ExportTileCacheTask class.

This method will return a set of parameters for the area of interest and will calculate the levels of detail (LODs) required to support the minimum and maximum scale for the service's tiling scheme. You can adjust these LOD levels or remove some before you download the cache.

Use dark colors for code blocksCopy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
void DownloadImageTiledData::generateDefaultExportImageTileCacheParameters()
{
    // URL to the map service with tiles to export.
    const QUrl tilesMapServiceUrl("https://sampleserver6.arcgisonline.com/arcgis/rest/services/World_Street_Map/MapServer");

    // Instantiate an export tiles task with the URL to the tiled service.
    m_exportTileCacheTask = new ExportTileCacheTask(tilesMapServiceUrl, this);

    // When the default export tile cache parameters have been retrieved, download the
    // image tile cache.
    connect(m_exportTileCacheTask, &ExportTileCacheTask::defaultExportTileCacheParametersCompleted, this, [this](QUuid taskId, ExportTileCacheParameters defaultExportTileCacheParameters)
      {
        // Export and download the image tile cache...
      });

    // When the map's viewpoint has been set, retrieve the default export tile cache
    // parameters
    connect(m_mapView, &MapQuickView::setViewpointCompleted, this, [this]()
      {
        m_exportTileCacheTask->createDefaultExportTileCacheParameters(m_mapView->visibleArea(), m_mapView->mapScale(), 0);
      });

    // Set the min scale of the map to avoid requesting a huge download.
    m_mapView->map()->setMinScale(1e7);
    m_mapView->setViewpointCenter(Point(-117, 34, SpatialReference::wgs84()), 1e7);
}

Export and download the image tile cache

Obtain an export and download job by passing the ExportTileCacheParameters to the exportTileCache method on the ExportTileCacheTask class. Run the job to download the tile cache into a tile package that is placed in the download path on the device.

Use dark colors for code blocksCopy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
void DownloadImageTiledData::exportDownloadImageTileCache(ExportTileCacheParameters defaultExportTileCacheParameters)
{
    // Destination path for the local package (.tpkx file), including name.
    const QString folder(QDir::toNativeSeparators(QDir::homePath()));
    const QString tileCachePath(QDir::toNativeSeparators(folder + QString("/TerrainImageTiles.tpk")));

    // Get the job.
    ExportTileCacheJob* exportTileCacheJob = m_exportTileCacheTask->exportTileCache(defaultExportTileCacheParameters, tileCachePath);

    // Handle job status change to check progress.
    connect(exportTileCacheJob, &ExportTileCacheJob::jobDone, this, [this, exportTileCacheJob]()
          {
            qDebug() << "Export Tile Cache Job completed";
            if (!exportTileCacheJob->error().isEmpty())
              qDebug() << exportTileCacheJob->error().message() << ":" << exportTileCacheJob->error().additionalMessage();

            // When the job completes successfully, get the local tile cache.
            if (exportTileCacheJob->jobStatus() == JobStatus::Succeeded)
            {
              TileCache* tileCache = exportTileCacheJob->result();

              // Display the tile cache as a tiled layer...
              // or use the tile cache as an elevation source...
            }
          });

    // Start the export tile cache job.
    exportTileCacheJob->start();
}

The tile cache from an exported basemap tile layer can be used in your map or scene:

Use dark colors for code blocksCopy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
void DownloadImageTiledData::displayTileCacheInMap(TileCache* tileCache)
{
    // Use the tile cache to create an ArcGISTiledLayer.
    ArcGISTiledLayer* tiledLayer = new ArcGISTiledLayer(tileCache, this);

    // Display the tiled layer as a basemap.
    m_map = new Map(new Basemap(tiledLayer), this);
    m_mapView->setMap(m_map);
}

The tile cache from exported elevation data can be used as an elevation source in your scene:

Use dark colors for code blocksCopy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
void DownloadImageTiledData::useTileCacheAsElevationSource(TileCache* tileCache)
{
    // Use the tile cache to create an ArcGISTiledElevationSource.
    ArcGISTiledElevationSource* localElevationSource = new ArcGISTiledElevationSource(tileCache, this);

    // Make a Surface using the ArcGISTiledElevationSource.
    Surface* elevationSurface = new Surface(this);
    elevationSurface->elevationSources()->append(localElevationSource);

    // Construct a Scene using this Surface.
    Scene* scene = new Scene(elevationSurface, this);
    m_sceneView->setArcGISScene(scene);
}

When creating an offline tile cache from a tiled service, consider the following:

  • The export tiles operation used to generate tile caches is only available with services hosted on ArcGIS Server 10.2.1 or later.
  • Estimation of tile cache size is not available on ArcGIS Online hosted tiled services.
  • The time required to create a tile cache varies depending on the extent requested, the number of levels requested, the network connection speed, and so on. Use the estimateTileCacheSize method on the  ExportTileCacheTask  class, which returns an  EstimateTileCacheSizeJob  to get the approximate size of a tile cache for a specific set of parameters. Try generating a smaller tile cache to get an idea of how long caching will take when planning a large offline data capture event.
  • There is a limit to the number of tiles you can generate in a single request. When generating a tile cache from an ArcGIS Online basemap, there is a limit of 100,000 tiles per request. Read more on this in the ArcGIS REST API documentation. Organizations that use their own ArcGIS Server to host an offline tile cache can configure the server's maxExportTilesCount via the administrator account to change the default limit of 100,000 tiles.

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.