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;
});
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.