var mapservice = "http://147.126.65.155/gis/rest/services/tft/tft_maine/MapServer";
var superMarket1 = new esri.layers.FeatureLayer(
mapservice+"/4",
{
id : 'superMarket1',
mode : esri.layers.FeatureLayer.MODE_SNAPSHOT,
opacity : 1
});
var superMarket2 = new esri.layers.FeatureLayer(
mapservice+"/5",
{
id : 'superMarket2',
mode : esri.layers.FeatureLayer.MODE_SNAPSHOT,
opacity : 1
});What have you got in your layerVisibility() method so far?
function layerVisibility(LayerID) {
//Retrieved the list of Layer IDs, which need to be toggled
for ( var i = 0; i < LayerID.length; i++) {
//Got the layer object from the map based on its ID
var layer = map.getLayer(LayerID);
//Checked its visibility
if (layer.visible) {
layer.hide();
//alert("Visible");
} else {
layer.show();
//alert("Hidden");
}
}
}function layerVisibility(LayerID) { //Retrieved the list of Layer IDs, which need to be toggled for ( var i = 0; i < LayerID.length; i++) { //Got the layer object from the map based on its ID var layer = map.getLayer(LayerID); //Checked its visibility if (layer.visible) { layer.hide(); //alert("Visible"); } else { layer.show(); //alert("Hidden"); } } }
So far....
That code doesn't reflect the original requirement that you stated, what do you actually want to achieve?
Do you:
a) Want to toggle ALL layers in the map based on their current state? (that's what it looks like you're trying to do in the above code)
b) Want to toggle between 2 specific layers? (that's what your first post suggests)
c) Something else 😉
Best we get the requirement straight before we start looking for ways to satisfy it 🙂
//Note that this is dependent on the initial state of the layers! superMarket1.setVisibility(!superMarket1.visible); superMarket2.setVisibility(!superMarket1.visible); //Note that this means that the visibility of superMarket2 will always be the opposite of superMarket1.
//Assumes the map object is in scope
map.getLayer("superMarket1").show();
map.getLayer("superMarket2").hide();
You realise that the server will always obey the visible scale rules that you have defined in your map document, regardless of what you do on the client-side? (out of curiosity why do you want to try and override these rules?)
For mutual exclusivity between 2 options a radio button, rather than a checkbox, might be more intuitive for users?
Anyway...the crux of your issue is that at some point to change the visibility of a layer you need to obtain a reference to the layer object of interest.
<input class="list_item" id="superMarket1" value="superMarkets" onclick="layerVisibility();" type="checkbox">Supermarket<br>
var superMarket1 = new esri.layers.FeatureLayer(
mapservice+"/4",
{
id : 'superMarket1',
mode : esri.layers.FeatureLayer.MODE_SNAPSHOT,
opacity : 1
});
var superMarket2 = new esri.layers.FeatureLayer(
mapservice+"/5",
{
id : 'superMarket2',
mode : esri.layers.FeatureLayer.MODE_SNAPSHOT,
opacity : 1
});
var superMarkets = new Array();
superMarkets[0] = superMarket1;
superMarkets[1] = superMarket2;
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Toggle Test</title>
<link rel="stylesheet" type="text/css" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.2/js/dojo/dijit/themes/claro/claro.css" />
<link rel="stylesheet" type="text/css" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.2/js/esri/css/esri.css" />
<style>
html, body
{
width: 100%;
height: 100%;
overflow: hidden;
font-size:small;
}
</style>
</head>
<body class="claro">
<script type="text/javascript" src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.2"></script>
<script type="text/javascript">
dojo.require("esri.map");
dojo.require("esri.layers.FeatureLayer");
var map;
function init() {
var extent = new esri.geometry.Extent({
"xmin": -90.6063,
"ymin": 38.3106,
"xmax": -88.4764,
"ymax": 38.3689,
"spatialReference": { "wkid": 4269 }
});
map = new esri.Map("mapDiv",
{
extent: esri.geometry.geographicToWebMercator(extent)
}
);
dojo.connect(window, "resize", map, map.resize);
map.addLayer(new esri.layers.ArcGISTiledMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"));
//Roads
map.addLayer(new esri.layers.FeatureLayer("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/MapServer/77",
{
id:"road1",
mode: esri.layers.FeatureLayer.MODE_ONDEMAND,
outFields: ["*"]
}
));
map.addLayer(new esri.layers.FeatureLayer("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/MapServer/78",
{
id: "road2",
mode: esri.layers.FeatureLayer.MODE_ONDEMAND,
outFields: ["*"]
}
));
map.addLayer(new esri.layers.FeatureLayer("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/MapServer/74",
{
id: "road3",
mode: esri.layers.FeatureLayer.MODE_ONDEMAND,
outFields: ["*"]
}
));
map.addLayer(new esri.layers.FeatureLayer("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/MapServer/75",
{
id: "road4",
mode: esri.layers.FeatureLayer.MODE_ONDEMAND,
outFields: ["*"]
}
));
map.addLayer(new esri.layers.FeatureLayer("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/MapServer/71",
{
id: "road5",
mode: esri.layers.FeatureLayer.MODE_ONDEMAND,
outFields: ["*"]
}
));
map.addLayer(new esri.layers.FeatureLayer("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/MapServer/72",
{
id: "road6",
mode: esri.layers.FeatureLayer.MODE_ONDEMAND,
outFields: ["*"]
}
));
//Rivers & Lakes
map.addLayer(new esri.layers.FeatureLayer("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/MapServer/95",
{
id: "river1",
mode: esri.layers.FeatureLayer.MODE_ONDEMAND,
outFields: ["*"]
}
));
map.addLayer(new esri.layers.FeatureLayer("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/MapServer/96",
{
id: "river2",
mode: esri.layers.FeatureLayer.MODE_ONDEMAND,
outFields: ["*"]
}
));
map.addLayer(new esri.layers.FeatureLayer("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/MapServer/97",
{
id: "river3",
mode: esri.layers.FeatureLayer.MODE_ONDEMAND,
outFields: ["*"]
}
));
map.addLayer(new esri.layers.FeatureLayer("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/MapServer/98",
{
id: "river4",
mode: esri.layers.FeatureLayer.MODE_ONDEMAND,
outFields: ["*"]
}
));
map.addLayer(new esri.layers.FeatureLayer("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/MapServer/99",
{
id: "river5",
mode: esri.layers.FeatureLayer.MODE_ONDEMAND,
outFields: ["*"]
}
));
checkLayerState();
}
//Will set the visibility of each layer to the opposite of its current state i.e. toggle
function layerToggle(/*Array of strings*/layerIds) {
//Could use dojo.forEach here if you prefer
for (var i = 0; i < layerIds.length; i++) {
var layer = map.getLayer(layerIds);
if (layer) {
//Set the layer's visibility to NOT its current visibility
layer.setVisibility(!layer.visible);
}
}
checkLayerState();
}
function checkLayerState() {
var div = document.getElementById("layerstate");
var s = "<p>Non-Graphics Layers:";
for (var i = 0; i < map.layerIds.length; i++) {
var layer = map.getLayer(map.layerIds);
s += "<br />" + layer.id + " : " + (layer.visible?"on":"off");
}
s += "</p><p>Graphics Layers:";
for (var i = 0; i < map.graphicsLayerIds.length; i++) {
var layer = map.getLayer(map.graphicsLayerIds);
s += "<br />" + layer.id + " : " + (layer.visible ? "on" : "off");
}
div.innerHTML = "</p>" + s;
}
dojo.ready(init);
</script>
<div id="mapDiv" style="height:100%;width:100%;"></div>
<div style="position:absolute;bottom:10px;left:10px;background-color:#000;color:#fff;">
<input type="checkbox" checked="checked" onclick="layerToggle(['road1', 'road2', 'road3', 'road4', 'road5', 'road6']);" />Toggle All Roads<br />
<input type="checkbox" checked="checked" onclick="layerToggle(['river1', 'river2', 'river3', 'river4', 'river5']);" />Toggle All Rivers<br />
</div>
<div id="layerstate" style="position:absolute;top:10px;right:10px;background-color:#000;color:#fff;"></div>
</body>
</html>
I (finally) see!
I am struggling with the use of this layerToggle([array]);
I have four layers that work: Convenience Stores, CSAs, Farmstands, and Farmers' Markets. The rest of the layers using layerToggle, including Supermarkets, Roads and Cities , do not work.
function layerToggle(layerIds) {
//Could use dojo.forEach here if you prefer
for (var i = 0; i < layerIds.length; i++) {
var layer = map.getLayer(layerIds);
if (layer) {
//Set the layer's visibility to NOT its current visibility
layer.setVisibility(!layer.visible);
}
else {
alert("layer [" + layerIds + "] not found");
}
}
//checkLayerState();
}
I'm using updateLayerVisibility() to toggle some layers that have one layerID per checkbox, so don't let that confuse you. That is not quite working either.
I wonder if you have any input for me on the drawing order on the map. I want the first 7 layers to draw first, below the stores and boundaries and roads, etc.