Methodology

Study objective

To assess urban green spaces accessibility in Palermo by applying the 3-30-300 (Konijnendijk, 2023) through open datasets and replicable methodologies in other urban contexts.

Methodological note: The analysis order inverts the original framework, starting from the 300-meter rule (urban green accessibility) as a priority indicator of urban equity.

1. Mapping of public green spaces

To map accessible urban green spaces, two complementary datasets were used: OpenStreetMap (collaborative data updated by the community) and Copernicus Urban Atlas (official satellite data from the European Space Agency). Both datasets were filtered to include only accessible public green spaces, excluding private spaces and sports facilities.

1.1 Dataset OpenStreetMap

Source: OpenStreetMap

Selected tags:

Category A - Parks and gardens:

Category B - Recreation areas:

Excluded categories:

Processing:

1. Data extraction with Overpass Turbo

Overpass Turbo is a web tool to query the OpenStreetMap database. The following query extracts all public green spaces in Palermo according to defined criteria:

[out:json][timeout:60];
{{geocodeArea:Palermo}}->.searchArea;

// CATEGORY A - Parks // CATEGORY A - Parks & Gardens Gardens
(  
  way["leisure"="park"]["access"!="private"]["access"!="residents"](area.searchArea);
  relation["leisure"="park"]["access"!="private"]["access"!="residents"](area.searchArea);  
  way["leisure"="garden"]["garden:type"!="roof_garden"]["access"!="private"]
     ["access"!="residents"]["operator"!="condominium"](area.searchArea);
  relation["leisure"="garden"]["garden:type"!="roof_garden"]["access"!="private"]
     ["access"!="residents"](area.searchArea);
)->.catA;

// CATEGORY B - Recreation areas
(
  way["landuse"="recreation_ground"]["access"!="private"](area.searchArea);
  way["landuse"="village_green"]["access"!="private"](area.searchArea);
  way["leisure"="playground"]["access"!="private"](area.searchArea);
  way["leisure"="dog_park"]["access"!="private"](area.searchArea);
  way["leisure"="fitness_station"]["access"!="private"](area.searchArea);
  relation["landuse"="recreation_ground"]["access"!="private"](area.searchArea);
)->.catB;

(.catA; .catB;);
out geom;
>;
out skel qt;

Extraction result: 479 spaces, area 4,51 km²

2. Size filtering

Spaces with an area of less than 2,000 m² were excluded to remove flower beds, ornamental greenery and small unusable areas.

Results:

1.2 Dataset Copernicus Urban Atlas 2021

Source: Copernicus Urban Atlas - FUA IT005L3 (Palermo)

Selected category:

Excluded categories:

Processing:

  1. Download: FlatGeobuf da Copernicus Land Monitoring Service
  2. Conversion: FlatGeobuf → GeoJSON (via NeatoGeo)
  3. Size filtering: area ≥ 2.000 m² (184 → 181 spaces)
  4. Geographic filtering: municipal territory only (181 → 129 spaces)

Results:

1.3 Size categorization

Both datasets were categorized according to five area classes to assess the type of available spaces:

Category Threshold OSM Copernicus
Very large park > 300.000 m² 1 (1,91 km²) 1 (0,35 km²)
Large park 100.000-300.000 m² 3 (0,47 km²) 8 (1,31 km²)
Neighborhood park 30.000-100.000 m² 19 (1,19 km²) 14 (0,79 km²)
Garden 10.000-30.000 m² 27 (0,42 km²) 34 (0,53 km²)
Small green space < 10.000 m² 68 (0,30 km²) 72 (0,38 km²)
Total 118 (4,30 km²) 129 (3,36 km²)

2. Population distribution

To calculate how many citizens live within 300 meters of a green space, it's necessary to know where the population resides. ISTAT data on census sections (the smallest municipal territorial unit) was used, cross-referenced with demographic data from the Municipality of Palermo.

Sources:

Processing:

ISTAT data covers all of Sicily. To extract only Palermo sections, the free service MapShaper was used with the following filter:

# Filtering ISTAT sections for Palermo
filter 'PRO_COM == "082053"'

Results:

3. Green spaces accessibility (300-meter rule)

The 300-meter rule establishes that every person should have access to a quality green space within 300 meters from home. To verify this condition, green spaces data (chapter 1) were combined with population distribution (chapter 2).

3.1 City-wide coverage

The algorithm, based on the area-weighted interpolation method (Area-Weighted Interpolation), calculates how much population resides within 300 meters of green spaces by creating circular buffers around each space and calculating the intersection with census sections. For each section, the fraction of covered population is estimated based on the fraction of intersected area, assuming uniform population distribution within the section.

Algorithm:

import geopandas as gpd
from shapely.ops import unary_union

# 1. 300m buffer around green spaces
buffers = green_spaces.buffer(300)
coverage_area = unary_union(buffers)

