From time to time, even the experienced GIS users (my 17 years in GIS allow me to call myself one) come across hidden tools and workflows that have existed in ArcGIS for Desktop for ages, but have never been used.
Recently, a couple of my clients asked me how to solve the following problem. Imagine you had a polygon feature class representing cadastral boundaries (i.e. properties) and another one representing zones (i.e. zoning). One property can fall within several adjacent zoning polygons, which effectively defines the cardinality (or the type of the relationships between features in both datasets) as One to Many (Properties to Zones).
The following simplified graphic illustrates the case (very schematically, I must add):
What if you were provided with the task to transfer the attribute of the “Zone code” to the attribute table of the property boundaries?
Well, obviously some of the properties intersect two zones and in the real-world example they can intersect even more zones.
If you use the Spatial Join tool with the following parameters (even if you try to use both types of relationships available in the tool)
You will end up with having multiple overlapping polygons:
Overlay tools won’t be of help either. If you use Union, you will end up with even more polygons and you’ll get stuck trying to aggregate the resulting polygons using Dissolve (which won’t work because Zone is a text field and you can’t really use a text field in statistical calculations).
You can try Python and that’s what I was about to do; however, it turned out that the Spatial Join tool which I had been using for many years contains a hidden function. That function allows to list the attribute values from a particular field (of the feature class that you’re joining to the target layer) and enter them into a designated field using a user-defined delimiter.
So, this is how this works:
- In the Spatial Join tool’s dialog navigate to the Zoning field in the dataset that is being joined and Right-click on it. Choose Properties.
- Set the following:
- Length: set the value which will be capable of storing the appropriate number of characters
- Merge Rule: use Join
- Delimiter: use any delimiter you like
- Set the cardinality in the Spatial Join tool to “One to One”
- Run the tool.
The resulting dataset should display zones that each of the property boundary polygons intersect, stored as text values separated by the delimiter of your choice.
Little things like this can save you a lot of time that you could otherwise spend on writing python scripts or changing the attributes manually. I hope you will find this workflow useful.