Lab 05

Environmental distress in Virginia

An introduction to vector analysis
Author

Ian Spangler

Published

September 28, 2026

Modified

October 22, 2026

Assigned Due Submit

9/28/26

10/9/26

Section 1, Section 2

This lab introduces key concepts in vector analysis through a study of environmental distress in Virginia. We’ll analyze point locations of four kinds of environmental stressors across the commonwealth: surface mining, wildfire occurrences, dam inundation, and data centers. Using geoprocessing tools like Summarize Within, as well as a bunch of selection queries and some field calculation, we’ll produce a map of ranked distress zones by census tract resembling the one below:

Figure 1: Example map

At the end of the lab, you’ll submit your own version of this map, as well as and answers to the questions throughout.

Before you proceed…

Keep up the good work, make a good workspace!

Download the data

We need a few different datasets for this week’s lab. For base mapping and spatial aggregation:

  1. Virginia counties
  2. Virginia census tracts

The four environmental distress criteria we’ll use include:

  1. Surface mineral mining (as permits)
  2. Wildfire occurrences
  3. Dam inundation (e.g., flooding)
  4. Data centers

You’ll get counties and census tracts the same way you did for Lab 04. For the others, follow the steps below. Just a heads up that we’re going to be working with some web GIS data formats. Web formats like feature services load seamlessly into ArcGIS Pro without requiring you to download a large dataset. Since all the datasets we are going to work with this week are on the bigger side (for vector data), we’ll test the process of bringing them into ArcGIS Pro as feature services and then exporting them to the local geodatabase as feature classes. Basically, this saves the step of downloading a big dataset to your downloaded-data folder.

Add counties and census tracts

First, open Lab 04 and export the % of households making less than $50,000/year. Name it “vaIncomeTracts” and save it to your Lab 05 geodatabase!

Then, add the counties data by searching “u.s. counties & equivalent entities” in the Living Atlas tab of the Catalog. Add them to the map—and don’t forget to put a definition query where STATE = ‘51’.

Finally, update the map’s projection to “Projected Coordinate System NAD 1983 StatePlane Virginia South FIPS 4502.”

You can turn off or delete the default basemaps. My project now looks like this:

Figure 2: Tracts and counties

Get wildfire data

There are tens of thousands of wildfires in Virginia every year. Karen Short, through the US Department of Agriculture, maintains an extraordinary archive of wildfire data across the United States randing from 1992 to 2024: https://www.fs.usda.gov/rds/archive/catalog/RDS-2013-0009.7

To load this data into ArcGIS Pro, click the link above > click the link at “RDS-2013-0009.7_Data_Format2_GDB.zip (157.8 MB; Checksum)”. This will start downloading a large, zipped geodatabase. Once it has downloaded, drag it into your project workspace and right-click > “Extract All”. You should be able to navigate to a new feature class called Fires inside of a geodatabase called FPA_FOD_20260615.gdb (if you don’t see it, double-check your project directory structure, you may need to right-click the Folders tab in the Catalog > “Add new folder connection”):

Figure 3: Fires in the catalog

Add the Fires feature class to your project. A zillion dots will appear. Let’s filter them to Virginia:

  1. Right-click Fires in the Contents pane > “Properties”
  2. Click “Definition query” > “New definition query”
  3. Make a query where the state is equal to “VA,” click “Apply,” and click “OK”

Now you should see something like this:

Figure 4: Fires in Virginia

Get mineral mining permits

Mine operators are required by federal and state law to get permits for their mining activities. You can get data about mining from a bunch of different places: The US Department of the Interior, the Virginia Department of Energy, and the Department of Labor. However, many of these publish mining data at the scale of the county, and we want data at the scale of specific mines.

The Virginia Department of Energy (VDOE) maintains a handy resource about mine land repurposing and mapping. From there, you can access an Esri Feature Service—basically, this is just a spatial data layer optimized for the internet—of all active coal surface mine operation (CSMO) permits.

  1. Click the link at “Virginia Energy REST Services” (a REST service is a method for exchaning data over the interent; geospatial data is commonly exchanged via REST)
  2. Click the first link: “DMLR/CurrentPermits (FeatureServer)”
  3. Click “CSMO Permit Boundaries”
  4. Copy the URL
  5. Load it into ArcGIS Pro by pasting the URL into the input box of the the “Add data from path” button (in the “Map” tab, click “Add Data from Path”—if you get stuck, see these instructions)