# 2. Calculation per section
covered_population = 0
for idx, section in sections.iterrows():
    intersection = section.geometry.intersection(coverage_area)
    covered_fraction = intersection.area / section.geometry.area
    covered_pop = section['population'] * covered_fraction
    covered_population += covered_pop

# 3. Percentage
percentage = (covered_population / total_population) * 100
Assumptions:
  • Population uniformly distributed in sections
  • Euclidean distance (as the crow flies, without considering physical barriers or road network)

Results:

Dataset Coverage Covered population Not covered
OpenStreetMap 38,76% 246.293 residents 389.146 residents
Copernicus 48.38% 307.411 residents 328.028 residents

3.2 Coverage by neighborhood

The ward-level calculation reuses the same citywide accessibility surface (the buffers of all green spaces, dissolved into a single geometry before any allocation, so that a census section is not counted twice if it falls within range of more than one green space). Each census section is assigned to the ward containing its centroid; coverage for each ward is then computed by aggregating the covered and total population of only the sections assigned to that ward.

3.3 Point-by-point assessment

The user enters their address or shares their location. The system calculates the minimum distance from the outer edges of green spaces and counts how many spaces are within 300 meters. If there is at least one space, the name, area and distance are shown (positive feedback). If there are multiple spaces, the largest one is shown with the same information seen previously. If there are no spaces within 300 meters, the distance to the nearest one is still indicated (negative feedback).

User input:

Distance calculation:

from shapely.geometry import Point

user_point = Point(lon, lat)
minimum_distance = min([
    user_point.distance(space.boundary) 
    for space in green_spaces
])

Output:

4. Tree canopy coverage (30% rule)

The 30% rule establishes that at least 30% of the urban area should be covered by tree canopies (tree canopy) to ensure optimal environmental and public health benefits. The calculation is based on high-resolution satellite imagery.

Source: Copernicus Tree Cover Density 2023
Resolution: 10m raster
Range: 0-100% per pixel

City/neighborhood calculation:

import rasterio
import numpy as np

with rasterio.open('tcd_2023.tif') as src:
    data = src.read(1)
    mask = rasterio.features.geometry_mask(
        [area_of_interest], 
        transform=src.transform, 
        invert=True, 
        out_shape=data.shape
    )
    average_coverage = np.mean(data[mask])

This calculation is run separately for each of the 25 wards. The citywide figure is not a further mask over the whole municipal area, but an average of the 25 ward-level values weighted by the area of each ward, so that larger wards contribute proportionally more to the citywide result:

citywide_coverage = sum(ward_coverage[i] * ward_area[i] for i in wards) / sum(ward_area)

Derived metrics:

For each neighborhood, the tree deficit (distance from the 30% target) and the estimated number of trees to plant to reach it are calculated, assuming an average canopy per mature tree of 35 m²:

deficit_pct = 30 - average_coverage
area_to_cover = area_neighborhood * (deficit_pct / 100)
trees_needed = area_to_cover / 35  # 35 m² canopy

Results:

5. Trees visible from window (3-tree rule)

The 3-tree rule establishes that anyone should be able to see at least 3 trees from their home. Since no reliable datasets exist on this aspect, users were asked to count trees from their window through a simple web interface.

Technical stack:

Calculated metrics:

{
  total_responses: n,
  average_trees: sum(counts) / n,
  pct_meeting_rule: (count >= 3) / n * 100
}

6. User interaction and call to action

6.1 300-meter section (Urban green accessibility)

Primary CTA: "Enter your address and discover if you have access to urban green spaces"

Features:

Secondary CTA: "Share your results"

6.2 30% section (Tree canopy coverage)

Visualization: Analysis of your neighborhood coverage

Features:

CTA: "Help plant more trees in your city" → Metropolitree

6.3 Section 3 (Trees in visibility)

Primary CTA: Input of number of trees visible from one's window

Features:

Secondary CTA: "Ask the Municipality of Palermo to plant more trees" → send email

7. Technology stack

Data processing:

Frontend:

Data format:

8. Limitations

Dataset:

Calculations:

9. Replicability

To apply the methodology to another city, follow these steps:

  1. OpenStreetMap green spaces: Replace {{geocodeArea:Palermo}} in the Overpass Turbo query with the name of the city of interest
  2. Copernicus green spaces: Download the Urban Atlas 2021 dataset for the city's FUA (Functional Urban Area) from the Copernicus portal
  3. Tree canopy coverage: Download the Tree Cover Density 2023 raster for the area of interest from the portale Copernicus
  4. Population data: Identify the country's census territorial unit system (e.g. ISTAT for Italy) and download:
    • Section/minimum territorial unit geometriesss
    • Demographic data per section
  5. Neighborhood boundaries: Define the boundaries of local administrative units (neighborhoods, municipalities, districts) through official sources or community mapping (uMap, OpenStreetMap)
  6. Python script execution: Adapt the provided codes using the libraries indicated in the Technology Stack section
Source code: All processing code and web application are available on GitHub with open source MIT license.

References

← Back to home