I have two layers: A layer of all tax parcels, and a layer of a subset of all the tax parcels.
I am trying to use Intersect in arcade to return a featureSet that I can then use to inject a field from the subset layer in the pop-up of the layer with all the tax parcels. However, it is returning Null field values, even though there are geometries that clearly overlap (as they are identical). Please see below:
var parcel = Intersects(FeatureSetByName($map,"Name of layer with subset of all tax parcels"), $feature);
for (var f in parcel){
return f.NameOfField
}
returns empty result (shown in attached photo).
Any obvious reason someone can see this is happening?
Solved! Go to Solution.
When you test your Arcade expression, it only checks one feature (I think it's the first). So if that feature doesn't intersect a feature of your filtered layer, you will get an empty intersect feature set. Your loop will run 0 times and then the expression will return null. If you call First() on an empty feature set, the result is null, which is why you get the ExecutionError when you try to return null.Field
Something like this should do the trick:
var filtered_parcels = Intersects(FeatureSetByName($map,"Name of layer with subset of all tax parcels"), $feature);
var parcel = First(filtered_parcels) // get the first feature
// if filtered_parcels is empty, parcel is null
// in that case, return a default value
if(parcel == null) {
return "No intersecting subset parcel found."
}
// else return the field value
return parcel.NameOfField
When you test that expression, it should show the default result. When you actually open a popup, it should show either the default result or the field of the subset layer, depending on whether there is a subset parcel intersecting the queried feature.
Since they are identical, there should only one parcel overlapping at a time, so grab the first one.
var parcel = First(Intersects(FeatureSetByName($map,"Name of layer with subset of all tax parcels"), $feature))
return parcel.NameOfField
R_
Hello, thanks for your reply. Please see below the new error that is thrown from this:
Execution Error:Runtime Error: Cannot call member method on null. Name of Field
Did you make sure the FeatureSet you're retrieving contains any features?
var test = FeatureSetByName($map,"Name of layer with subset of all tax parcels");
console(Count(test));
You can always test for Null/Empty values and proceeded accordingly:
var parcel = First(Intersects(FeatureSetByName($map,"Name of layer with subset of all tax parcels"), $feature))
if (IsEmpty(parcel.NameOfField)){
return Null
}
else {
return parcel.NameOfField
}
But, if you know there is overlap, something is not right as it should be returning something. As suggested by @KenBuja above, can help to get count, etc. using the Console() option that will output to the Messages window in the Arcade editor.
R_
When you test your Arcade expression, it only checks one feature (I think it's the first). So if that feature doesn't intersect a feature of your filtered layer, you will get an empty intersect feature set. Your loop will run 0 times and then the expression will return null. If you call First() on an empty feature set, the result is null, which is why you get the ExecutionError when you try to return null.Field
Something like this should do the trick:
var filtered_parcels = Intersects(FeatureSetByName($map,"Name of layer with subset of all tax parcels"), $feature);
var parcel = First(filtered_parcels) // get the first feature
// if filtered_parcels is empty, parcel is null
// in that case, return a default value
if(parcel == null) {
return "No intersecting subset parcel found."
}
// else return the field value
return parcel.NameOfField
When you test that expression, it should show the default result. When you actually open a popup, it should show either the default result or the field of the subset layer, depending on whether there is a subset parcel intersecting the queried feature.
It worked. Thank you.
@JohannesLindner I am using your code in a similar fashion, , it's working great if I click inside my Zone (blue area) but if I click outside I get the following warning message. Technically, since I don't have a Zone to intersect I should be getting a "NULL" value correct?
What am I missing?
Thanks!
// Get other layer from datastore
var other_layer = FeatureSetByName($map, "Tree Inventory Areas")
// Intersect layer and feature, use `First` to take the top feature
var intersectFeat = Intersects($feature, other_layer)
var xs_feat = First(intersectFeat)
var Zone =xs_feat["zone"]
var noZone = "999"
if(xs_feat == null) {
return noZone
}
//else
return Zone
Sorry, I solved my problem:
// Get other layer from datastore
var other_layer = FeatureSetByName($map, "Tree Inventory Areas")
// Intersect layer and feature, use `First` to take the top feature
var intersectFeat = Intersects($feature, other_layer)
//check for intersects
var intersect_count = Count(Intersects(other_layer, $feature))
var noZone = "999"
if(intersect_count ==0) {
return noZone
}
var xs_feat = First(intersectFeat)
var Zone =xs_feat["zone"]
//else
return Zone