Get dam inundation data

You can get point data for dam inundation zones in Virginia by clicking this link > “Download” it as a shapefile.

Extract the zipped file’s contents, in your downloaded-data folder or equivalent and load it into ArcGIS Pro.

Get data centers

Virginia is also known as “Data Center Alley.” As data centers become more common forms of development, it’s important to understand their distribution. Researchers have published an open source data center atlas using data from OpenStreetMap, which is like Wikipedia for maps. To download the data center location data, go to this link (https://data.msdlive.org/records/p147s-4h760), scroll to the bottom of the page, click the filename im3_open_source_data_center... and click the download button:

Figure 5: Download data centers

This will download a file format that is probably new to you: a geopackage. Move this into your workspace.

Geopackages are like geodatabases, except open-source (e.g., not a proprietary format maintained by Esri). They can contain point, line, and polygon data all at once, which this geopackage does. Add the main.building feature to your map.

Before proceeding to the next section, create a definition query for both of these so that only polygons inside of Virginia appear.

Project everything

You should now have all six layers loaded for your analysis:

  • Virginia counties
  • Virginia census tracts
  • Surface mineral mining (as permits)
  • Wildfire occurrences
  • Dam inundation (flooding)
  • Data centers

They do not all share the same projection, so we need to project them before moving on.

  1. Open the “Batch Project” tool, either using the Command Search bar or the Geoprocessing pane
  2. Add all of your layers as input feature classes. Make sure you have left the “Use the filtered records” option checked for both Fires and Counties!
  3. Set the output workspace to your Lab 05 geodatabase
  4. Set the output coordinate system to the current map, or “NAD_1983_StatePlane_Virginia_South_FIPS_4502_Feet”

When your options resemble the screenshot below…

Figure 6: Batch Project

… click “Run.” It might take a minute. By the end you’ll have six new layers in your Lab 05 geodatabase.

Rename some layers

When you use the “Batch Project” tool, you can’t assign output names of your choosing to individual files/layers. This means you may want to rename the vaTractIncome_1 and main_buildings layers. By right-clicking these feature classes and selecting “Rename,” I’m going to rename them vaTractIncome_projected and dataCenterBuildings, respectively.

Remove your six current layers from the map and add the newly projected layers. You should see something like this:

Figure 7: All six layers in the map

Before proceeding, Put the Counties layer on top, giving it an empty fill and a 0.2 pt gray outline.

Wait, what actually is vector analysis?

Vector analysis involves doing spatial operations on vector data. You can divide vector analysis into two kinds, single layer and multilayer:

Table 1: Typology of vector analyses
Type Definition Example Common Operations
Single layer Calculations on one vector layer Field calculator workflows to combine census variables (e.g., Lab 04) Dissolve, merge, append, select
Multilayer Overlaying datasets to see how they affect each other, driven by a research question Finding Virginia’s most environmentally distressed census tracts Union, intersection, symmetrical difference, identity

Frequently, single layer vector workflows are used in the commission of multilayer ones. Particular kinds of vector analysis include suitability analysis (what’s the optimal location for New York City’s first Waffle House?), proximity analysis (how should a region plan for emergencies like hurricanes, floods, or nuclear attacks?), overlay analysis (how has cropland in Uganda changed between 2010 and 2020?), and network analysis (what’s the fastest rescue path by foot to an injured hiker stranded on the AT?).

Figure 8: Vector analysis

That image is from a handy online textbook with great descriptions of vector analysis.

Often times, vector analysis will require you to reduce complex processes into simple, ranked categories. That’s ultimately what we’ll be doing in this lab.

Map the data

In this section, we’ll do a series of spatial joins to understand how these environmental stressors are geographically distributed.

Mapping fires

Let’s start with the Fires data, just so we can get them off the screen:

  1. In the Geoprocessing pane, find the “Summarize Within” tool and click it. This tool overlaps two vector features and summarizes the attributes of one inside the other; it is a spatial join tool
  2. Use the following parameters:
    1. Input polygons = vaTractIncome_projected
    2. Input summary features = Fires
    3. Output feature class = vaTractIncome_summaryFires (this should save into your Lab 05 geodatabase)
    4. Summary fields = set the FIRE_SIZE field to SUM (according to this data’s metadata, FIRE_SIZE is an “estimate of acres within the final perimeter of the fire”—this might be helpful to have)
Figure 9: Parameters for the Summarize Within tool

Click “Run.” It may take a minute but you’ll get a new census tract layer containing two new fields: 1) Sum FIRE_SIZE (a summed estimate of acres within the final perimeter of the fire) and Count of Points (a count of all 41,373 wildfires across the commonwealth).

