I have a shapefile of Montreal census tract boundaries (below left), where for each tract I've joined data for 17 census variables including population, land area, total private dwellings, etc.

enter image description here enter image description here

I also have a shapefile of Montreal neighborhood boundaries (above right) which are larger than the census tracts. My goal is to join the attributes of the layers so that I have a resulting layer of census tracts, where each tract now has a neighborhood name associated with it. I will then use this layer to aggregate data by neighborhood.

The big problem here is that the boundaries of the census tracts sort of align with the neighborhoods, but NOT perfectly. Using tools like intersect isn't working because the census tracts that are not aligned perfectly end up getting repeated in the final layer for every neighborhood that they cross into (because they don't neatly fit into a single neighborhood).

Is there anything I can do to solve these boundary issues or any other tool that could help with this?

  • 2
    It depends on what aggregation method you would find acceptable. You could convert your tracts to centroids and join to the neighborhoods (or vice versa) and aggregate the numeric statistics using the sum of all centroids that fall within the neigborhood. A more complicated option would to determine the proportions of each tract within the neighborhoods and weight the numeric attributes from each tract proportionally. Sep 25, 2019 at 20:34

1 Answer 1


Lets begin with something we'll call pseudo_Census_Tracts and some poorly aligned Neighborhoods

Something reminiscent of 1990 Tiger Line Data

Gonna' need some points on those Census_tracts.

ArcToolbox->Data Management Tools->Features->Feature To Point

ArcToolbox to the rescue once again

For the Input Features choose Census_Tracts and for the output Feature class I called it pseudo_Census_Tract_Points_2. Run the tool and open the atrribute table for the new feature class. You should be looking at something similar to:

new centroid points created

Notice the newly created point feature class has all of the attributes from the Census_Tract polygon. At this point it would safe to delete all columns except ORIG_FID as this is the means by which we will table-join back to pseudo_Census_Tracts after a quick spatial-join to grab the Neighborhood polygon data.

Time for that spatial join. In the table of Contents, right click the new pseudo_Census_Tract_Points_2->Joins and Relates->Join:

context menu to spatial join

You are presented with the 'Join Data' Dialog Box.

We need to change the first option in the drop down box to: 'Join data from another layer based on spatial location'

change to spatial join

Now set arguments:

  1. Neighborhoods
  2. It Falls Inside
  3. new feature class name for the spatial-join (here I named it pseudo_Census_Tracts_with_Neighborhood)

configure join options and output

Do I really need to say 'Click OK'? Bear in mind, this spatial join will produce a new point feature class(pseudo_Census_Tracts_with_Neighborhood) whose new attributes include those of the Neighborhood in which they fell.

spatial join result

At this point, you can see the ORIG_ID that will provide a link back to the target Census_Tract polygon and the Neighborhood_Name_1(and all other attributes from Neighborhood as well) that was appended from Neighborhoods as a new attribute during the spatial join. Thus this feature class alone contains everything required to update our Census_Tract polygons.

Time for a table-join:

Right click your pseudo_Census_Tracts layer in the table of contents->Joins and Relates->Join.

table join polygons to points

Again you are presented with the 'Join Data' dialog box, where we need to change the join type back to 'Join attributes from a table'

change back to table join

Then set the join options to:

  2. pseudo_Census_Tracts_with_Neighborhood
  4. Check Keep all Records

configure table join

Select OK and open the attribute table for the original pseudo_Census_Tracts polygons layer.

table join result

At this point, we just need to perform a field calculation on the original polygons to copy the neccessary data from the joined columns in pseudo_Census_Tracts_with_Neighborhood. Find the column from the orignal pseudo_Census_Tracts table that you wish to calculate the value on. Right click on the column and select Field Calculator.

begin field calculation

In the Field Calculator dialog box, select the name of the Joined field that contains the data you wish to copy into the column of your pseudo_Census_Tracts polygon feature layer. *This column should be prefixed with the name of the joined table containing the actual data (here I've chosen pseudo_Census_Tracts_with_Neighborhood.Neighborhood_Name_1 as my data column)

select joined field data

After the field calcultion is comeplete, you can Remove all joins and use the new data within your polygon feature layer. Here I've symbolized the Census_Tracts using the new Neighborhood_Name.

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.