Skip to content


Project Overview

This notebook creates a unified spatial dataset of Cuyahoga County municipalities and Cleveland SPA neighborhoods.

Key outcomes

  • Merge county municipal boundaries and Cleveland Strategic Planning Areas (SPAs) into one dataset.
  • Label geographies as Cleveland Core vs Cuyahoga Suburban.
  • Produce clean visualizations and export final data for GIS tools and Tableau.

Outputs

  • cuyahoga.geojson — Simplified Cuyahoga municipal boundaries (standardized columns).
  • cuyahoga_neighborhoods.geojson — Unified Cleveland + suburban boundaries.
  • cuyahoga_neighborhoods_df.xlsx — Geometry-free table for Tableau/Excel.

Imports & Load GeoJSON Files — Read spatial layers into GeoDataFrames

import geopandas as gpd
import pandas as pd
import matplotlib.pyplot as plt

# Load spatial layers (adjust paths if needed)
cuyahoga = gpd.read_file('Cuyahoga_Municipal_Boundaries.geojson')
cleveland = gpd.read_file('Cleveland_SPA_Neighborhoods.geojson')


Explore County & Cleveland SPA Data — Preview attributes

cuyahoga.head()  # preview cuyahoga map
cleveland.head() # preview cleveland map

Inspect Columns — Confirm schemas for a clean merge

print("Cuyahoga columns:", list(cuyahoga.columns))
print("Cleveland columns:", list(cleveland.columns))

Visualize Cuyahoga — County municipal map

ax = cuyahoga.plot(figsize=(10, 10), edgecolor='k', color='lightgrey')
ax.set_title('Cuyahoga County — Municipal Boundaries')
plt.show()

Prepare Simplified Cuyahoga — Rename, add labels for MetroRegion/County

This step filters the Cuyahoga County GeoDataFrame to include only the municipality name and geometry columns, renaming MUNI_NAME to SPANM for consistency with the Cleveland dataset. It then adds two new fields — MetroRegion, labeling “Cleveland” as Cleveland Core and all other municipalities as Cuyahoga Suburban — and County, which is set to “Cuyahoga” for all records.

# Keep only name + geometry; standardize column name to SPANM to match Cleveland
cuyahoga2 = cuyahoga[['MUNI_NAME', 'geometry']].rename(columns={'MUNI_NAME':'SPANM'})

# Label Cleveland vs Suburban (Cleveland = Cleveland Core; all else = Cuyahoga Suburban)
cuyahoga2 = cuyahoga2.assign(
    MetroRegion=cuyahoga2['SPANM'].apply(lambda muni: 'Cleveland Core' if muni == 'Cleveland' else 'Cuyahoga Suburban'),
    County='Cuyahoga'
)

cuyahoga2.head()

Export Simplified County Layer — GeoJSON for reuse

cuyahoga2.to_file("cuyahoga.geojson", driver="GeoJSON")
"Exported: cuyahoga.geojson"