ArcGIS tiled layer (tile cache)

View on GitHub
Sample viewer app

Load an offline copy of a tiled map service as a basemap.

Tiled map of San Francisco List of tile packages

Use case

Constructing an ArcGISTiledLayer from a local tile package (.tpk & .tpkx) allows you to use that basemap tiled service when the application is offline. Dividing a raster into tiles allows the map to provide relevant tiles and level of detail to the user when panning and zooming. For example, when working in an environment that has no connectivity, this could provide access to a map for navigating your surroundings.

How to use the sample

Launch the app to view the "San Francisco offline tile package" as the basemap. Tap the bottom button to get a list of tile packages available

How it works

  1. Create an AGSTileCache, specifying the path to the local tile package.
  2. Create an AGSArcGISTiledLayer with the tile cache.
  3. Create an AGSBasemap with the tiled layer.
  4. Create an AGSMap with the basemap and set it to an AGSMapView.

Relevant API

  • AGSArcGISTiledLayer
  • AGSBasemap
  • AGSMap
  • AGSTileCache

Offline data

This sample uses the San Francisco offline tile package. It is downloaded from ArcGIS Online automatically.

About the data

The map opens to a view of the city of San Francisco, CA. In a disconnected environment, this basemap tile service would be fully accessible to zoom and pan as if you were connected to an online service.

Additional information

AGSArcGISTiledLayer and AGSTileCache supports both .tpk and .tpkx file formats.

Tags

cache, layers, offline, tile

Sample Code

LocalTiledLayerViewController.swiftTilePackagesListViewController.swift
                                                          
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
//
// Copyright 2016 Esri.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import UIKit
import ArcGIS

class LocalTiledLayerViewController: UIViewController, TilePackagesListViewControllerDelegate {
    @IBOutlet weak var mapView: AGSMapView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // add the source code button item to the right of navigation bar
        (self.navigationItem.rightBarButtonItem as! SourceCodeBarButtonItem).filenames = ["LocalTiledLayerViewController", "TilePackagesListViewController"]

        // create a tiled layer using one of the tile packages
        let tileCache = AGSTileCache(name: "SanFrancisco")
        let localTiledLayer = AGSArcGISTiledLayer(tileCache: tileCache)

        // instantiate a map, use the tiled layer as the basemap
        let map = AGSMap(basemap: AGSBasemap(baseLayer: localTiledLayer))

        // assign the map to the map view
        self.mapView.map = map
    }

    // MARK: - Navigation

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let controller = segue.destination as? TilePackagesListViewController {
            controller.delegate = self
        }
    }

    // MARK: - TilePackagesListViewControllerDelegate

    // called when a selection is made in the tile packages list
    func tilePackagesListViewController(_ tilePackagesListViewController: TilePackagesListViewController, didSelectTilePackageAt url: URL) {
        // create a new map with selected tile package as the basemap
        let localTiledLayer = AGSArcGISTiledLayer(tileCache: AGSTileCache(fileURL: url))
        let map = AGSMap(basemap: AGSBasemap(baseLayer: localTiledLayer))
        self.mapView.map = map

        _ = self.navigationController?.popViewController(animated: true)
    }
}

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