An interactive map of all professional training centres in Portugal licensed by DGERT (Direção-Geral do Emprego e das Relações de Trabalho).
These are the institutions authorised to issue an enrolment certificate — a document required for obtaining or renewing a Portuguese residence permit (AIMA/SEF).
Data snapshot: April 2026 — 3,361 licensed institutions across all of Portugal.
Just double-click map.html — it opens in your browser with no server required.
The included schools.js already contains pre-geocoded coordinates for all schools,
so the map works immediately out of the box.
- 3,361 schools across all 18 districts of Portugal
- Cluster view — markers group at low zoom, expand as you zoom in
- Filters — search by name, district, or training area (CNEF code)
- School popup — address, contacts, licensed training areas
- Notes — add contact status and free-text notes per school, saved in
localStorage - Export / Import notes as JSON — share progress with others or across devices
The school list comes from the official DGERT public registry: certifica.dgert.gov.pt
The raw export (download_listagem_15-04-2026-15-45-07.csv) is included as-is for
transparency. I normalised it into schools.csv (UTF-8, clean fields) and geocoded
the addresses using the Google Maps Geocoding API. The result is schools.geojson /
schools.js.
Anyone is free to use this data — it is a public government registry.
| File | Description |
|---|---|
map.html |
The interactive map — open directly in browser |
schools.js |
Pre-geocoded school data (loaded by map.html) |
schools.geojson |
Same data as GeoJSON — use with QGIS, Mapbox, etc. |
schools.csv |
Normalised CSV — name, address, district, CNEF areas |
download_listagem_*.csv |
Original DGERT export (UTF-16, semicolon-separated) |
geocode.py |
Script to re-geocode or extend the dataset |
geocode_cache.json |
Per-school geocoding cache (keyed by NIPC) |
If you want to re-run geocoding — for example, to fix failures or extend to new data:
# Set your Google Maps API key
export GOOGLE_MAPS_API_KEY=AIza...
# Test on 20 schools
python3 geocode.py --filter lisboa --limit 20
# Greater Lisbon (Lisboa + Setúbal districts, ~1,253 schools)
python3 geocode.py --filter lisboa-area
# All of Portugal (3,361 schools, ~$17 in API cost — within Google's free $200/month)
python3 geocode.py --filter allThe cache is keyed by NIPC (the school's tax ID), so re-running only charges for
schools not already in geocode_cache.json.
| Flag | Description |
|---|---|
--key KEY |
API key (or set GOOGLE_MAPS_API_KEY env var) |
--filter |
lisboa | lisboa-area | porto | all | Braga,Aveiro,... |
--limit N |
Geocode at most N schools (for testing) |
--rate 0.05 |
Pause between requests in seconds (Google allows 50 qps) |
--force |
Re-geocode even if already cached |
Schools are tagged with CNEF codes (Portugal's official education area classification). The first digit indicates the broad category:
| Code | Area |
|---|---|
| 0 | General education programmes |
| 1 | Education and pedagogy |
| 2 | Arts and humanities (22x = languages) |
| 3 | Social sciences, business, law (34x = business/admin, 38x = law) |
| 4 | Science, mathematics, IT (48x = computing) |
| 5 | Engineering, industry, construction |
| 6 | Agriculture |
| 7 | Health and social services (72x = healthcare, 76x = social work) |
| 8 | Services (81x = hospitality, 86x = security) |
Code: MIT
Data: public government registry (DGERT) — free to use, no restrictions.