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.
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.
Source: OpenStreetMap
Category A - Parks and gardens:
leisure=park - Public parksleisure=garden - Public gardensCategory B - Recreation areas:
leisure=playground - Children's playgroundsleisure=dog_park - Dog parksleisure=fitness_station - Outdoor fitness areaslanduse=recreation_ground - Generic recreation areaslanduse=village_green - Village greensaccess=private, access=residents, access=nogarden:type=roof_garden, operator=condominium1. 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.
Source: Copernicus Urban Atlas - FUA IT005L3 (Palermo)
14110 - Green urban areas (Public access)14130 - Green urban areas (Unknown access conditions)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²) |
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.
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"'
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).
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.
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
| Dataset | Coverage | Covered population | Not covered |
|---|---|---|---|
| OpenStreetMap | 38,76% | 246.293 residents | 389.146 residents |
| Copernicus | 48.38% | 307.411 residents | 328.028 residents |
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.
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).
from shapely.geometry import Point
user_point = Point(lon, lat)
minimum_distance = min([
user_point.distance(space.boundary)
for space in green_spaces
])
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
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)
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
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.
POST /api/tree-count → Save count (0-99)GET /api/tree-stats → Retrieve aggregated statistics{
total_responses: n,
average_trees: sum(counts) / n,
pct_meeting_rule: (count >= 3) / n * 100
}
Primary CTA: "Enter your address and discover if you have access to urban green spaces"
Features:
Secondary CTA: "Share your results"
Visualization: Analysis of your neighborhood coverage
Features:
CTA: "Help plant more trees in your city" → Metropolitree
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
To apply the methodology to another city, follow these steps:
{{geocodeArea:Palermo}} in the Overpass Turbo query with the name of the city of interest