Wednesday, 28 January 2015

automatic zoom to layer in arcgis js api


I'm trying to zoom to layer automatically as soon as the map finishes loading using the guide here. To be clear, I'm only loading one layer and just want to zoom in on one of the layers provided by the service.


js script


dojo.require("dijit.layout.BorderContainer");
dojo.require("dijit.layout.ContentPane");
dojo.require("esri.map");
dojo.require("esri.renderer");

dojo.require("esri.graphic");
dojo.require("esri.dijit.Legend");
dojo.require("esri.utils");

dojo.require("dijit.layout.AccordionContainer");
dojo.require("esri.layers.FeatureLayer");

var map;
var basemap;
var trafficmap;

var basemapServiceSource;
var featuremapServiceSource;
var trafficServiceSource;
var renderer;
var loading;

function init() {

// for now, these are referring to a single source
basemapServiceSource = "http://co-gis-01/ArcGIS/rest/services/dev_RTIA/rtia/MapServer";


//Add the topographic layer to the map. View the ArcGIS Online site for services http://arcgisonline/home/search.html?t=content&f=typekeywords:service
basemap = new esri.layers.ArcGISDynamicMapServiceLayer(basemapServiceSource);
basemap.setVisibleLayers([0, 1, 2, 4, 5, 6]);

map = new esri.Map("map", {

// remove logo
logo:false
});


//loading image. id
loading = dojo.byId("loadingImg");
dojo.connect(map,"onUpdateStart",showLoading);
dojo.connect(map,"onUpdateEnd",hideLoading);

/*
IDs of Layers for http://co-gis-01/ArcGIS/rest/services/dev_ExIS/exis/MapServer
Site Name (0)
Section ID (1)

AADT some (2)
AADT all (3)
AdministrativeAreas_CongressionalDistricts (4)
AdministrativeAreas_Provinces (5)
AdministrativeAreas_Regions (6)
*/
map.addLayer(basemap);

// executes function on onLoad event
dojo.connect(map, 'onLoad', function(theMap) {


dojo.connect(dijit.byId('map'), 'resize', map,map.resize);
zoomToLayer();
});
}


function zoomToLayer() {

var requestHandle = esri.request({

url: "http://co-gis-01/ArcGIS/rest/services/dev_RTIA/rtia/MapServer/2",
content: { f:"json" },
callbackParamName: "callback"
});

requestHandle.then(requestSucceeded, requestFailed);
}

function requestSucceeded(response, io) {


var extent = new esri.geometry.Extent(response.extent);
dojo.byId("extent").innerHTML = dojo.toJson(extent.toJson());
map.setExtent(extent);
}

function requestFailed() {

alert("requestFailed");
}


function showLoading() {

esri.show(loading);
map.disableMapNavigation();
map.hideZoomSlider();
}

function hideLoading(error) {

esri.hide(loading);

map.enableMapNavigation();
map.showZoomSlider();
}

dojo.addOnLoad(init);

html code






RTIA Map

























The problem is that the outputs of dojo.toJson(extent.toJson()) show the same extent, which is the full extent, no matter the layer. This particular layer that I would like to zoom to, http://co-gis-01/ArcGIS/rest/service...ia/MapServer/2, is just a filtered version of one of the "full-extent" layers. The filter is defined in the mapservice.


How do I correctly do this function?



Answer



I've managed to solve this problem using this as a reference. Basically, I looped all of the Polyline graphics (that's the only type the application is interested in) included in the FeatureLayer and do a union operation on each of the graphic's extent. Below is my version.


function featureUpdateEnd(error, info)  {


var localExtent;
if (featuremap.graphics.length > 0) {

for (var i = 0; i < featuremap.graphics.length; i++) {

if (featuremap.graphics[i].geometry instanceof esri.geometry.Polyline) {

try {

if (i == 0) {


localExtent = new esri.geometry.Extent(featuremap.graphics[i].geometry.getExtent().toJson());
}
else {

localExtent = localExtent.union(featuremap.graphics[i].geometry.getExtent());
}
}
catch (err) {


//alert(String(i) + " is caught: " + err.message);
}
}
}

localExtent = localExtent.expand(1.25);
map.setExtent(localExtent.getExtent());
}
}


featuremap is the FeatureLayer. featureUpdateEnd is a function that is called by FeatureLayer's onUpdateEnd event. I did not use onLoad because the event fires even if the FeatureLayer hasn't finished loading yet, giving me a zero-length array to loop on. I had to enclose part of it in a try-catch statement because of an undefined instance is encountered (but this is probably only due to my data).


No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...