If you’re working with quantitative data, you can use the “Summary Fields” section to do mathematical operations on input fields. If you’re working with qualitative or categorical data, you can use the “Group Field” option to get summary data.

Question
Q1

Using the “Sort” feature in the attribute table…

  1. what is the name of the county with the largest Sum FIRE_SIZE value and where is it located?
  2. what is the name of the county with the largest Count of Points value and where is it located?

Turn all your layers except for vaTractsIncome_summaryFires and symbolize it with graduated colors, in 5 classes, using the Count of Points field.

Then, do the same thing with the field value set to Sum FIRE_SIZE.

Question
Q2

In 2 sentences, describe the differences between the Count of Points symbolization and the Sum FIRE_SIZE symbolization, with a focus on where high values cluster for each field.

At this point, here’s what my map looks like:

Figure 10: Fires in Virginia by census tract

I’m actually going to remove Fires from the map now that it is joined to the census tracts data.

Remap the attribute tables

I can already tell that the attribute table for our vaTractIncome_summaryFires layer is going to to get unwieldy if we don’t get ahead of this thing now.

Here’s what each of those variables mean (this information is in a file called ACSST5Y2024.S1901-Column-Metadata.csv, probably in your Lab 04 workspace):

Table 2: Variable metadata for the census tracts layer
Code Meaning
S1901_C01_001E Total
S1901_C01_002E Less than $10,000
S1901_C01_003E $10,000 to $14,999
S1901_C01_004E $15,000 to $24,999
S1901_C01_005E $25,000 to $34,999
S1901_C01_006E $35,000 to $49,999
S1901_C01_007E $50,000 to $74,999
S1901_C01_008E $75,000 to $99,999
S1901_C01_009E $100,000 to $149,999
S1901_C01_010E $150,000 to $199,999
S1901_C01_011E $200,000 or more
S1901_C01_012E Median income (dollars)
S1901_C01_013E Mean income (dollars)
S1901_C01_014E Household income in the past 12 months

We’re going to remove the fields we don’t need and rename the ones that we do.

  1. Open the attribute table for vaTractIncome_summaryFires
  2. Right-click the menu button on the top-right > click “Fields view”
Figure 11: Fields view
  1. Now it is easy to uncheck a ton of fields at once, without actually deleting them from our data.
  2. Click the checkbox next to “Visible” to uncheck everything
  3. Scroll through the attribute table and check the following fields to be visible again, and where appropriate, rename the “Field Name” or “Alias” value:
    1. GEOID
    2. GEOIDFQ
    3. ALAND
    4. AWATER
    5. S1901_C01_001E => rename this ALIAS to “totalHouseholds”
    6. S1901_C01_0012E => rename this ALIAS to “medianIncome”
    7. S1901_C01_0013E => rename this ALIAS to “meanIncome”
    8. sum_FIRE_SIZE => rename this FIELD NAME to “acresBurned”
    9. Point_Count => rename this FIELD NAME to “totalFires”
Field aliases

Field aliases are helpful ways to organize your fields. While fields in attribute tables must follow certain rules about naming conventions, aliases are much more loosey goosey; you can kind of name them whatever you want. Take advantage of that!

When you’re done, click into the “Fields” tab of the Ribbon > click “Save” in the “Manage Edits” group:

Figure 12: Save edits to fields

The attribute table should now resemble:

Figure 13: Attribute table, looking nice and trim

Mapping dams

Moving forward, the game plan is simple: continue summarizing our distress criteria one by one, until they are all included in the same layer. Let’s do DamPoints.

First, remap the attribute table so you can only see DamName and HazardClas. Right-click the HazardClas field > “Visualize Statistics”; you’ll see that there are 9 fields, most of which have an “Unknown” hazard value. Other values include “High,” “Low”, and “Significant,” with a few variations in each:

Figure 14: Counts by HazardClas

