[GIS] How to join a buffer layer to the layer it was created from

arcgis-desktopattribute-joinsbufferlayersspatial-join

I have two relevant layers for this problem:

  1. Real estate parcels (point data)
  2. Multiple ring buffer layer – contains multiple buffer rings around each particular real estate parcel. (0.5, 1, 1.5, and 2 miles).

There are 2900 real estate parcels, each one a multiple ring buffer layer containing 4 quartiles. The buffer layer table has 2900*4 entries since each parcel has 4 buffer layers.

I need to join the buffer layers with the parcel they were created from, and there doesn't seem to be an easy way. Any tips on a useful tool?

Best Answer

I did not know that the FID was not preserved by this tool. Strange. As Chris recommended, calculate a unique ID for each point before you use the buffer tool.

The unique ID I use for all my points is a concatenation of the X and Y coordinates in a text field I call XY_LINK. You should be able to create a join field without creating any new feature class. Create a text field that is long enough to hold 2 coordinates and 4 curly brackets (not a comma, since I find that causes Join issues). Then do a Python Field Calculation on the points like this (this works for State Plane coordinates):

Parser: Python

Show Codeblock: Checked

Pre-Logic Script Code:

def Output(FirstPoint):
  FPX = round(float(FirstPoint.X), 4)
  FPY = round(float(FirstPoint.Y), 4)
  return "{%(FX)012.4f}{%(FY)012.4f}" % {'FX': FPX, 'FY': FPY}

Your XY_LINK Field Name: Output(!Shape.CENTROID!)

This creates a 28 character point descriptor that is unique if no points overlap. An example from my data is: {6130961.7120}{2261115.2232} You may have to mess with the formatting of the number to work for your coordinate system depending on the resolution and tolerance of your layers. 012.4f might be 015.8f or something else that works for your data. (Note it added a trailing 0 to the X coordinate so that the numeric digits of each coordinate are always 12 characters so that they can be always be parsed from the same character position in every string and they sort numerically)

Index the XY_LINK field in both the point layer and the polygon layer and you should find that the correct point will show up when you make the polygon layer the target and the point layer the join layer. Or perform a relate from your point to your polygons to see if they select the correct set. The tolerance adjustment of the buffering process may make the rounding not work, but if this XY_LINK ID is calculated on the points before you do the buffer it provides a unique ID that also tells you if the point still exists in that location using Joins and standard SQL. You can also use the FID in a static long field as a secondary join to identify points that were moved rather than created new (i.e., the XY_LINK won't match if you recalculate them but the FID will).

Related Question