Skip to content

Instantly share code, notes, and snippets.

@odoe
Last active December 12, 2015 01:48
Show Gist options
  • Save odoe/4693902 to your computer and use it in GitHub Desktop.
Save odoe/4693902 to your computer and use it in GitHub Desktop.
ArcGIS JS API Drawtoolbar example for mobile that provides a little bit more feedback for the user on a touch device.
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=7,IE=9">
<title>Maps Toolbar</title>
<link rel="stylesheet" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.3/js/dojo/dojox/mobile/themes/iPhone/iPhone.css">
<link rel="stylesheet" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.3/js/dojo/dojox/mobile/themes/buttons.css">
<link rel="stylesheet" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.3/js/esri/css/esri.css">
<style>
html, body {
height: 100%;
width: 100%;
margin: 0;
padding: 0;
}
</style>
<script>var dojoConfig = { parseOnLoad : true }</script>
<script src="http://serverapi.arcgisonline.com/jsapi/arcgis/3.3compact"></script>
<script>
/**
odoe -
Slightly modified version of this sample.
http://help.arcgis.com/EN/webapi/javascript/arcgis/jssamples/#sample/mobile_drawtoolbar
Because I like the openlayers type of editor, I think adding some feedback points for the user while they are drawing
lines and polygons provides a bit of a better user experience. Especially when they click their start point, you don't
really know where you clicked on the map. If you have ever tried drawing lines/polygons on a map on a mobile/tablet
device, you know that drawing the first couple of points isn't very intuitive.
**/
dojo.require("esri.map");
dojo.require("esri.toolbars.draw");
dojo.require("esri.toolbars.edit");
dojo.require("esri.tasks.geometry");
dojo.require("dojox.mobile.parser");
dojo.require("dojox.mobile");
dojo.require("dojox.mobile.Button");
dojo.requireIf(!dojo.isWebKit, "dojox.mobile.compat");
var map, toolbar, editToolbar, drawToolActive, gs, sketchGraphics;
function init() {
//onorientationchange doesn't always fire in a timely manner in Android so check for both orientationchange and resize
var supportsOrientationChange = "onorientationchange" in window, orientationEvent = supportsOrientationChange ? "orientationchange" : "resize";
window.addEventListener(orientationEvent, function() {
orientationChanged();
}, false);
esri.config.defaults.io.proxyUrl = "/arcgisserver/apis/javascript/proxy/proxy.ashx";
map = new esri.Map("map", {
basemap: "streets",
center: [-15.469, 36.428],
zoom: 3
});
// odoe - add a sketch array to hold some feedback points for the user
sketchGraphics = [];
dojo.connect(map, "onLoad", createToolbar);
gs = new esri.tasks.GeometryService("http://tasks.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer");
}
function createToolbar(map) {
toolbar = new esri.toolbars.Draw(map);
dojo.connect(toolbar, "onActivate", function() {
drawToolActive = true;
});
dojo.connect(toolbar, "onDrawEnd", checkGeometry);
editToolbar = new esri.toolbars.Edit(map);
//Activate the toolbar when you click on a graphic
dojo.connect(editToolbar, "onDeactivate", function(tool, graphic) {
var geometry = graphic.geometry;
if(geometry.type === "polygon" && esri.geometry.polygonSelfIntersecting(geometry)) {
gs.simplify([geometry], function(geometries) {
graphic.setGeometry(geometries[0]);
});
}
});
dojo.connect(map.graphics, "onClick", function(evt) {
if(drawToolActive === false) {
dojo.stopEvent(evt);
editToolbar.activate(esri.toolbars.Edit.MOVE | esri.toolbars.Edit.SCALE | esri.toolbars.Edit.ROTATE | esri.toolbars.Edit.EDIT_VERTICES, evt.graphic);
}
});
//deactivate the toolbar when you click outside a graphic
dojo.connect(map, "onClick", function(evt) {
editToolbar.deactivate();
// odoe - if the drawtool is active, add a point where the user touched the screen to provide a little feedback.
if (drawToolActive) {
var mp = evt.mapPoint;
var sym = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, 16, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 0, 0, 1]));
var g = new esri.Graphic(mp, sym);
sketchGraphics.push(g); // odoe - add skecth graphic
map.graphics.add(g);
}
});
}
function checkGeometry(geometry) {
if(geometry.type === "polygon" && esri.geometry.polygonSelfIntersecting(geometry)) {
gs.simplify([geometry], function(geometries) {
addToMap(geometries[0]);
});
} else {
addToMap(geometry);
}
}
function addToMap(geometry) {
drawToolActive = false;
var symbol;
switch (geometry.type) {
case "point":
symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_SQUARE, 10, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 1), new dojo.Color([0, 255, 0, 0.25]));
break;
case "polyline":
symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASH, new dojo.Color([255, 0, 0]), 3);
break;
case "polygon":
symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 255, 0, 0.25]));
break;
case "extent":
symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 255, 0, 0.25]));
break;
case "multipoint":
symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_DIAMOND, 20, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 0, 0]), 1), new dojo.Color([255, 255, 0, 0.5]));
break;
}
var graphic = new esri.Graphic(geometry, symbol);
map.graphics.add(graphic);
// odoe - clear sketch graphics
for (var i = 0, g; g = sketchGraphics[i]; i++) {
map.graphics.remove(g);
}
sketchGraphics = [];
toolbar.deactivate();
map.showZoomSlider();
}
function orientationChanged() {
if(map) {
map.reposition();
map.resize();
}
}
dojo.ready(init);
</script>
</head>
<body>
<h1 dojoType="dojox.mobile.Heading">Draw And Edit Toolbar</h1>
<div id="header" style="height:58px;padding-top:5px;">
<button dojoType="dojox.mobile.Button" onClick="toolbar.activate(esri.toolbars.Draw.POINT);map.hideZoomSlider();dojo.byId('info').innerHTML = 'Tap to add a point';">
Point
</button>
<button dojoType="dojox.mobile.Button" onClick="toolbar.activate(esri.toolbars.Draw.POLYLINE);map.hideZoomSlider();dojo.byId('info').innerHTML = 'Tap to start draw, double tap to complete';">
Polyline
</button>
<button dojoType="dojox.mobile.Button" onClick="toolbar.activate(esri.toolbars.Draw.POLYGON);map.hideZoomSlider();dojo.byId('info').innerHTML = 'Tap to start draw, double tap to complete';">
Polygon
</button>
<div id="info"></div>
</div>
<div id="map" style="border:solid 2px #587498;width:100%;height:100%;"></div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment