We're using ArcMap 10.0 sp5, creating a tool in c# using the ArcObjects sdk.

Is there a built in function or simple set of steps that calculates the area of each feature of a polygon layer within a specific extent? What we want to do is calculate the area inside a set of bounds for each of the polygon layer’s features that reside within those bounds (defined by minimum and maximum X and Y). This process would be repeated multiple times, as we traverse a grid. Ideally, the function would also return the area not occupied by any features.

For example, consider this polygon layer in which there are 3 polygons (red, blue, and geen): three polygons. one red, one green, and one blue

If we imagine splitting that layer into a grid:

same three polygons, with a gridded overlay

Looking exclusively at one cell of the grid:

grid with one cell highlighted, arrow indicating a second image which is a close-up view of the cell. The cell contains pieces from all the red and green polygons, as well as the entire blue polygon. There is space not occupied by any of the polygons. The polygons do not overlap.

We would like to get a measurement of the area that each feature occupies within that cell, along with a measurement of the “empty” area of the cell. The measurements could be in actual area (square feet, square meters, etc.) or merely a percentage of the area of the grid cell (as shown below).

close up of grid cell, showing percentages on each polygon piece and a percentage on the empty space. Red is 35 percent, green is 11 percent, blue is 10 percent, and the empty space is 44 percent

Note: these percents are for demonstration purposes only and are not necessarily to scale.

We'd also like to keep in mind the case of overlapping polygons. Consider this alternate polygon layer in which the blue polygon resides entirely within the red polygon:

close up of grid cell, this time with the blue polygon completely inside the piece of the red polygon. The image shows percentages on each polygon piece and a percentage on the empty space. Red is 35 percent, green is 11 percent, blue is 10 percent, but the empty space is now 54 percent

In this case, the sum of the area covered by each polygon would be greater than the area covered by the grid cell. As shown in the illustration above, red and blue both occupy the same percentage area as in the first example, but their areas are not distinct. In this case we would need to receive the values adding up to 110%, or a new set of percentages along the lines of:

  • Red = 31.8181818%
  • Green = 10%
  • Blue = 9.0909091%
  • Empty = 49.0909091%

We could either calculate the percentage as a fraction of the total polygon areas (including the "empty" polygon) or as a fraction of the grid cell area.

If a function exists that performs the calculations described above, we would need to know exactly what the result of that calculation gives us.

Our current thought is to follow the workflow below, but we wanted to see if anyone had better ideas.

  1. Create a fishnet of the desired cell size and extent (to handle multiple grid cells at a time)
  2. Union the fishnet with the polygon feature class
  3. Calculate the area of all resultant features
  4. Traverse the resultant features (by grid cell) to read the area of each unioned feature manually. (In this case, features without an FID from the original polygon layer would be the area not occupied by any features)
  5. Sum the area of all features in the cell
  6. Compute the percentage for each feature based on the calculated sum from 5.
  • 1
    Can you add a picture please? – Emi Feb 16 '13 at 0:09
  • 1
    I edited the question to incorporate images throughout. Does this help visualize the problem? – BDA Feb 19 '13 at 18:22
  • 2
    Rather than "Traversing the resultant features", could you treat it as a purely SQL based problem? You have everything you need in the table at that point don't you? Can you use a DBMS? – Kirk Kuykendall Feb 19 '13 at 19:04
  • That's a great point. I'm not sure how much control I have with querying the data, but that would almost certainly be faster than trying to read each feature one at a time. If nothing else, I could probably export to a table and query it by other means. Definitely something I'll keep in mind, thanks! – BDA Feb 21 '13 at 17:18

I realize that this an answer to an older thread but if you've upgraded to 10.1, check out the Tabulate Intersections tool in the Analysis toolbox (ArcInfo level).

I don't think it handles empty spaces but in theory you could create a bounding box polygon, clip out your original data, merge the clip with your original data and assign the clip with dummy attribute(s) that are easily filtered.

  • I tried this as I have the same question but it gives me percentages above 100 and also areas for a property that don't add up. I have tried a 10m tolerance. I am trying to see how much of each soil type there is in all properties in a project area. – GeorgeC May 12 '14 at 0:34

Your Answer

