I recently posted about getting help with code that returned a Y/N value based on if two polygon features intersected. The code worked great, but the two layers don't share perfectly aligned boundaries. One has a more "jagged" boundary that is visible when zoomed, causing it to flag as an intersection when it is not supposed to be. Any advice on a workaround? Would the "within" or "contains" function be more useful? Is there a way to buffer the boundary so that the slight mis-alignment doesn't produce an incorrect result?
The larger polygons in orange are watersheds, and the smaller green polygons are impaired catchments. If there is even a single impaired catchment within a given watershed, I want to populate the field "is impaired" with "Y", or "N".
My current code:
var ImpCatchments = Intersects(Featuresetbyname($datastore, "attains_au_catchments_Impaired"), $feature)
var cnt = count(ImpCatchments)
IIF(cnt > 0, "Y", "N");
Any help would be very much appreciated!
You can use a small negative buffer:
var ImpCatchments = Featuresetbyname($datastore, "attains_au_catchments_Impaired")
var IntImpCat = Intersects(Buffer($feature, -10, "meters"), ImpCatchments)
var cnt = count(IntImpCat)
IIF(cnt > 0, "Y", "N");
This is what I was looking for! Though, I received an error, and it doesn't seem to be doing what is intended. The initial error I got was that "search geometry cannot be null". I assumed that maybe the buffer created null values, so I added and if-else statement to negate the error. Even with the buffer, I am still getting "Y" values for intersection where I shouldn't. I even expanded the buffer up to -40 meters with no success.
Code I am using:
var ImpCatchments = Featuresetbyname($datastore, "attains_au_catchments_Impaired")
var IntImpCat = Intersects(Buffer($feature, -20,"meters"),ImpCatchments)
If(Geometry(Buffer($feature, -20,"meters"))==null)
{
return "Geometry Null";
}
else
{
var cnt = count(IntImpCat)
IIF(cnt > 0, "Y", "N");
}
Null geometries are created when you try to buffer too much. You probably have small polygons in your fc. In these cases, the buffer of one side would end up on the outside of the polygon on the other side, resulting in a null geometry. This is difficult to explain, so here is a quick sketch:
On the left, a polygon (black) and a negative buffer (red) with appropriate buffer distance (blue).
On the right, the buffer distance is too big for the polygon, so the buffer's sides would end up outside of the polygon, creating a nonsensical geometry (not saying that the buffer algorithm actually works this way, just as a concept).
tl;dr: use an appropriately small buffer size or exclude polygons with small area from the calculation.
To use your check, you have to put it before the actual error:
var ImpCatchments = Featuresetbyname($datastore, "attains_au_catchments_Impaired")
var NegBuffer = Buffer($feature, -20, "meters")
if(NegBuffer == null) { return "Polygon too small" }
var IntImpCat = Intersects(NegBuffer,ImpCatchments)
var cnt = count(IntImpCat)
return IIF(cnt > 0, "Y", "N")
Thank you for the explanation! Though, I get all null values when I run that code. Even for my largest polygons that shouldn't pose a problem...
Hmm... Difficult to say what's wrong without the actual data. Would it be possible to send me an extract of your data? Either here or in a pm.