Un'applicazione web single-page (SPA) per esplorare gli edifici, i piani e le aule del Polo Fibonacci dell’Università di Pisa.
L’interfaccia consente di navigare in modo interattivo tra gli edifici, visualizzare mappe .SVG dei piani e ottenere dettagli sulle singole aule.
Per rendere il progetto ulteriormente accessibile a TUTTI, oltre a un'interfaccia intuitiva e diretta, è disponibile una guida che spiega i vari elementi e pulsanti dell'applicazione.
- Indice
- Contributori
- Perché?
- Struttura del progetto
- rooms.json
- Flowchart
- Prestazioni
- Funzionalità
- API Orari Biblioteca
- API Aule
- Telegram Bot
- Data Sources
- Problemi noti
Un ringraziamento speciale a chi ha dedicato il proprio tempo per la raccolta dati nelle aule.
(indice)
L'idea nasce da un'esigenza personale, sorta fin dal primo giorno di università, quando ci dissero di recarci in un'aula specifica, in un edificio di cui nessuno sapeva nulla.
Ho capito subito che non ero l'unico ad avere questo problema. Mi è capitato spesso, sia di persona che nelle chat di gruppo, di vedere richieste di aiuto per trovare un'aula.
A dimostrazione di ciò, ecco alcuni messaggi reali presi da un gruppo Telegram:
"Qualcuno del corso C mi può aiutare a trovare l'aula per favore?"
"Qualcuno sa dov'è l'aula M1?"
"L'aula D3 dove è?"
"Sapete dirmi dove è questa aula M1?"
"L'aula H dov'è?"
...e tanti altri. Da qui l'ispirazione per il nome del progetto: DOVE?
Note
Il progetto è in sviluppo, contribuisci!
(indice)
├── README.md
├── assets/
│ ├── fonts/
│ ├── logo/
│ │ ├── favicon.png
│ │ └── logo.svg
│ └── screenshots/
├── data/
│ ├── unified.json <- file importante per far funzionare tutto
│ ├── rooms.json
│ ├── people.json
│ └── facilities.json
├── locales <- cartella per le traduzioni
│ └── en.json
│ └── it.json
├── scripts/ <- cartella per lo script
│ └── populate_people.py
├── index.html
└── polo/ <- dove aggiungere altri poli
└── fibonacci/
├── edificio/
│ ├── a/
│ │ └── piano/
│ │ ├── 0-top-max.svg <- top sta per vista e max sta per non si usano
│ │ ├── 0-top.svg
│ │ ├── 0.dwg <- file CAD del piano
│ │ ├── 0.svg <- vista prospettica
│ │ ├── 1-top-max.svg
│ │ ├── 1-top.svg
│ │ ├── 1.dwg
│ │ ├── 1.svg
│ │ ├── 2-top-max.svg
│ │ ├── 2-top.svg
│ │ ├── 2.dwg
│ │ └── 2.svg
│ ├── b/
│ │ └── ...
│ ├── c/
│ │ └── ...
│ ├── d/
│ │ └── ...
│ └── e/
│ └── ...
└── mini-map.svg <- mini mappa (non si usa)(indice)
È il "database" dell'applicazione.
Contiene tutti i dati su edifici, piani, aule, persone e facility, e l'interfaccia viene costruita dinamicamente leggendo questo file. Per aggiornare i contenuti, basta modificare unified.json senza toccare il codice.
{
"polo": {
"fibonacci": {
"edificio": {
"a": {
"..."
},
"b": {
"..."
},
"c": {
"..."
},
"d": {
"rotate": true, <- valore true fa apparire il bottone per girare la cartina
"piano": {
"0": [
{
"id": "fib_d5-d-0",
"nome": "Aula D5",
"alias": [
"D5",
"Informatica",
"Matricole",
"Matricole Informatica"
],
"type": "aula",
"note": "",
"coordinates": {
"x": 463,
"y": 295,
"zoom": 3
},
"hasStatus": true, <- serve per evitare le chiamate API e mostrare animazione di ricerca di un'aula che non ha lo status
"capienza": 216,
"presenza_pc": false,
"numero_pc": 0,
"prese_elettriche": true,
"numero_prese_elettriche": 5,
"porte_rete": true,
"proiettore": true,
"lavagna": true,
"rete": false,
"accesso_disabili": true,
"ricerca": "Aula D5"
},
{
"..."
},
{
"..."
},
{
"..."
}
]
}
},
"e": {
"..."
}
}
}
}
}(indice)
graph LR
A[Planimetrie UniPi] -->|Conversione DWG/SVG| B[Mappe Edifici]
I[University Planner] -->|Scraping + API| C[Dati Aule]
C --> D[unified.json]
L[Mappa Dipartimento] -->|Scraping| M[populate_people.py]
M -->|Anagrafica Persone| D
G[Contributori] -->|Raccolta Dati| D
N[API SBA] -->|Orari Biblioteca| E[Applicazione Web]
D --> E
B --> E
E --> F[Interfaccia Utente]
graph TB
Start[Utente apre l'app] --> DetectLang[Rileva lingua<br/>browser o preferenze salvate]
DetectLang --> LoadTranslations[Carica traduzioni<br/>IT/EN]
LoadTranslations --> LoadData[Carica dati<br/>edifici, aule e persone]
LoadData --> CheckURL{Link con<br/>parametri?}
CheckURL -->|"Sì (Full/Short)"| UseURL[Apri polo, edificio,<br/>piano e posizione<br/>dal link]
CheckURL -->|No| UseDefault[Apri primo polo<br/>disponibile]
UseURL --> ShowMap[Mostra mappa<br/>interattiva]
UseDefault --> ShowMap
ShowMap --> BuildSidebar[Costruisci menu<br/>laterale con edifici,<br/>piani, aule e persone]
BuildSidebar --> Ready[App pronta<br/>per l'uso]
Ready --> UserAction{Cosa fa<br/>l'utente?}
%% Ricerca aula
UserAction -->|Cerca| SearchBar[Digita nella<br/>barra di ricerca]
SearchBar --> SearchType{Tipo di<br/>ricerca?}
SearchType -->|Nome/Alias| FindByName[Trova aula<br/>per nome]
SearchType -->|Persone| FindPerson[Trova persona<br/>per nome]
SearchType -->|Capienza es: >200| FindByCapacity[Trova aule per<br/>capienza]
SearchType -->|Impostazioni| OpenSettings[Apri pannello<br/>impostazioni]
SearchType -->|Condividi| OpenShare[Mostra opzioni<br/>condivisione]
SearchType -->|Feedback| OpenFeedback[Mostra link<br/>feedback]
SearchType -->|Distributori| FindWater[Trova distributori<br/>acqua]
FindByName --> ShowResults[Mostra risultati]
FindPerson --> ShowResults
FindByCapacity --> ShowResults
FindWater --> ShowResults
OpenFeedback --> ShowResults
ShowResults --> SelectResult[Seleziona risultato]
SelectResult --> CheckOccupancy[Controlla stato<br/>occupazione API]
CheckOccupancy --> CheckFloor{Stesso<br/>piano?}
CheckFloor -->|Sì| ZoomToRoom[Zoom sull'aula]
CheckFloor -->|No| ChangeFloor[Cambia piano<br/>e zoom sull'aula]
%% Navigazione manuale
UserAction -->|Naviga menu| ClickSidebar[Clicca su edificio,<br/>piano, aula o persona]
ClickSidebar --> UpdateMap[Aggiorna mappa]
UpdateMap --> ShowMap
%% Zoom e pan
UserAction -->|Zoom/Pan mappa| InteractMap[Ingrandisci o<br/>sposta la vista]
InteractMap --> SavePosition[Salva posizione<br/>nell'URL]
%% Condivisione
UserAction -->|Condividi| CopyLink[Copia link con<br/>posizione attuale]
CopyLink --> Ready
%% Cambio vista
UserAction -->|Cambia vista| SwitchView{Tipo<br/>vista?}
SwitchView -->|Prospettica| LoadPerspective[Carica vista<br/>prospettica]
SwitchView -->|Dall'alto| LoadTop[Carica vista<br/>dall'alto]
LoadPerspective --> ShowMap
LoadTop --> ShowMap
%% Impostazioni
OpenSettings --> SettingsPanel[Pannello impostazioni:<br/>• Lingua IT/EN<br/>• Contrasto alto<br/>• Font dislessia<br/>• Dimensione testo<br/>• Controlli extra<br/>• Opzioni condivisione<br/>• Erogatori acqua<br/>• Aule Studio]
SettingsPanel --> SaveSettings[Salva preferenze]
SaveSettings --> ApplySettings[Applica modifiche]
ApplySettings --> Ready
%% Condivisione
OpenShare --> ShareOptions[Copia link sito<br/>o repository GitHub]
ShareOptions --> Ready
%% Torna all'app
ZoomToRoom --> SavePosition
ChangeFloor --> SavePosition
SavePosition --> Ready
style Start fill:#2ea043,stroke:#1a7f37,stroke-width:2px,color:#ffffff
style Ready fill:#2ea043,stroke:#1a7f37,stroke-width:2px,color:#ffffff
style ShowMap fill:#0969da,stroke:#0550ae,stroke-width:2px,color:#ffffff
style SearchBar fill:#cf222e,stroke:#a40e26,stroke-width:2px,color:#ffffff
style OpenSettings fill:#8250df,stroke:#6639ba,stroke-width:2px,color:#ffffff
style LoadData fill:#bf8700,stroke:#9a6700,stroke-width:2px,color:#ffffff
style SaveSettings fill:#bf8700,stroke:#9a6700,stroke-width:2px,color:#ffffff
style CheckOccupancy fill:#bf8700,stroke:#9a6700,stroke-width:2px,color:#ffffff
(indice)
| DESKTOP | MOBILE |
|---|---|
![]() |
![]() |
| Apri il report completo su PageSpeed Insights | |
![]() |
| Apri il report completo su GTmetrix |
(indice)
Effettua una ricerca non solo sul nome dell’aula ma anche sui suoi alias. Una volta selezionata, l’aula verrà automaticamente zoomata sulla sua posizione (ovviamente, se le coordinate sono presenti nel file rooms.json).
Supporta inoltre filtri avanzati: ad esempio, scrivendo > 200 verranno mostrate le aule con capienza superiore a 200.
Sono supportati gli operatori: <, >, ==, =, >=, <=, " ".
Puoi accedere alle impostazioni digitando impostazioni o settings nella barra di ricerca.
Da lì puoi abilitare anche le funzionalità sperimentali.
Digitando condividi o share, potrai facilmente copiare il link al sito o a questa repository per condividerlo.
Digitando feedback troverai due risultati per fornire feedback sul progetto. Inoltre, quando non trovi ciò che cerchi, ti verrà proposto automaticamente di lasciare un feedback per aiutarci a migliorare!
Usa le frecce ↑ e ↓ per scorrere i risultati e premi Enter per selezionarne uno.
La ricerca si avvia automaticamente mentre digiti — non serve cliccare sulla barra di ricerca. Inoltre, se il risultato è unico oppure stai per cercare una special keyword (impostazioni, feedback, condividi...), ti basterà premere Enter per avviare la ricerca.
Grazie all'API di JuliusNixi è possibile visualizzare l'occupazione delle aule in tempo reale. In futuro verrà implementata la possibilità di applicare filtri per visualizzare esclusivamente le aule libere.
Attualmente è possibile aggiungere pulsanti extra per funzioni come zoom e condivisione, oltre ad attivare la modalità ad alto contrasto. È inoltre possibile aumentare la dimensione del testo, attivare il font per dislessia (OpenDyslexic) e scegliere la preferenza per mostrare il piano terra come "Piano 0" o "Piano Terra".
Puoi accedere alle impostazioni di accessibilità digitando impostazioni o settings nella barra di ricerca.
In futuro si prevede di introdurre una modalità di navigazione basata solo su pulsanti. (Non garantiamo nulla in questa fase di sviluppo.)
Al momento sono disponibili le seguenti scorciatoie:
| Funzione | Mac | Windows / Linux |
|---|---|---|
| Copia il link da condividere | ⌃ + ⌥ + J | Ctrl + Alt + J |
| Centra la visuale | ⌃ + ⌥ + K | Ctrl + Alt + K |
| Apri/Chiudi Sidebar | ⌘ + Enter | Ctrl + Enter |
Per impostazione predefinita è attivo il path sharing di polo, edificio, piano e coordinate.
Questo significa che, condividendo un link come:
https://plumkewe.github.io/dove-unipi/?p=fibonacci&b=a&f=0&v=top&x=504.00&y=322.42&z=1.00
la parte
?p=fibonacci&b=a&f=0&v=top&x=504.00&y=322.42&z=1.00
permetterà a chi apre il link di visualizzare lo stesso polo, edificio, piano e anche l’elemento evidenziato di chi lo ha condiviso.
Se la funzione non dovesse funzionare, apri la barra di ricerca, digita impostazioni e verifica che le opzioni “Condividi polo/edificio/piano” e “Condividi coordinate mappa” siano attive.
Inoltre, se utilizzi la funzione di ricerca o selezioni un elemento dalla sidebar senza muoverti sulla mappa, il link generato sarà molto più breve e includerà solo il polo e il nome abbreviato (se disponibile) dell’aula, dipartimento, laboratorio e sala.
Ad esempio:
https://plumkewe.github.io/dove-unipi/?p=fibonacci&c=D2
Corrisponde a:
https://plumkewe.github.io/dove-unipi/?p=fibonacci&b=d&f=0&v=top&x=380.00&y=296.00&z=2.00
Aprendo quel link, oltre all’aula verranno mostrati anche i dati relativi alla ricerca, quindi la sua posizione, la capienza e lo stato.
Attualmente sono supportate due lingue: italiano e inglese.
In futuro verranno aggiunte altre lingue!
Note
Vuoi contribuire con una traduzione?
Apri una issue oppure inviami un'email a: lyubomyr.malay@icloud.com
Grazie per il supporto!
È disponibile in versione alfa la possibilità di visualizzare i distributori d'acqua presenti negli edifici del Polo Fibonacci.
Per attivarla, apri la barra di ricerca, digita impostazioni e assicurati che l'opzione "Mostra erogatori d'acqua (ALFA)" sia attiva.
Puoi cercare i distributori digitando Dist... nella barra di ricerca. I risultati saranno evidenziati con un colore blu, come omaggio al progetto CoSA dell'Università di Pisa ↗
Note
Hai trovato distributori non mappati?
Ci servono dati sulla posizione di distributori d'acqua, distributori di caffè, distributori di cibo...
Apri una issue oppure inviami un'email a: lyubomyr.malay@icloud.com
Grazie per il supporto!
È possibile visualizzare le aule studio presenti negli edifici del Polo Fibonacci. Questa funzione permette di attivare dei marker specifici sulla mappa per individuare facilmente le zone studio.
Per attivarla, apri la barra di ricerca, digita impostazioni e attiva l'opzione "Mostra aule studio (ALFA)".
I marker appariranno sulla mappa indicando la posizione esatta delle aule dedicate allo studio.
Note
Se siete interessati alle aule studio esterne, potete consultare Fantamappa, realizzata da Sinistraper.
È possibile cercare le persone tramite la barra di ricerca o visualizzarle nella lista dedicata nella sidebar.
I dati vengono recuperati automaticamente dalla Mappa del Dipartimento di Informatica tramite uno script Python che estrae le associazioni tra persone e stanze.
L'aggiornamento dei dati avviene automaticamente ogni mese (il primo giorno del mese) tramite una GitHub Action che esegue lo script di sincronizzazione.
(indice)
Il progetto utilizza l'API pubblica del Sistema Bibliotecario di Ateneo (SBA) dell'Università di Pisa per ottenere gli orari di apertura delle Biblioteche.
GET https://www.sba.unipi.it/it/opening_hours/instances
| Parametro | Tipo | Descrizione |
|---|---|---|
from_date |
string | Data di inizio (formato: YYYY-MM-DD) |
to_date |
string | Data di fine (formato: YYYY-MM-DD) |
nid |
string | ID della biblioteca (1185 = Fisica) |
curl "https://www.sba.unipi.it/it/opening_hours/instances?from_date=2025-12-05&to_date=2025-12-12&nid=1185"[
{
"nid": 1185,
"date": "2025-12-05",
"start_time": "\n09:00",
"end_time": "20:00",
"notice": null
},
{
"nid": 1185,
"date": "2025-12-09",
"start_time": "09:00",
"end_time": "20:00",
"notice": null
}
]Warning
I campi start_time e end_time possono contenere caratteri di spaziatura o newline (es. "\n09:00"). Si consiglia di effettuare sempre il .trim() di questi valori prima dell'utilizzo.
| Campo | Descrizione |
|---|---|
nid |
ID della biblioteca |
date |
Data (formato YYYY-MM-DD) |
start_time |
Orario di apertura |
end_time |
Orario di chiusura |
notice |
Eventuali avvisi o note |
| NID | Biblioteca |
|---|---|
| 1173 | Agraria |
| 1174 | Anglistica |
| 1177 | Antichistica |
| 1178 | Economia |
| 1179 | Filosofia e Storia |
| 1184 | Chimica |
| 1185 | Fisica |
| 1187 | Informatica |
| 1195 | Giurisprudenza |
| 1196 | Ingegneria |
| 1197 | Matematica |
| 1198 | Medicina |
| 1213 | Scienze Politiche |
| 1361 | CIPEI |
| 1362 | Archivio generale di Ateneo |
| 1409 | Storia e Romanistica |
| 1477 | Scienze del turismo (Lucca) |
| 1481 | Sistemi logistici (Livorno) |
Note
L'API è pubblica e non richiede autenticazione.
L'API non supporta CORS. Per le richieste dirette da browser (client-side), è necessario utilizzare un proxy CORS (nel progetto viene usato api.allorigins.win come fallback).
Fonte: sba.unipi.it/it/biblioteche/orari-di-apertura-delle-sedi
(indice)
Il progetto include un servizio API (sviluppato in Python con Flask) che permette di ottenere informazioni in tempo reale sullo stato delle aule, effettuando lo scraping del portale aule.webhost1.unipi.it.
Le API offrono diversi endpoint per recuperare:
- L'elenco dei poli didattici.
- Le aule di un determinato polo.
- L'orario completo, lo stato attuale o le attività future di una specifica aula.
- L'elenco delle aule libere in un dato momento.
Il servizio utilizza requests e playwright per il recupero dei dati e implementa un sistema di caching per ottimizzare le prestazioni e ridurre il carico sul server di origine.
Note
L'API pubblica originale è quella di Giulio e la trovate qui: https://github.com/JuliusNixi/unipi-free-classrooms-now Quella utilizzata in questo progetto è stata modificata per poter essere eseguita su Azure.
(indice)
È stato creato un Telegram Bot inline, attualmente in fase di beta test, ma già disponibile per essere provato. Puoi accedervi seguendo questo link: @doveunipibot.
Il bot mostra le stesse informazioni disponibili tramite la ricerca sul sito. E anche alcune funzionalità aggiuntive come ad esempio la posibilità di mandare la mappa del polo con il nome degli edifici.
|
|
|
|
Hostato su:
(indice)
| Tipologia Dati | Fonte Principale | Dettagli / Link |
|---|---|---|
| Planimetrie | Università di Pisa (Ufficio Sicurezza e Ambiente) | File .dwg forniti dall'ateneo, convertiti e ottimizzati in .svg. |
| Dati Aule | University Planner | Portale UP |
| Status Aule | API Aule (Scraper) | Repo GitHub (scraping di aule.webhost1.unipi.it) |
| Status Biblioteche | SBA API via Proxy | Orari Sedi SBA |
| Personale | UniMap & Dipartimenti | UniMap, Informatica, Matematica |
| Uffici Docenti | Mappe Dipartimentali | Mappa DI, Mappa DM |
(indice)
- Mappe non aggiornate: I nomi di alcune aule sulle planimetrie SVG/DWG non corrispondono a quelli reali.



