I am new to the JS 4.x language. The JS 3.x had the modes. These helped with queries where you could zoom into a FeatureLayer and have it turn on when zoomed to. The Featurelayer doesnt show up when using MODE_SELECTION until it was queried and selected. Here is an exapmple of the 3.x code:
floorOutline = new FeatureLayer (urlFloorOutline, {
mode: FeatureLayer.MODE_SELECTION,
id: 'floorOutline',
outFields: ["*"],
opacity: 0.8,
});
This was added t othe map and did not show up on the map until you ran the zoom to fucntion:
function zoomFloorOutline (id)
{
require ([
"esri/tasks/query",
"esri/geometry/ScreenPoint",
"esri/geometry/Extent",
"esri/layers/FeatureLayer"
],
function (Query, ScreenPoint, Extent, FeatureLayer)
{
console.log ("zoomFloorOutline")
clearGraphics ();
var query = new Query ();
query.objectIds = [id];
var myDate = new Date ();
var myMS = myDate.getMilliseconds ();
query.where = "(" + myMS + "=" + myMS + ")";
console.log ("zoomFloorOutline + id")
floorOutline.selectFeatures (query, FeatureLayer.SELECTION_NEW, function (features)
{
var floorExtent = features[0].geometry.getExtent ().expand (1.5);
map.setExtent (floorExtent);
});
});
}
How do i do something similar with JS 4.x? I have some code to zoom to the feature but it is visible when the map is loaded and i just want show the quereied floor.
function zoomFloorOutline (id)
{
require ([
"esri/rest/query",
"esri/rest/support/Query",
"esri/layers/FeatureLayer",
"esri/views/layers/LayerView"
],
function (query, Query, FeatureLayer,LayerView)
{
console.log ("zoomFloorOutline");
// let highlight;
view.whenLayerView (floorOutline).then (function (layerView)
{
var query = floorOutline.createQuery ();
query.objectIds = [id];
query.where = "1=1";
floorOutline.queryFeatures (query).then (function (results)
{
const features = results.features;
console.log("zoom Floor" + features)
var geometry = features[0].geometry.extent.clone ().expand (2);
view.goTo (geometry);
});
});
});
}
Thanks for any help.
Solved! Go to Solution.
On line 25 of your 4.x code you have this to zoom to the feature:
view.goTo (geometry);
If you want to make the layer visible after zooming, you can change that line to the following:
view.goTo(geometry).then(function() {
floorOutline.visible = true;
});
On line 21, instead of:
query.where = "1=1";
I think you need this instead:
query.where = roomsUseLayer.definitionExpression;
Or better yet, you could remove line 21 altogether, because according to the documentation for createQuery, the "where" setting should already be set according to the definitionExpression. Setting it to "1=1" would overwrite that and return all features in the layer.
If you're just wanting to show a particular set of features at any given time, and know the objectID values of that set, then using definitionExpression would be one way to do so:
function hideLayerFeatures(featureLayer) {
featureLayer.definitionExpression = "1=0";
}
function showLayerFeatures(featureLayer, ids) {
if (Array.isArray(ids))
featureLayer.definitionExpression = featureLayer.objectIdField + " IN(" + ids.join(",") + ")";
else if (typeof ids == "number")
featureLayer.definitionExpression = featureLayer.objectIdField + " = " + ids.toString();
}
On line 25 of your 4.x code you have this to zoom to the feature:
view.goTo (geometry);
If you want to make the layer visible after zooming, you can change that line to the following:
view.goTo(geometry).then(function() {
floorOutline.visible = true;
});
That worked. Thank you so much for your help.
Thanks again. Here is my updated code snippet:
function zoomFloorOutline (id)
{
require ([
"esri/rest/query",
"esri/rest/support/Query",
"esri/layers/FeatureLayer",
"esri/views/layers/LayerView"
],
function (query, Query, FeatureLayer, LayerView)
{
console.log ("zoomFloorOutline");
floorOutline.definitionExpression = floorOutline.objectIdField + " = " + id.toString ();
console.log (floorOutline.definitionExpression)
view.whenLayerView (floorOutline).then (function (layerView)
{
var query = floorOutline.createQuery ();
query.objectIds = [id];
query.where = "1=1";
floorOutline.queryFeatures (query).then (function (results)
{
const features = results.features;
var geometry = features[0].geometry.extent.clone ().expand (2);
view.goTo (geometry).then (function ()
{
floorOutline.visible = true;
});
});
});
});
}
How would this work with an array of OBJECTIDs? My JS 3.x looks like this:
function zoomRoomUse (ids)
{
require ([
"esri/tasks/query",
"esri/geometry/Extent",
"esri/layers/FeatureLayer"
],
function (Query, Extent, FeatureLayer)
{
console.log ("zoomRoomUse")
var query = new Query ();
query.objectIds = ids;
var myDate = new Date ();
var myMS = myDate.getMilliseconds ();
query.where = "(" + myMS + "=" + myMS + ")";
roomUseLayer.selectFeatures (query, FeatureLayer.SELECTION_NEW, function (features)
{
var newExtent = new Extent ();
newExtent = features[0].geometry.getExtent ();
for (var k = 0; k < features.length; k++) {
newExtent = newExtent.union (features[k].geometry.getExtent ().expand (15));
}
labelRoom ();
});
});
}
I am having trouble updating it to 4.x
I tried something like this:
function zoomRoomUse (ids)
{
require ([
"esri/rest/query",
"esri/rest/support/Query",
"esri/layers/FeatureLayer",
"esri/views/layers/LayerView"
],
function (query, Query, FeatureLayer, LayerView)
{
console.log ("zoomFloorOutline");
roomsUseLayer.definitionExpression = roomsUseLayer.objectIdField + " IN(" + ids.join(",") + ")";
console.log (roomsUseLayer.definitionExpression)
console.log(ids)
view.whenLayerView (roomsUseLayer).then (function (layerView)
{
var query = roomsUseLayer.createQuery ();
query.objectIds = [ids];
query.where = "1=1";
roomsUseLayer.queryFeatures (query).then (function (results)
{
const features = results.features;
var geometry = features[0].geometry.extent.clone ();
for (var k = 0; k < features.length; k++) {
geometry = geometry.union (features[k].geometry.extent.clone ());
view.goTo (geometry).then (function ()
{
roomsUseLayer.visible = true;
});
}
});
});
});
}
On line 21, instead of:
query.where = "1=1";
I think you need this instead:
query.where = roomsUseLayer.definitionExpression;
Or better yet, you could remove line 21 altogether, because according to the documentation for createQuery, the "where" setting should already be set according to the definitionExpression. Setting it to "1=1" would overwrite that and return all features in the layer.
function zoomTreeTypes (ids)
{
require ([
"esri/rest/query",
"esri/rest/support/Query",
"esri/layers/FeatureLayer",
"esri/views/layers/LayerView"
],
function (query, Query, FeatureLayer, LayerView)
{
treeQueryLayer.definitionExpression = treeQueryLayer.objectIdField + " IN(" + ids.join (",") + ")";
view.whenLayerView (treeQueryLayer).then (function (layerView)
{
var query = treeQueryLayer.createQuery ();
query.objectIds = [ids];
query.where = treeQueryLayer.definitionExpression;
treeQueryLayer.queryFeatures (query).then (function (results)
{
const features = results.features;
var geometry = features[0].geometry.extent.clone();
for (var k = 1; k < features.length; k++) {
geometry = geometry.union (features[k].geometry.extent.clone ());
}
view.goTo (geometry).then (function ()
{
treeQueryLayer.visible = true;
editTreeLayer.visible = false;
// graphics = results.features;
}).catch (function (error)
{
if (error.name != "view:goto-interrupted") {
console.error (error);
} else {
console.log ("Drawing");
}
});
});
});
});
}
I am trying to zoom to a group of queried points but the above code is getting an error.
var geometry = features[0].geometry.extent.clone ();
Is there somethung different with zooming to points?
As seen in the documentation, point objects don't have an extent (the value of their extent property is null). You might want to built a single MultiPoint object from the points returned by your query and zoom to it instead.