After doing a setLayerDefinitions on a ArcGISDynamicMapServiceLayer layer. How do I zoom to results?
What version of ArcGIS Server are you using? If you are using one that supports queryExtent that that is the best way.
ArcGIS Server is 10.5.1.
queryExtent I believe is only available with a FeatureLayer, not a ArcGISDynamicMapServiceLayer. Hence why I'm asking the question about how to do it with a ArcGISDynamicMapServiceLayer.
Garey,
Any query (like queryExtent) is going to be specific to a individual layer in a map service just like a definition query would be too. Unfortunately applying a definition expression does not alter the extent returned for that map service so there is no easy way to just zoom to the extent of the set definition expression.
Okay figured this out. no way to do it directly with a ArcGISDynamicMapServiceLayer, so you need to create a temporary FeatureLayer and get the extent of it after applying the same definition expression that was applied to the ArcGISDynamicMapServiceLayer. Sorry about the formatting. When you cut and paste it strips the tabs.
function WDsetDefinitionExpressionDone(results) { if (results.error) { alert("Error occured getting WD trade area. "+results.error.message); console.log("results.error",results.error);} else {try { // Hide layer while we calc renderer and re-display wdLayer.hide(); // Zoom to the layers objectsvar filterDefinition = wdLayer.layerDefinitions[1];var tempLayer = new esri.layers.FeatureLayer( "https://mktserv5.goodyear.com:6443/arcgis/rest/services/MarketAnalysis/MarketAnalysis_WD_TradeAreas/MapServer/1", { id: "Temp Feature Layer" ,outFields: ["*"] } ); var queryObject = new query(); queryObject.where = filterDefinition; tempLayer.queryExtent(queryObject,function(response) { // queryExtent worked. var extent = response.extent; if (extent) { extent.expand(2.0); map.setExtent(extent).then(function (response) { // Color code the layervar promise = smartMapping.createClassedColorRenderer({ layer: tempLayer ,field: "MARKETANALYSIS.WD_SUBGEO_SALES.WD_NET_PURCHASES_UNITS" ,showOthers: true ,basemap: map.getBasemap() ,classificationMethod: "natural-breaks" ,numClasses: 6 }).then(function (response) { // Color coding completed now display it var layerDrawingOptions = []; var layerDrawingOption1 = new esri.layers.LayerDrawingOptions(); layerDrawingOption1.renderer = response.renderer; layerDrawingOptions[1] = layerDrawingOption1; wdLayer.setLayerDrawingOptions(layerDrawingOptions,true); // Have to toggle layer on and off to make sure colors always display. wdLayer.hide(); wdLayer.show(); },function (error) { console.log("WD Coloring Error",error); alert("WD Coloring Error: "+error);}); }); } else { console.log("Error getting extent of trade area from tempLayer",tempLayer); alert("Error getting extent of trade area"); } }, function(error){ // Error querying extent console.log("tempLayer.queryExtent error",error); alert("tempLayer.queryExtent error"); });// // Setup fuction to run after filter is applied// dojo.on.once(tempLayer, "update-end", zoomTempLayer);// // Apply the filter// tempLayer.setDefinitionExpression(filterDefinition); } catch ($err) { console.log("Error color coding WD Trade Area", $err); alert("Error color coding WD Trade Area: $err"); } } }// wdLayer.setDefinitionExpression("WKUNNR='" + wkunnr + "'") var definitions = []; definitions[1] = "WKUNNR='" + wkunnr + "'";wdLayer.setLayerDefinitions(definitions); dojo.on.once(wdLayer, "update-end", WDsetDefinitionExpressionDone); // "update-end" won't happen unless layer is displayed. map.addLayer(wdLayer);
function WDsetDefinitionExpressionDone(results) { if (results.error) { alert("Error occured getting WD trade area. "+results.error.message); console.log("results.error",results.error);} else {
try { // Hide layer while we calc renderer and re-display wdLayer.hide(); // Zoom to the layers objectsvar filterDefinition = wdLayer.layerDefinitions[1];var tempLayer = new esri.layers.FeatureLayer( "https://mktserv5.goodyear.com:6443/arcgis/rest/services/MarketAnalysis/MarketAnalysis_WD_TradeAreas/MapServer/1", { id: "Temp Feature Layer" ,outFields: ["*"] } ); var queryObject = new query(); queryObject.where = filterDefinition; tempLayer.queryExtent(queryObject,function(response) { // queryExtent worked. var extent = response.extent; if (extent) { extent.expand(2.0); map.setExtent(extent).then(function (response) { // Color code the layervar promise = smartMapping.createClassedColorRenderer({ layer: tempLayer ,field: "MARKETANALYSIS.WD_SUBGEO_SALES.WD_NET_PURCHASES_UNITS" ,showOthers: true ,basemap: map.getBasemap() ,classificationMethod: "natural-breaks" ,numClasses: 6 }).then(function (response) { // Color coding completed now display it var layerDrawingOptions = []; var layerDrawingOption1 = new esri.layers.LayerDrawingOptions(); layerDrawingOption1.renderer = response.renderer; layerDrawingOptions[1] = layerDrawingOption1;
wdLayer.setLayerDrawingOptions(layerDrawingOptions,true);
// Have to toggle layer on and off to make sure colors always display. wdLayer.hide(); wdLayer.show();
},function (error) { console.log("WD Coloring Error",error); alert("WD Coloring Error: "+error);}); }); } else { console.log("Error getting extent of trade area from tempLayer",tempLayer); alert("Error getting extent of trade area"); } }, function(error){ // Error querying extent console.log("tempLayer.queryExtent error",error); alert("tempLayer.queryExtent error"); });
// // Setup fuction to run after filter is applied// dojo.on.once(tempLayer, "update-end", zoomTempLayer);// // Apply the filter// tempLayer.setDefinitionExpression(filterDefinition); } catch ($err) { console.log("Error color coding WD Trade Area", $err); alert("Error color coding WD Trade Area: $err"); } } }// wdLayer.setDefinitionExpression("WKUNNR='" + wkunnr + "'") var definitions = []; definitions[1] = "WKUNNR='" + wkunnr + "'";wdLayer.setLayerDefinitions(definitions); dojo.on.once(wdLayer, "update-end", WDsetDefinitionExpressionDone); // "update-end" won't happen unless layer is displayed. map.addLayer(wdLayer);
Honestly that is overkill. Just use a queryTask and query to get the extent of the specific layer in the ArcGISDynamicMapServiceLayer that you are applying the definition to.
Okay. Have an example? Didn't think you could get to sub layers within a ArcGISDynamicMapServiceLayer as a featureLayer to do a queryExtent.
Sure here is a snippet
<SPAN class="comment token">//be sure to require QueryTask</SPAN> <SPAN class="comment token">//require(["esri/tasks/QueryTask"], function(QueryTask) {</SPAN> <SPAN class="comment token">// Zoom to the layers objects</SPAN> <SPAN class="keyword token">var</SPAN> queryTask <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">QueryTask</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token"><SPAN>"</SPAN><A class="jive-link-external-small" href="https://community.esri.com/external-link.jspa?url=https%3A%2F%2Fmktserv5.goodyear.com%3A6443%2Farcgis%2Frest%2Fservices%2FMarketAnalysis%2FMarketAnalysis_WD_TradeAreas%2FMapServer%2F1" target="_blank">https://mktserv5.goodyear.com:6443/arcgis/rest/services/MarketAnalysis/MarketAnalysis_WD_TradeAreas/MapServer/1</A><SPAN>"</SPAN></SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="keyword token">var</SPAN> queryObject <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">new</SPAN> <SPAN class="token class-name">query</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> queryObject<SPAN class="punctuation token">.</SPAN>where <SPAN class="operator token">=</SPAN> wdLayer<SPAN class="punctuation token">.</SPAN>layerDefinitions<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">;</SPAN> queryTask<SPAN class="punctuation token">.</SPAN><SPAN class="token function">queryExtent</SPAN><SPAN class="punctuation token">(</SPAN>queryObject<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">function</SPAN><SPAN class="punctuation token">(</SPAN>response<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
:
Tried something similar, but the extent would be wrong if I didn't wait for the "update-end" event. Otherwise it would zoom to part of the shapes and leave others off the screen.
That was because you were relying on a layer to get the definition query applied. Using a QueryTask is very different.
Signed in members can post, follow updates, and more. New here? Register a free account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.