dojo.require("dijit.layout.BorderContainer"); dojo.require("dijit.layout.ContentPane"); dojo.require("dijit.layout.AccordionContainer"); dojo.require("esri.dijit.Legend"); dojo.require("esri.map"); dojo.require("esri.layers.FeatureLayer"); dojo.require("dijit.form.Button"); dojo.require("dijit.Dialog"); dojo.require("esri.arcgis.utils"); dojo.require("esri.toolbars.navigation"); dojo.require("dijit.Toolbar"); var mapLayers = []; var map; var legendLayers = []; var navToolbar; function init() { var extent = new esri.geometry.Extent({"xmin":-78.21364,"ymin":38.9500003,"xmax":-78.31262, "ymax":39.49891569,"spatialReference":{"wkid":4269}}); map = new esri.Map("map", { extent: esri.geometry.geographicToWebMercator(extent)}); dojo.connect(map, "onLoad", initOperationalLayer); var imagery = new esri.layers.ArcGISTiledMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer"); map.addLayer(imagery); mapLayers.push(imagery); var usaTopo = new esri.layers.ArcGISTiledMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer"); map.addLayer(usaTopo); mapLayers.push(usaTopo); var worldStreet = new esri.layers.ArcGISTiledMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"); map.addLayer(worldStreet); mapLayers.push(worldStreet); navToolbar = new esri.toolbars.Navigation(map); dojo.connect(navToolbar, "onExtentHistoryChange", extentHistoryChangeHandler); dojo.connect(map, "onExtentChange", showExtent); } function initOperationalLayer(map) { var parcelContent = "<br /><b>Owner</b>: ${CAMRAGIS.MLNAM}" + "<br /><b>Rec#</b>: ${PARCEL.RECNUM}" + "<br /><b>Acres</b>: ${CAMRAGIS.MACRE#}"; var buildingContent = "${ADDRESS}"; var landuseContent = "${LAND_USE}"; var zoningContent = "${ZONING}" + "<br />${DESCRIPTIO}"; var parcelInfo = new esri.InfoTemplate("Parcels", parcelContent); var buildingInfo = new esri.InfoTemplate("ADDRESS", buildingContent); var landuseInfo = new esri.InfoTemplate("Future Land Use", landuseContent); var zoningInfo = new esri.InfoTemplate("Zoning", zoningContent); var parcelLayer = new esri.layers.FeatureLayer("http://gis1.co.frederick.va.us/ArcGIS/rest/services/GeoDoc/MapServer/1",{ mode: esri.layers.FeatureLayer.MODE_ONDEMAND, displayOnPan:false,outFields: ["*"], opacity:.5, tileWidth:50, tileHeight:50, visible:false, maxScale:0, minScale:0, infoTemplate: parcelInfo }); var streetsLayer = new esri.layers.FeatureLayer("http://gis1.co.frederick.va.us/ArcGIS/rest/services/GeoDoc/MapServer/2",{ mode: esri.layers.FeatureLayer.MODE_ONDEMAND, displayOnPan:false,outFields: ["*"], opacity:.8, tileWidth:50, tileHeight:50, visible:false, maxScale:0, minScale:0, }); var buildingsLayer = new esri.layers.FeatureLayer("http://gis1.co.frederick.va.us/ArcGIS/rest/services/GeoDoc/MapServer/13",{ mode: esri.layers.FeatureLayer.MODE_ONDEMAND, displayOnPan:false,outFields: ["*"], opacity:.8, tileWidth:50, tileHeight:50, visible:false, maxScale:0, minScale:0, infoTemplate: buildingInfo }); var landuseLayer = new esri.layers.FeatureLayer("http://gis1.co.frederick.va.us/ArcGIS/rest/services/GeoDoc/MapServer/20",{ mode: esri.layers.FeatureLayer.MODE_ONDEMAND, displayOnPan:false,outFields: ["*"], opacity:.8, tileWidth:50, tileHeight:50, visible:false, maxScale:0, minScale:0, infoTemplate: landuseInfo }); var zoningLayer = new esri.layers.FeatureLayer("http://gis1.co.frederick.va.us/ArcGIS/rest/services/GeoDoc/MapServer/17",{ mode: esri.layers.FeatureLayer.MODE_ONDEMAND, displayOnPan:false,outFields: ["*"], opacity:.8, tileWidth:50, tileHeight:50, visible:false, minScale:0, infoTemplate: zoningInfo }); map.addLayer(parcelLayer); map.addLayer(streetsLayer); map.addLayer(buildingsLayer); map.addLayer(landuseLayer); map.addLayer(zoningLayer); map.infoWindow.resize(200,150); mapLayers.push(parcelLayer); mapLayers.push(streetsLayer); mapLayers.push(buildingsLayer); mapLayers.push(landuseLayer); mapLayers.push(zoningLayer); legendLayers.push({layer:parcelLayer,title:"Parcels"}); legendLayers.push({layer:streetsLayer,title:"Streets"}); legendLayers.push({layer:buildingsLayer,title:"Buildings"}); legendLayers.push({layer:landuseLayer,title:"Future Land Use"}); legendLayers.push({layer:zoningLayer,title:"Zoning"}); dojo.connect(map,'onLayersAddResult',function(results){ var legend = new esri.dijit.Legend({ map:map, layerInfos:legendLayers },"legendDiv"); legend.startup(); }); } function layerVisibility(layer) { (layer.visible) ? layer.hide() : layer.show(); } function extentHistoryChangeHandler() { dijit.byId("zoomprev").disabled = navToolbar.isFirstExtent(); dijit.byId("zoomnext").disabled = navToolbar.isLastExtent(); } function showExtent(ext){ var s = ""; s = "XMin: " + ext.xmin.toFixed(2) + " YMin: " + ext.ymin.toFixed(2) + " XMax: " + ext.xmax.toFixed(2) + " YMax: " + ext.ymax.toFixed(2); dojo.byId("onExtentChangeInfo").innerHTML = s; } dojo.addOnLoad(init);
My 1 cent: I don't use the "Pan" Button in the Navigation Toolbar. I rename the "Deactivate" to "Pan" because in most cases you will be in the standard map-navigation mode after navToolbar.deactivate(). Depends on the specific implementation but I guess in most cases, you are.
Otherwise the user doesn't understand the logic behind that "Deactivate" button. 😉
Here is my two cents:
- Don't load claro and tundra css files unless you absolutely need both
- Since you are hosting your own services make sure you're using MSD (not mxd) based services
- Don't display so much data on initial load, it's pretty busy and takes too long to load
- Since you're using ESRI's basemap make sure your data is in the same projection or it will take forever to display since it has to be reprojected.
- Clicking a link to turn a service on or off doesn't work well, use a check box or radio button
On a more positive note, it looks good, I like the layout you're using and you've done a great job for someone just starting out. Keep up the good work.
Glen
//Use the ImageParameters to set the visible layers in the map service during ArcGISDynamicMapServiceLayer construction. var imageParameters = new esri.layers.ImageParameters(); imageParameters.layerIds = [7, 6, 1, 2, 3, 4, 8]; imageParameters.layerOption = esri.layers.ImageParameters.LAYER_OPTION_SHOW; //can also be: LAYER_OPTION_EXCLUDE, LAYER_OPTION_HIDE, LAYER_OPTION_INCLUDE var initialExtent = new esri.geometry.Extent({ "xmin": -8746396.760545, "ymin": 4719239.393535, "xmax": -8683358.936355, "ymax": 4791953.233965, "spatialReference": { "wkid": 102113 } }); map = new esri.Map("map", { extent: initialExtent }); //Add the terrain service to the map. View the ArcGIS Online site for services http://arcgisonline/home/search.html?t=content&f=typekeywords:service var initBasemap = new esri.layers.ArcGISTiledMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer", { id: 'ESRI_World_Topo' }); map.addLayer(initBasemap); dojo.connect(map,'onLoad',function(theMap){ var scalebar = new esri.dijit.Scalebar({ map: map, scalebarUnit: "english" }, dojo.byId("scalebar")); }); var fireLayer = new esri.layers.ArcGISDynamicMapServiceLayer("http://gis.co.frederick.va.us/ArcGIS/rest/services/Fire_and_Rescue/Fire_and_Rescue/MapServer", { id: 'FireRescue', "imageParameters":imageParameters }); fireLayer.setVisibleLayers([3, 7]); legendLayers.push({ layer: fireLayer, title: "Fire Rescue Layers" }); var patLayer = new esri.layers.ArcGISDynamicMapServiceLayer("http://gis.co.frederick.va.us/ArcGIS/rest/services/Planning/Planning_PAT/MapServer", { id: 'PAT', opacity: .6, "imageParameters":imageParameters }); patLayer.setVisibleLayers([3, 6, 1, 2, 4, 7, 8]); legendLayers.push({ layer: patLayer, title: 'Planning Layers' }); dojo.connect(map, 'onLayersAddResult', function(results){ var legend = new esri.dijit.Legend({ map: map, layerInfos: legendLayers }, "legendDiv"); legend.startup(); }); navToolbar = new esri.toolbars.Navigation(map); dojo.connect(navToolbar, "onExtentHistoryChange", extentHistoryChangeHandler); createBasemapGallery(); dojo.connect(dijit.byId('map'), 'resize', resizeMap); dojo.byId("toggle").innerHTML += "<span>Planning Layers:</span><br />"; dojo.byId("toggle").innerHTML += "<input type='checkbox'onclick=\"JavaScript:toggleSubLayer('PAT',7)\">Urban Development Area</A><br />"; dojo.byId("toggle").innerHTML += "<input type='checkbox'onclick=\"JavaScript:toggleSubLayer('PAT',1)\">Zoning</A><br />"; dojo.byId("toggle").innerHTML += "<input type='checkbox'onclick=\"JavaScript:toggleSubLayer('PAT',2)\">Agricultural & Forestal Districts</A><br />"; dojo.byId("toggle").innerHTML += "<input type='checkbox'onclick=\"JavaScript:toggleSubLayer('PAT',3)\">Buildings</A><br />"; dojo.byId("toggle").innerHTML += "<input type='checkbox'onclick=\"JavaScript:toggleSubLayer('PAT',4)\">Future Land Use</A><br />"; dojo.byId("toggle").innerHTML += "<input type='checkbox'onclick=\"JavaScript:toggleSubLayer('PAT',6)\">Sewer & Water Service Area</A><br />"; dojo.byId("toggle").innerHTML += "<input type='checkbox'onclick=\"JavaScript:toggleSubLayer('PAT',8)\">County Boundary</A><br /><br />"; dojo.byId("toggle").innerHTML += "<span>Service Layers:</span><br />"; dojo.byId("toggle").innerHTML += "<input type='checkbox'onclick=\"JavaScript:toggleSubLayer('FireRescue',3)\">Fire Stations</A><br />"; dojo.byId("toggle").innerHTML += "<input type='checkbox'onclick=\"JavaScript:toggleSubLayer('FireRescue',7)\">Hydrants</A><br />"; map.addLayers([fireLayer, patLayer]); function toggleSubLayer(layerId, subLayerId) { var layer = map.getLayer(layerId); if(layer && layer.visibleLayers) { var visibleLayers = layer.visibleLayers; var layerIndex = dojo.indexOf(visibleLayers, subLayerId); if(layerIndex === -1) { visibleLayers.push(subLayerId); } else { visibleLayers.splice(layerIndex, 1); } visibleLayers = (visibleLayers.length > 0) ? visibleLayers : [-1]; layer.setVisibleLayers(visibleLayers); } } function extentHistoryChangeHandler() { dijit.byId("zoomprev").disabled = navToolbar.isFirstExtent(); dijit.byId("zoomnext").disabled = navToolbar.isLastExtent(); } dojo.addOnLoad(init); </script> </head> <body class="claro" > <div class="tundra" id="navToolbar" dojoType="dijit.Toolbar" style="width: 100%;"> <div dojoType="dijit.form.Button" id="zoomin" iconClass="zoominIcon" onClick="navToolbar.activate(esri.toolbars.Navigation.ZOOM_IN); selected=true; ">Zoom In</div> <div dojoType="dijit.form.Button" id="zoomout" iconClass="zoomoutIcon" onClick="navToolbar.activate(esri.toolbars.Navigation.ZOOM_OUT);">Zoom Out</div> <div dojoType="dijit.form.Button" id="zoomfullext" iconClass="zoomfullextIcon" onClick="navToolbar.zoomToStartExtent();">Full Extent</div> <div dojoType="dijit.form.Button" id="zoomprev" iconClass="zoomprevIcon" onClick="navToolbar.zoomToPrevExtent();">Prev Extent</div> <div dojoType="dijit.form.Button" id="zoomnext" iconClass="zoomnextIcon" onClick="navToolbar.zoomToNextExtent();">Next Extent</div> <!-- <div dojoType="dijit.form.Button" id="pan" iconClass="panIcon" onClick="navToolbar.activate(esri.toolbars.Navigation.PAN);">Pan</div> --> <div dojoType="dijit.form.Button" id="deactivate" iconClass="panIcon" onClick="navToolbar.deactivate()">Pan</div> </div> <div style="position:absolute; right:70px; top:10px; z-Index:999;"> <div dojoType="dijit.TitlePane" title="Switch Basemap" closable="false" open="false"> <div dojoType="dijit.layout.ContentPane" style="width:380px; height:280px; overflow:auto;"> <div id="basemapGallery" ></div></div> </div></div> <div id="content" dojotype="dijit.layout.BorderContainer" design="headline" gutters="true" style="width: 100%; height: 100%; margin: 0;"> <div id="rightPane" dojotype="dijit.layout.ContentPane" region="right"> <div dojoType="dijit.layout.AccordionContainer"> <div dojoType="dijit.layout.ContentPane" id="legendPane" title="Legend" selected="false"> <div id="legendDiv"></div> </div> <div dojoType="dijit.layout.ContentPane" title="Frederick County GIS Layers" selected="true"> <span style="padding:10px 0;">Click to toggle the visibilty of different Layers.</span><br /><br /> <div id="toggle" style="padding: 2px 2px; font-size:10px;"></div> </div> <div dojoType="dijit.layout.ContentPane" title="Search Tools" selected="false"> <span style="padding:10px 0;">Coming Soon!</span> PIN Lookup: <input type="text" id="PARCELID" size="30" value="54 A 25" /> <input type="button" value="Search" onclick="doFind();" /><br /> <div id="loading"><img src="http://help.arcgis.com/en/webapi/javascript/arcgis/demos/map/images/loading.gif" /></div> </div> </div> </div> <div id="map" dojotype="dijit.layout.ContentPane" style="width: 77%; height: 85%;" region="center" style="overflow:hidden;"> </div> <div id="scalebar" style="position:absolute;left:15px;top:84%;"></div> <div dojotype="dijit.layout.ContentPane" region="bottom" style="position:absolute;left:5px;top:88%;height:10%;width:77%"> <table dojoType="dojox.grid.DataGrid" jsid="grid" id="grid" rowsPerPage="4" rowSelector="10px"> <thead> <tr> <th field="RECNUM" width="15%">PIN</th> <th field="MLNAM" width="15%" >Owner 1</th> <th field="MFNAM" width="15%">Owner 2</th> <th field="MADD1" width="25%">Mailing Address</th> <th field="MADD2" width="30%">Zip</th> </tr> </thead> </table> </div> </div> </body> </html>