We are going to reclassify these fields as simple integers so we can combine them with other vector layers later on. This process of reclassification is super important for any geospatial analysis because it allows you to take disparate variables and values and combine them according to a set of criteria that you, the analyst, determine. To do so, we’ll use Select by Attributes and the Field calculator to turn High into 2, Significant into 1, and everything else into 0.

  1. Open the “Select by Attributes” tool and construct the following query:
    1. Where HazardClas is equal to “High”
    2. Or HazardClas is equal to “High, Prelim”
    3. Or HazardClas is equal to “High, Special”
Figure 15: Selection query
  1. Click “Apply”—you should have 606 selected records
  2. Now, click the “Calculate” button at the top of the attribute table. This open a minimal version of ArcGIS Pro’s Field Calculator
  3. Change the data type to short integer; change the field name to HazardRank (this will create a new field of that name); and type 2 in the input box, like so:
Figure 16: Field calculator
Change the field name and data type before you run!

If you don’t change the field name to HazardRank before you run it, you could accidentally overwrite data in the source field—no good, very bad! And if you don’t set the data type to short integer, your numbers will be text.

  1. When you’re certain that the calculation looks right, click “Run” and you should see a new field appear with 2 values for all records where HazardClas records included High
  2. Now, invert the selection with the “Switch selection” button at the top of the attribute table:
Figure 17: Switch selection
  1. Calculate the new selection—which should be 3,146 records—as 0, ensuring that the HazardRank field is still the target of your calculation
  2. Now, we just have to calculate the “significant” hazard dams. Using Figure 15 as a guide, try to do this—you should end up with 260 records total—then calculate their value as 1.

Now we have a numerically ranked field for flooding hazard among dams in Virginia. Clear your selection and summarize DamPoints within the existing vaTractsIncome_summaryFires layer:

  1. Input polygons = vaTractIncome_summaryFires
  2. Input summary features = DamPoints
  3. Output feature class = tractsIncome_firesDams in Lab 05 geodatabase
  4. Summary field as HazardRank and statistic as Sum

Now you can remove DamPoints and vaTractIncome_summaryFires from the map.

Bivariate symbolization sidequest

So far in class, we have mostly used symbolization techniques like graduated colors and proportional symbols—but right now, we have a perfect opportunity to test bivariate symbolization, a means of showing two variables at once. This is helpful for showing how two data points may be related to one another, but bivariate maps are harder to read and contain less information, so that’s your trade off.

Try it out:

  1. Select tractsIncome_firesDams > Symbology
  2. Set primary symbology to “Bivariate colors” and match these properties:
Figure 18: Bivariate symbology properties
Question
Q3

According to the bivariate map, where do dam inundation risk and wildfires tend to colocate?

CSMO permits

Let’s move on to coal surface mining operation (CSMO) permits (turn the CSMO_Permit_Boundaries and move it above the tractsIncome_firesDams layer in your Contents pane). Run another Summarize Within using these parameters:

Figure 19: Summarize within for CSMO data

Pause to clean up your attribute table again, it is already getting too busy:

  1. Open the attribute table for tractsIncome_firesDamsCSMO
  2. Open “Fields” view (see Figure 11)
  3. Scroll to the bottom and update your fields like so, unchecking visibility for the newest Shape_Length and Shape_Area fields, as well as renaming field aliases:
Figure 20: Updating field names and aliases

When you’re done:

  • click “Save” in the “Fields” tab of the Ribbon
  • remove tractsIncome_firesDams from the Contents pane
  • move on to the next and final summarize within!

Data centers

Run a final Summarize Within tool on the dataCenterBuildings layer. It should resemble:

Figure 21: Summarize within for data centers layer

Rank it all together

Reset the symbology for your new layer—which should be titled something like tractsIncome_firesDamsCentersCSMO—to single symbol, move the Counties layer on top of everything, and then remove all the layers except for those you.

Open the attribute table of the firesDamsCentersCSMO layer and fix the fields so that the new Shape fields aren’t visible and the new sum/count fields have sensible names.

When you’re done, you should see something like this:

Figure 22: Fixing fields

We’re now going to get some summary statistics on each of our 4 environmental distress criteria, plus median income for good measure, for a total of 5 ranked variables that will collectively inform our index of environmental distress.

I’ve gotten the values for you, but you should know how to do it:

  1. In the attribute table, right-click on the median household income field
  2. Then, from the list of fields on the left, right-click the acres burned, dams hazard rank, CSMO acres permitted, and data centers square feet, select “Add to statistics and calculate” for each of them

