Basic steps for working with tiled base map services for offline.
Add the basic library references. Then test to make sure map loads.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
<title>Offline Tiles</title>
<!-- Bootstrap core CSS -->
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="http://js.arcgis.com/3.11/esri/css/esri.css">
<link rel="stylesheet" type="text/css" href="http://esri.github.io/bootstrap-map-js/src/css/bootstrapmap.css">
<style>
#mapDiv {
min-height: 500px;
max-height: 1000px;
}
body {
background-color: #ffffff;
overflow: hidden;
font-family: "Trebuchet MS";
}
.floatRight {float: right;}
.container { padding: 20px;}
</style>
<!-- Include a reference to offline.js which detects online/offline conditions -->
<script src="../vendor/offline/offline.min.js"></script>
<script>
// Set the online/offline detection options.
// More info at: http://github.hubspot.com/offline/docs/welcome/
Offline.options = {
checks: {
image: {
url: function() {
return 'http://esri.github.io/offline-editor-js/tiny-image.png?_=' +
(Math.floor(Math.random() * 1000000000));
}
},
active: 'image'
}
}
</script>
<!-- Include a reference to IndexedDBShim for library to work on Safari 7.x -->
<script src="../vendor/IndexedDBShim/dist/IndexedDBShim.js"></script>
<script src="http://js.arcgis.com/3.11/"></script>
</head>
<body>
<div class="row">
<div class="col-xs-12">
<div id="mapDiv"></div>
</div>
</div>
<script>
// Make sure to reference the tiles library within the require statement!
require(["esri/map","dojo/on","//esri.github.com/bootstrap-map-js/src/js/bootstrapmap.js","../dist/offline-tiles-advanced-min.js", "dojo/domReady!"],
function(Map,on,Bootstrapmap) {
// Initialize our map to be responsive
var map = Bootstrapmap.create("mapDiv",{
basemap: "topo",
center: [-122.45, 37.75], // longitude, latitude
zoom: 15
});
});
</script>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
</body>
</html>
This initializes the offline-editor-js library. Test to make sure map loads.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
<title>Offline Tiles</title>
<!-- Bootstrap core CSS -->
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="http://js.arcgis.com/3.11/esri/css/esri.css">
<link rel="stylesheet" type="text/css" href="http://esri.github.io/bootstrap-map-js/src/css/bootstrapmap.css">
<style>
#mapDiv {
min-height: 500px;
max-height: 1000px;
}
body {
background-color: #ffffff;
overflow: hidden;
font-family: "Trebuchet MS";
}
.floatRight {float: right;}
.container { padding: 20px;}
</style>
<!-- Include a reference to offline.js which detects online/offline conditions -->
<script src="../vendor/offline/offline.min.js"></script>
<script>
// Set the online/offline detection options.
// More info at: http://github.hubspot.com/offline/docs/welcome/
Offline.options = {
checks: {
image: {
url: function() {
return 'http://esri.github.io/offline-editor-js/tiny-image.png?_=' +
(Math.floor(Math.random() * 1000000000));
}
},
active: 'image'
}
}
</script>
<!-- Include a reference to IndexedDBShim for library to work on Safari 7.x -->
<script src="../vendor/IndexedDBShim/dist/IndexedDBShim.js"></script>
<script src="http://js.arcgis.com/3.11/"></script>
</head>
<body>
<div class="row">
<div class="col-xs-12">
<div id="mapDiv"></div>
</div>
</div>
<script>
// Make sure to reference the tiles library within the require statement!
require(["esri/map","dojo/on","//esri.github.com/bootstrap-map-js/src/js/bootstrapmap.js","../dist/offline-tiles-advanced-min.js", "dojo/domReady!"],
function(Map,on,Bootstrapmap) {
// Check if browser state is online or offline
Offline.check();
Offline.on('up down', updateState );
// Initialize our map to be responsive
var map = Bootstrapmap.create("mapDiv",{
//basemap: "topo", // comment out this basemap!
center: [-122.45, 37.75], // longitude, latitude
zoom: 15
});
// Now we initialize a topo tiled basemap service to be offline-enabled.
var tileLayer = O.esri.Tiles.OfflineTileEnablerLayer(
"http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer",
function(evt){
console.log("Offline tile lib enabled. App is: " + Offline.state);
},
true);
// Add our offline tile layer to the map instead of using the default basemap!
map.addLayer(tileLayer);
// Set the tileLayer online or offline.
// When set to offline, the map will look for tiles in the local tiles database
function updateState(){
if(Offline.state === 'up'){
if(typeof tileLayer != "undefined") tileLayer.goOnline();
}
else{
if(typeof tileLayer != "undefined") tileLayer.goOffline();
}
}
});
</script>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
</body>
</html>
Enable the ability to download tiles as well the ability to toggle online and offline.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
<title>Offline Tiles</title>
<!-- Bootstrap core CSS -->
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="http://js.arcgis.com/3.11/esri/css/esri.css">
<link rel="stylesheet" type="text/css" href="http://esri.github.io/bootstrap-map-js/src/css/bootstrapmap.css">
<style>
#mapDiv {
min-height: 500px;
max-height: 1000px;
}
body {
background-color: #ffffff;
overflow: hidden;
font-family: "Trebuchet MS";
}
.floatRight { float: right;}
.container { padding: 20px;}
</style>
<!-- Include a reference to offline.js which detects online/offline conditions -->
<script src="../vendor/offline/offline.min.js"></script>
<script>
// Set the online/offline detection options.
// More info at: http://github.hubspot.com/offline/docs/welcome/
Offline.options = {
checks: {
image: {
url: function() {
return 'http://esri.github.io/offline-editor-js/tiny-image.png?_=' +
(Math.floor(Math.random() * 1000000000));
}
},
active: 'image'
}
}
</script>
<!-- Include a reference to IndexedDBShim for library to work on Safari 7.x -->
<script src="../vendor/IndexedDBShim/dist/IndexedDBShim.js"></script>
<script src="http://js.arcgis.com/3.11/"></script>
</head>
<body>
<!-- Our buttons and online/offline indicator -->
<div class="container">
<div class="row">
<div class="col-xs-10">
<div class="form form-group btn-group" data-toggle="buttons">
<button class="btn btn-success" id="btn-get-tiles">1. Download Tiles</button>
<button class="btn btn-success" disabled id="btn-online-offline">2. Go Offline</button>
<button class="btn btn-success" disabled id="btn-pan-left">3. Pan left</button>
</div>
</div>
<div class="col-xs-2">
<!-- this indicates whether app is offline (down) or online (up) -->
<button id="btn-state" class="btn btn-success btn-large floatRight">
<span id="state-span" class="glyphicon glyphicon-link"> Up</span>
</button>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div id="mapDiv"></div>
</div>
</div>
</div>
<script>
// Make sure to reference the tiles library within the require statement!
require(["esri/map","dojo/on","//esri.github.com/bootstrap-map-js/src/js/bootstrapmap.js",
"../dist/offline-tiles-advanced-min.js", "dojo/domReady!"],
function(Map,on,Bootstrapmap){
var map,basemapLayer;
// Check if browser state is online or offline
Offline.check();
Offline.on('up down', updateState );
// For cancelling the download of tiles
var _wantToCancel = false;
var _downloadState = "downloaded";
// Set up min and max boundaries for retrieving tiles
var minZoomAdjust = -1, maxZoomAdjust = 1;
// Set up button click listeners.
var btnGetTiles = document.getElementById("btn-get-tiles");
var btnOnlineOffline = document.getElementById("btn-online-offline");
var btnPanLeft = document.getElementById("btn-pan-left");
on(btnGetTiles,"click",downloadTiles);
on(btnOnlineOffline,"click",goOnlineOffline);
on(btnPanLeft,"click",panLeft);
var imgOfflineIndicator = document.getElementById("state-span");
var btnState = document.getElementById("btn-state");
showMap();
function showMap(){
// Initialize our map to be responsive
map = Bootstrapmap.create("mapDiv",{
//basemap: "topo", // comment out this basemap!
center: [-122.45, 37.75], // longitude, latitude
zoom: 15
});
// Now we initialize the basemap to be offline-enabled. This is out new basemap.
basemapLayer = O.esri.Tiles.OfflineTileEnablerLayer(
"http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer",
function(evt){
console.log("Offline tile lib enabled. App is: " + Offline.state);
},
true);
// Add our offline tile layer to the map instead of using the default basemap!
map.addLayer(basemapLayer);
}
function downloadTiles(){
if(_downloadState == "downloading"){
_wantToCancel = true;
}
else{
_wantToCancel = false;
// First delete any existing tiles from database
basemapLayer.deleteAllTiles(function(success,err){
var zoom = basemapLayer.getMinMaxLOD(minZoomAdjust,maxZoomAdjust);
// Now download tiles
basemapLayer.prepareForOffline(zoom.min, zoom.max, map.extent, function(progress){
console.log("downloading tiles...");
if(progress.hasOwnProperty("countNow")){
var percent = Math.floor(progress.countNow / progress.countMax * 100);
btnGetTiles.innerHTML = 'Saving to phone ' + percent + "% - Tap to Cancel";
}
if( progress.finishedDownloading )
{
btnGetTiles.innerHTML = "Saving to phone 100% - Tap to Cancel";
if( progress.cancelRequested )
{
alert("Tile download was cancelled");
_downloadState = "cancelled";
}
else
{
alert("Tile download complete");
_downloadState = "downloaded";
btnOnlineOffline.disabled = false;
}
btnGetTiles.innerHTML = '1. Download Tiles';
}
return _wantToCancel; //determines if a cancel request has been issued
});
_downloadState = "downloading";
});
}
}
// Force the tileLayer between online and offline
function goOnlineOffline(){
btnPanLeft.disabled = false;
if(btnOnlineOffline.innerHTML == "2. Go Offline"){
toggleStateUp(false);
console.log("Map is offline");
}
else{
toggleStateUp(true);
console.log("Map is online");
}
}
function toggleStateUp(state){
if(state){
btnOnlineOffline.innerHTML = "2. Go Offline";
basemapLayer.goOnline();
imgOfflineIndicator.className = "glyphicon glyphicon-link";
imgOfflineIndicator.innerHTML = " Up";
btnState.className = "btn btn-success btn-large floatRight";
}
else{
btnOnlineOffline.innerHTML = "2. Go Online";
basemapLayer.goOffline();
imgOfflineIndicator.className = "glyphicon glyphicon-thumbs-down";
imgOfflineIndicator.innerHTML = " Down";
btnState.className = "btn btn-danger btn-large floatRight";
}
}
// Set the ArcGIS.com map online or offline.
// When set offline it will look for tiles in the tiles database
function updateState(){
if(Offline.state === 'up'){
if(typeof basemapLayer != "undefined") basemapLayer.goOnline();
toggleStateUp(true);
}
else{
if(typeof basemapLayer != "undefined") basemapLayer.goOffline();
toggleStateUp(false);
}
}
// Pan left when "offline" to view only tiles that have been stored locally
function panLeft(){
map.panLeft();
}
});
</script>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
</body>
</html>