I have two different sets of polygon features (398 census tracts and 80 ZIP codes) that each roll up to a larger feature (a US county). Though census tracts are smaller than ZIP codes, they do not roll up (i.e. nest within) ZIP codes.

My question -- is there a method/tool using ArcGIS or QGIS (or any software) to separately group the 398 census tracts and the 80 ZIP codes to form 10 polygon features while minimizing the difference between two resulting sets of 10 polygon features?

To clarify, I want to group the 398 tracts -> 10 features, and then separately group the 80 ZIP codes -> 10 features, so that I have two disparate sets of 10 features each. I want to optimize this grouping so that the overlay between these two sets is maximized (i.e. minimize mismatch).

Here is an image showing what I hope to achieve:

  • Is there anyway you could provide an example (picture,drawing etc.) of what you would like the final output to look like. I am just having trouble visualizing it. Dec 11, 2014 at 17:14
  • Do you also want some criteria like "the polygons should be roughly the same size"? I can imagine a cheap way to do it would be to find the 9 smallest zip codes that roughly match census tracts, and call the large remainder the tenth polygon.
    – phloem
    Dec 11, 2014 at 19:03
  • Thanks phloem for your comment. I would indeed like to set various criteria, but didn't want to complicate the questions. For example, it would be nice to set a criteria for a minimum population in each of the 10 polygons. What I would love is for a tool/method that could generate a list of possible solutions for grouping CTs and ZIPs into these 10 groups, while meeting certain parameters. Then I could manually review the solutions for characteristics that might not be able to be automated (e.g. not crossing city boundaries).
    – Eli Kern
    Dec 11, 2014 at 19:17
  • What i understood, You need two layers (ZIP and Tract) identical. Say you want Tracts' shape should be like ZIP then get rid of the geometry of Tracts and make a layer identical to ZIP and transfer attribute of Tracts into this newly created Tracts layer-then ZIP and Tracts layer will look same. To do this Convert Tracts layer into Point layer and run Update or Identity( i suggest since it is non-destructive) analysis.You may need some dissolve too as per ur need. Now we have ZIP and Tracts layer with same geometry.. but different attribute(i.e of Tracts)..
    – Learner
    Dec 24, 2014 at 21:35
  • I do not know any easy way (e. g. an existing tool) for this task. And I doubt creating one would be faster than handling an input of this size manually. May 28, 2015 at 14:35

3 Answers 3


Since there is no clear or uniform way of defining the resulting polygons, I think you need to create them first how ever you deem fit - using dissolve on any attribute (existing or derived) on census or zip codes layer.

Once you have the resulting polygons, overlay (intersect) each of the layers with it, perform another dissolve and calculate your statistics on other attributes.


If you have the information of the zipcodes and higher heirarchy in your database, then you can do it by combining the column values all together and get a new shapefile.


It seems to me that you want to cluster the census tracts into 10 clusters, with the constraint that the tracts in each cluster are adjacent. If this is the case, you can use the python library clusterPy which implements several different algorithms for spatially constrained clustering.

Your Answer

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

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