Is there an attribute rule for updating / duplicating a polygon if another changes?

1121
2
Jump to solution
10-02-2020 06:21 AM
Kara_Shindle
Occasional Contributor III

I'm reviewing ArcPro for moving our fabric from ArcMap 10.4.  I inherited the ArcMap setup, and I think how we handle some of the different record types is not going to transfer to ArcPro easily.

For example, Parcels that are also Agricultural Security Areas were duplicated from the parcel layer and overlap each other as another subtype within the fabric.  Issue is when someone forgets to update the ASA polygon when the parcel line changes.  

Is there an attribute rule in ArcPro that automatically updates the boundaries of one polygon if another changes?

I'm working on rethinking this workflow, but I have a similar issue with our tax records where we have "Secondary Cards" which are extra records attached to an original tax record (a limitation of our CAMA software means that when they run out of room on a record, they have to create a new one in the software and continue entering data).  The only way we could connect the Tax database to the GIS fabric was to join based on the Tax Record name.  The Secondary cards must have the same boundary as the original tax record, but parcel techs routinely forget to update the Secondary card when they update the original parcel in the fabric.

I'm open to other suggestions to update our workflows as I was never happy with how this was set up to begin with when I was the parcel editor.  Now that I am the manager, I'd like to fix these issues when we move to Pro.  I can also do Python so this option is good too.

Is it possible to change this workflow to something like if someone changes an attribute on a parcel in the Pro fabric (i.e. Does parcel have a secondary card?  If Yes, duplicate parcel into another fabric type and append /02 (user entered number) onto original Parcel ID, and if parcel ever changes, then so does other polygon)

Sorry if this is super confusing, welcome to our workflows!

My idea for the ASAs is to do something similar, but since that data is inputed elsewhere, to set up a portal application so that department can update the ASAs as needed and attribute rules take care of the rest.

0 Kudos
1 Solution

Accepted Solutions
AmirBar-Maor
Esri Regular Contributor

Hello Kara (?!)

Yes - you can have an attribute rule that recalculates the geometry of polygons in a different feature class when the source feature is updated.

You will have to think what you do for Insert (new), Update and Delete events.

You might want to read this blog:

https://www.esri.com/arcgis-blog/products/arcgis-pro/data-management/advanced-gdb-attribute-rules-ed...

 

Here is an example I wrote to update a 'Section' PLSS feature class when another PLSS aliquote is updated:

var twpNo = $feature.TWNSHPNO
var twpDir = $feature.TWNSHPDIR
var rangeNo = $feature.RANGENO
var rangeDir = $feature.RANGEDIR
var sectionNo =$feature.FRSTDIVNO

//The attribute rule is added to the Intersected polygon class on the FRSTDIVNO field on update

//select all other intersected polygons that belong to the same section

//construct a sql query for intersected and sections
var sql = "TWNSHPNO = '" + twpNo + "' And TWNSHPDIR = '" + twpDir + "' And RANGENO = '" + rangeNo + "' And RANGEDIR = '" + rangeDir + "' And FRSTDIVNO = '" + sectionNo + "'";

//dissolve all intersected polygons in the section to get a polygon geometry
var fields = ['TWNSHPNO','TWNSHPDIR','RANGENO','RANGEDIR','FRSTDIVNO', 'GlobalID'];
var intersected = FeatureSetbyName($datastore, "Intersected",fields, true);
var fsIntersected = Filter(intersected,sql);

var SectionGeometry = Geometry($feature);
for (var interPoly in fsIntersected){
SectionGeometry = Union(SectionGeometry, Geometry(interPoly));
}

//find the corresponding section geometry feature
var sections = FeatureSetbyName($datastore, "Sections",fields, true);
var fsSections = Filter(sections,sql);

//get the section row (we should only have one )
var sectionToUpdate = first(fsSections);
var sectionGlobalID = sectionToUpdate.GlobalID;

return {
//we want to just return the value of field `FRSTDIVNO` no change require
"result": $feature.Field,
//this keyword indicates an edit that need to happen, its an array since we can make many edits
"edit": [
{
//the other class we want to edit
"className" : "Sections",
//the type of edit, in this case we want to update so we say `updates`, its an array since we can make many updates
"updates" : [
{
//what feature we need to update? we can either find it by the globalid or the objectId
"globalID" : sectionToUpdate.GlobalID,
//what do we want to update (we can optionally add attributes property and update properties there)
"geometry": sectionGeometry

}
]
}
]
}

View solution in original post

Tags (2)
2 Replies
AmirBar-Maor
Esri Regular Contributor

Hello Kara (?!)

Yes - you can have an attribute rule that recalculates the geometry of polygons in a different feature class when the source feature is updated.

You will have to think what you do for Insert (new), Update and Delete events.

You might want to read this blog:

https://www.esri.com/arcgis-blog/products/arcgis-pro/data-management/advanced-gdb-attribute-rules-ed...

 

Here is an example I wrote to update a 'Section' PLSS feature class when another PLSS aliquote is updated:

var twpNo = $feature.TWNSHPNO
var twpDir = $feature.TWNSHPDIR
var rangeNo = $feature.RANGENO
var rangeDir = $feature.RANGEDIR
var sectionNo =$feature.FRSTDIVNO

//The attribute rule is added to the Intersected polygon class on the FRSTDIVNO field on update

//select all other intersected polygons that belong to the same section

//construct a sql query for intersected and sections
var sql = "TWNSHPNO = '" + twpNo + "' And TWNSHPDIR = '" + twpDir + "' And RANGENO = '" + rangeNo + "' And RANGEDIR = '" + rangeDir + "' And FRSTDIVNO = '" + sectionNo + "'";

//dissolve all intersected polygons in the section to get a polygon geometry
var fields = ['TWNSHPNO','TWNSHPDIR','RANGENO','RANGEDIR','FRSTDIVNO', 'GlobalID'];
var intersected = FeatureSetbyName($datastore, "Intersected",fields, true);
var fsIntersected = Filter(intersected,sql);

var SectionGeometry = Geometry($feature);
for (var interPoly in fsIntersected){
SectionGeometry = Union(SectionGeometry, Geometry(interPoly));
}

//find the corresponding section geometry feature
var sections = FeatureSetbyName($datastore, "Sections",fields, true);
var fsSections = Filter(sections,sql);

//get the section row (we should only have one )
var sectionToUpdate = first(fsSections);
var sectionGlobalID = sectionToUpdate.GlobalID;

return {
//we want to just return the value of field `FRSTDIVNO` no change require
"result": $feature.Field,
//this keyword indicates an edit that need to happen, its an array since we can make many edits
"edit": [
{
//the other class we want to edit
"className" : "Sections",
//the type of edit, in this case we want to update so we say `updates`, its an array since we can make many updates
"updates" : [
{
//what feature we need to update? we can either find it by the globalid or the objectId
"globalID" : sectionToUpdate.GlobalID,
//what do we want to update (we can optionally add attributes property and update properties there)
"geometry": sectionGeometry

}
]
}
]
}

Tags (2)
Kara_Shindle
Occasional Contributor III

Thank you for this - I'm somewhat new to Arcade so I will have to go through this in-depth when I have time.  Thanks!

0 Kudos