🇮🇹 Italiano | 🇬🇧 English
Applicazione desktop C# per la creazione di stradari cartografici (atlanti stradali a pagine) a partire da OpenStreetMap. Portabile su Linux e Windows grazie ad Avalonia UI.
🗺️ C'è anche StradarioViewer, l'app compagna da tenere in tasca per consultare i percorsi del progetto sul telefono.
- Mappa interattiva: pan con drag, zoom con rotella centrato sul cursore, ricerca città
- Pagine: click destro per aggiungere, drag per spostare, blocco manuale/automatico contro spostamenti accidentali, etichette automatiche (A1, B2…), descrizione precompilata con le città più popolose dell'area (database locale, GeoNames), riordino trascinabile nell'albero laterale, orientamento e scala personalizzabili per singola pagina (override rispetto alle impostazioni generali)
- Gruppi POI: marker con icona/colore personalizzabili (l'icona si sceglie per singolo POI, il gruppo definisce solo il colore condiviso), aggiunta diretta sulla mappa o via ricerca — 43 categorie predefinite più quelle personalizzate, ricerca dal vivo (Overpass, con punteggio locale offline sempre calcolato in aggiunta al filtro AI/Groq opzionale) o offline (database locale scaricabile per continente), ricerca indirizzo e città; spostamento di un POI fra gruppi con un gesto taglia/incolla; riordino trascinabile dei POI dentro il proprio gruppo, oppure automatico per data quando presente; un gruppo nascosto (occhio spento) è protetto da modifiche accidentali; il colore di un gruppo si sincronizza automaticamente con quello di un percorso coincidente
- Percorsi: disegno punto-per-punto sulla mappa (Invio o shift+clic per confermare, senza aggiungere punti spuri se si pan durante il disegno), estendibili ed editabili in seguito, instradabili su strada reale via OSRM (auto/bici/piedi, fino a 10 punti, alternative multiple per tratta scelte da un pannello dedicato ridimensionabile); l'etichetta si sposta automaticamente se troppo vicina a un POI; qualunque punto del percorso può diventare un POI inline (icona, etichetta, descrizione) direttamente dalla maschera di modifica, sempre col colore del percorso — l'icona viene anche suggerita automaticamente da parole chiave nel testo (italiano/inglese), senza dover creare un gruppo POI a parte; la maschera di modifica è ora organizzata in due tab (Percorso / Punti), con navigazione punto-per-punto tramite frecce e campi descrizione a piena altezza
- Data/ora opzionali su POI e percorsi: campo Da/A facoltativo su ogni POI e su ogni percorso — quando presente, l'albero di navigazione si riordina cronologicamente in automatico e il PDF genera una pagina "Piano di viaggio" dedicata (non datati in coda) subito dopo la copertina; senza alcuna data impostata il PDF resta identico a prima (nessuna pagina in più); nel PDF la data è preceduta dalla sigla del giorno della settimana (Domenica in grassetto), l'orario di inizio/fine viene omesso quando è 00:00/23:59, un evento che copre l'intera giornata (00:00 → 23:59 stesso giorno) non genera una riga "Fine" separata, e una sottile riga verticale continua separa la colonna data/ora dall'icona lungo tutta la tabella
- Import/export universale: un solo comando importa KMZ/KML/GPX (POI e percorsi insieme, con colori distinti per i gruppi POI importati, anche più file in un colpo solo); esportazione separata, combinata o di un singolo gruppo/percorso; anche in CSV (due file tabellari, uno per POI e uno per percorsi, apribili in Excel/LibreOffice); le date di POI/percorsi viaggiano nel KML/KMZ (ExtendedData) e si ritrovano intatte al reimport; un POI che coincide con un vertice di uno o più percorsi (es. un itinerario di viaggio con una base ripetuta ogni giorno) viene riconciliato come POI inline su quel/quei punto/i invece di restare duplicato — un gruppo POI rimasto vuoto dopo la riconciliazione non è né importato né esportato; nomi in script non latino ripuliti automaticamente (anche nel tooltip "Cosa c'è qui"); punti in Cina (possibile GCJ-02 anziché WGS84) gestiti con correzione automatica o manuale
- Generazione PDF: si apre subito nel visualizzatore di sistema (nessuna domanda di salvataggio — si salva da lì, se serve), pagina di copertina con titolo (più una mini-mappa schematica — confini/coste, laghi e fiumi principali, percorsi, città maggiori sopra una soglia di popolazione adattiva — quando il progetto ha percorsi), indice (omesso se non ci sono pagine mappa), mappa riassuntiva che inquadra e disegna anche POI e percorsi liberi, pagine con riferimenti alle adiacenti e scala grafica, descrizioni lunghe con word-wrap reale, gruppo POI mai separato dal proprio elenco da un'interruzione di pagina; un percorso ad anello (ultimo punto coincidente col primo) non ripete la descrizione già stampata all'inizio; generabile anche con zero pagine mappa (solo copertina, elenchi POI/percorsi, riassuntiva); 5 modalità di contrasto per la mappa stampata (nessuno, colore, bianco/nero, enfatizza strade, adattivo/locale), più rinforzo contorni e retinatura per stampa B/N (dithering) come opzioni indipendenti
- Etichette leggibili e senza sovrapposizioni: sia in stampa (pagine mappa e mappa riassuntiva) sia sulla mappa interattiva, ogni etichetta prova automaticamente più posizioni (destra/sinistra/sopra/sotto) scegliendo quella che si sovrappone meno alle altre — in stampa un'etichetta può restare nascosta se non c'è proprio spazio (priorità ai POI singoli sui POI dei percorsi), sulla mappa interattiva viene invece sempre mostrata comunque, nella posizione migliore disponibile; alone bianco pieno intorno al testo per restare leggibile su qualunque sfondo; POI diversi che coincidono nello stesso punto con la stessa etichetta la stampano una sola volta invece di sovrapporla; l'etichetta col nome di un percorso è ancorata al suo baricentro invece che al primo punto
- Salvataggio progetto: file
.stradario(JSON) leggibile e modificabile a mano; le chiavi API restano solo nelle preferenze locali, mai nel progetto - Cancellazioni protette: eliminare una pagina, un gruppo POI, un singolo POI, un percorso o un punto di un percorso chiede sempre conferma esplicita prima di procedere
- Selezione dalla mappa: cliccare un POI o un percorso bloccato sulla mappa (anche sulla linea o su un punto-POI inline, non solo su un vertice) lo rende corrente nell'albero di navigazione, espandendo il gruppo/ramo che lo contiene e scorrendo automaticamente fino a renderlo visibile
- Impostazioni: tre tab — Generale (formato pagina, DPI, scala di stampa da 1:1.000 a 1:1.000.000, tile server, contrasto mappa nel PDF), Categorie POI (aggiunta di categorie personalizzate), Database POI offline (download facoltativo per continente)
- StradarioViewer, l'app compagna: StradarioApp è pensato per creare/modificare progetti su desktop, non per essere consultato in mobilità — da qui StradarioViewer, una app separata (Blazor WebAssembly, installabile come PWA sul telefono) che carica lo stesso file
.stradarioe mostra solo i percorsi/POI datati del giorno corrente (con navigazione al giorno prima/dopo) su una mappa, per avere l'itinerario di viaggio sotto mano senza portarsi dietro il progetto completo o un PC; funziona offline dopo il primo caricamento, i dati restano nel browser (localStorage), nessun server coinvolto
24 screenshot reali (dati di esempio, progetto "Firenze Demo" inventato), organizzati per area funzionale — dalla mappa interattiva all'output PDF finale, che è il vero prodotto dell'app.
Four A4 pages tiled in a 2×2 grid over the project area, with POI groups and a route overlaid.
|
Ruler tool: click-to-click distance measurement between two points on the map.
|
Category search (offline database): hundreds of matches shown as markers, click one to add it.
|
Address search: type a place name to locate and jump to it on the map.
|
|
Selezionando un percorso/POI (dalla lista o dalla mappa) la mappa si centra sul punto e ne mostra etichetta e descrizione. App separata, installabile come PWA — vedi https://paolobia.github.io/StradarioApp/ e webapp/StradarioViewer/README.md. |
1:1.000 · 1:5.000 · 1:10.000 · 1:15.000 · 1:20.000 · 1:25.000 · 1:50.000 · 1:100.000 · 1:150.000 · 1:200.000 · 1:250.000 · 1:300.000 · 1:400.000 · 1:500.000 · 1:800.000 · 1:1.000.000
La scala della mappa stampata è calcolata esattamente per il DPI scelto (non è un'approssimazione legata allo zoom dei tile OSM).
| Pacchetto | Uso |
|---|---|
| Avalonia | UI cross-platform (Windows/Linux/macOS) |
| Avalonia.Desktop | Lifecycle desktop |
| Avalonia.Themes.Fluent | Tema visuale |
| Avalonia.Fonts.Inter | Font Inter |
| Avalonia.Skia | Canvas Skia custom su Avalonia 11 |
| SkiaSharp | Rendering 2D (mappa, icone POI, percorsi) |
| BruTile | Schema tile OSM (TileIndex) |
| PdfSharpCore | Generazione PDF |
| Newtonsoft.Json | Serializzazione progetto |
- .NET 8 SDK
cities500.csv(GeoNames, ~24 MB) per la ricerca città: non serve procurarselo manualmente, l'app lo scarica da sola al primo avvio se non lo trova — vedi sotto
dotnet restore
dotnet run # build + avvio
dotnet build # solo compilazione# Self-contained (include il runtime .NET, nessuna dipendenza da installare)
dotnet publish -c Release -r linux-x64 --self-contained true -o ./publish/linux
dotnet publish -c Release -r win-x64 --self-contained true -o ./publish/win
# Eseguibile singolo framework-dependent (più leggero, richiede .NET 8
# Runtime installato sulla macchina di destinazione)
dotnet publish -c Release -r linux-x64 --self-contained false \
-p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ./publish/linux
dotnet publish -c Release -r win-x64 --self-contained false \
-p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o ./publish/winLe Release del repo
GitHub contengono eseguibili singoli framework-dependent già pronti per
Linux e Windows (richiedono il .NET 8 Runtime
installato). cities500.csv non è incluso per motivi di dimensione, ma
l'app lo scarica da sola al primo avvio (vedi sotto) — non va procurato a parte.
StradarioApp/
├── Program.cs # Entry point Avalonia
├── StradarioApp.csproj
├── CategoriePOI.txt # Elenco (key=value) delle categorie POI predefinite, per riferimento
├── Models/
│ └── StradarioModels.cs # Progetto, impostazioni, pagine, POI, percorsi, tile server
├── Services/
│ ├── GeoUtils.cs # Conversioni geografiche, zoom/scala esatta
│ ├── MapRenderer.cs # Rendering mappa interattiva (tile + POI + percorsi)
│ ├── PdfGenerator.cs # Generazione PDF (indice, overview, pagine, gazetteer)
│ ├── MapContrastFilter.cs # Filtri di contrasto mappa per la stampa
│ ├── PercorsoRenderer.cs # Disegno percorsi condiviso mappa/PDF
│ ├── PoiIconRenderer.cs # Icone POI vettoriali condivise mappa/PDF/KMZ
│ ├── PoiService.cs / PercorsoService.cs # Import/export KMZ/KML/GPX
│ ├── GcjTransform.cs # Correzione GCJ-02 -> WGS84 per import in Cina
│ ├── PoiSearchService.cs # Ricerca POI per categoria/indirizzo + filtro AI/Groq opzionale + punteggio locale
│ ├── RouteInstradationService.cs # Instradamento OSRM di un Percorso su strada reale (auto/bici/piedi)
│ ├── GroqClient.cs # Client HTTP minimo per l'API Groq (filtro POI AI)
│ ├── KmlIo.cs # Caricamento XML KML/KMZ/GPX robusto a BOM/encoding
│ ├── CsvIo.cs # Lettura/scrittura CSV minimale (RFC 4180) per import/export POI/percorsi
│ ├── CityDatabase.cs # Database città GeoNames, download automatico se assente
│ ├── ProjectService.cs # Salvataggio/caricamento progetto .stradario
│ ├── AppPreferencesService.cs # Preferenze globali (chiavi API, ultima categoria POI), non nel progetto
│ ├── DebugLog.cs # Log diagnostico su file (chiamate Groq)
│ ├── FontResolver.cs # Font per PdfSharpCore su Linux
│ └── RecentFilesService.cs # Elenco progetti recenti
└── UI/
├── MainWindow.cs # Finestra principale (tutto a codice, no AXAML)
├── MapCanvas.cs # Control Avalonia custom con canvas Skia
├── SettingsWindow.cs # Dialog impostazioni
├── EditPageWindow.cs # Dialog modifica pagina
├── PoiGroupEditWindow.cs / PoiItemEditWindow.cs
├── RouteEditWindow.cs
├── RouteInstradationPanel.cs # Pannello alternative/distanza/durata durante l'instradamento OSRM
├── PoiSearchLogWindow.cs # Log passo-passo di ogni ricerca POI, con Annulla/OK
└── ProgressWindow.cs # Dialog avanzamento generazione PDF
- Avvia l'app
- (Opzionale) Clicca ⚙️ Impostazioni per scegliere formato, DPI, scala e tile server
- Naviga la mappa con drag (pan) e rotella (zoom)
- Click destro sulla mappa per aggiungere una pagina
- Dal pannello laterale, crea gruppi POI e percorsi (o importali da KMZ/KML/GPX)
- Clicca 📄 Genera PDF: l'app mostra un'anteprima, poi puoi salvarla o scartarla
- Clicca 💾 Salva per conservare il progetto come file
.stradario
- I tile OSM vengono scaricati dal tile server scelto e tenuti in cache in memoria
- Il PDF include: eventuali pagine gazetteer POI, indice, mappa riassuntiva, una pagina per ogni pagina definita
- Le pagine nel PDF sono ordinate per righe (nord→sud), colonne (ovest→est)
- Ogni pagina PDF mostra i riferimenti alle pagine adiacenti (N/S/E/O) e la scala grafica
- Il file
.stradarioè JSON leggibile e modificabile manualmente - Le chiavi API (tile server, Groq) sono salvate solo nelle preferenze
dell'applicazione, mai nel file
.stradario
Usato dal bottone "📍 Città principali" e dalla ricerca POI "Ricerca una
città". Cercato nella cartella dell'eseguibile o in ~; se non trovato,
l'app lo scarica da sola da GeoNames
al primo utilizzo e lo tiene in cache (%AppData%/StradarioApp su Windows,
~/.config/StradarioApp su Linux) — non serve procurarselo manualmente, né
per gli eseguibili delle Release. Richiede una connessione di rete al primo
avvio; se il download fallisce (rete assente), le funzioni che dipendono
dal database degradano silenziosamente (nessun crash) finché non è
disponibile.
Distribuito sotto licenza GNU GPL v3.0 o successiva: puoi usare, modificare e ridistribuire il codice liberamente, anche a fini commerciali, a patto che le versioni derivate/distribuite restino open source con la stessa licenza. I dati cartografici sono © OpenStreetMap contributors (ODbL), soggetti ai termini separati di OpenStreetMap.