Here’s the logic we’ll use, based on median/mean values for our distress criteria. At the end, we’ll add these all together, and the lower the overall value, the lower the environmental distress:

  1. If median income > 86250, rank = 0; else, rank = 1
  2. If burned acres >= 235, rank = 2; else if burned acres < 235 & > 0, rank = 1; else, rank = 0
  3. If dam hazards >= 7, rank = 2; else if dam hazards < 7 & > 0, rank = 1; else, rank = 0
  4. If CSMO acres permitted >= 28, rank = 2; else if CSMO acres permitted < 28 & > 0, rank = 1; else, rank = 0
  5. If data centers square footage >= 19010, rank = 2; else if data centers square footage < 19010 & > 0, rank = 1; else, rank = 0
Question
Q4

In your own words (1-2 sentences), summarize what the logical statements above mean. You don’t have to summarize each one, but rather, convey what their overall purpose and logic is.

These values will inform a new field, called DistressRank, which we’ll use to convey an environmental distress index across the state of Virginia.

Because the median income variable is inverted from the others—e.g., a higher value is a lower rank—we’ll calculate this one in a separate field:

  1. Right-click medianIncome > “Calculate field”
  2. Set the parameters like so (we are going to set everything to 1 value to start):
Figure 23: Median income rank
  1. Click “Run” and you have a new field for medIncRank
  2. Then, open “Select by Attributes” and select all census tracts where medianIncome > 86250
  3. Click “Calculate” > medIncRank = 0, like so:
Figure 24: Calculate 0 values for median income

For the other four variables, since they are all pretty

We’re actually going to use a bit of Python code to make it:

  1. Open the “Calculate Field” tool
  2. Create a new field called distressRank
  3. Paste the following code snippet into the “code block” section:
def score(variable, cutoff):
    if variable is None or variable < 0.1:
        return 0
    elif variable > cutoff:
        return 2
    else:
        return 1
  1. And paste the following expression into the section for “distressRank =”:

score(!burnedAcres!, 235) + score(!sum_HazardRank!, 7) + score(!csmo_AcresPermitted!, 28) + score(!sum_sqft!, 19010) + !medIncRank!

  1. Together, this expression and code snippet are basically pairing a simple Python function with our 4 variables of interest and their individual cutoffs.
  2. Click “OK”

In the attribute table, try to sort the distressRank from high to low. You should see a max value of 6.

New symbology

In the symbology pane for your tractsIncome layer with the new rank:

  1. Set primary symbology to “unique values”
  2. Set the field to envDistressRank
  3. Click color scheme > “More color schemes” > select “Brown to blue-green diverging, bright”
  4. Right-click the “Symbol” header > “Reverse symbol order”
  5. Click the gear next to “Color scheme” > “Apply to fill and outline”

You should see something like this:

Symbolized distress index

Symbolized distress index

Feel free to pick your own color ramp. For a ranked categorical map like this, I think divergent color schemes work well. Let’s get this beauty into a map layout and call it a day!

Map layout

I won’t give you super detailed instructions here, but let me just highlight some things I’ll be doing when I make my map:

  1. I’ll be using an 8.5x11 landscape layout
  2. I will right-click the ruler > Add Multiple Guides > “Both” > Placement = “Offset from edge” > 1 inch margin (but you could use smaller margins, like 0.5 inch. Or no margins! Up to you)
  3. Use the scale input bar at the bottom left-hand side of the layout view to fine-tune scale of map
  4. Once map is placed the right spot, you can lock it in place by locking that map frame layer
  5. Once I make my legend, right-click it > “Convert to graphics”—will make it much easier to work with the legend
  6. Use visual hierarchy to convey what is most important, including font size, weight, and serif vs. san serif. In my map I used ~32 pt bold font for the title; 18 pt normal font for the legend; 10 pt italicized font for the explanation; and 8 pt normal font for the data source
  7. Try to use empty space/flow text around the shape of the data in a sensible way

Here’s an example map:

Figure 25: Example map

You can add more details about the methodology if you want (e.g., an explainer on how we ranked the variables), and you could also consider what the map is lacking—for instance, a deeper analysis might include other environmental stressors like power plants (eGrid data from Lab 02?) as well as demographic info like race and employment. You could also take it further by exploring how these variables interact over time. These would all make great topics for a final project…

Submission details

Assigned Due Submit

9/28/26

10/9/26

Section 1, Section 2
Table 3: Rubric
Question Point Value
Question 1 2
Question 2 1
Question 3 1
Question 4 1
Final map 5