Load an offline copy of a tiled map service as a basemap.
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
- Create an
AGSTileCache
, specifying the path to the local tile package. - Create an
AGSArcGISTiledLayer
with the tile cache. - Create an
AGSBasemap
with the tiled layer. - Create an
AGSMap
with the basemap and set it to anAGSMapView
.
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
//
// 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)
}
}