# simongsk/navigating-map-of-denmark-under-changing-sea-levels architecture

> Architecture diagram of the GitHub repository simongsk/navigating-map-of-denmark-under-changing-sea-levels, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels
- Repository: https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels

## Overview

This is a JavaFX map application for exploring OpenStreetMap data in Denmark, simulating rising sea levels, and finding routes that avoid submerged roads. The main workflow is choosing map files, parsing OSM and height-curve data, then viewing and interacting with the rendered map; route selection invokes shortest-path search, and sea-level changes update the simulation and route. The README documents binary caching and the major capabilities; sampled excerpts confirm parts of parsing, rendering, UI interaction, and pathfinding, but not all wiring between subsystems.

Main entry points: [`src/main/java/models/ui/AppController.java`](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/ui/AppController.java) (App controller), [`src/main/java/models/parser/OsmData.java`](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/OsmData.java) (OSM elements), [`src/main/java/models/parser/OsmParser.java`](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/OsmParser.java) (OSM parser), [`src/main/java/models/parser/HeightCurveParser.java`](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/HeightCurveParser.java) (Height parser)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_application["Map application"]
  node_controller["App controller<br/>[AppController.java]"]
  node_startup["Dataset selection<br/>[StartupDialog.java]"]
  node_events["Input events<br/>[EventHandler.java]"]
  node_interface["Map interface<br/>[UserInterface.java]"]
  node_appdata["Loaded map state<br/>[AppData.java]"]
end

subgraph group_ingestion["Data ingestion"]
  node_osmparser["OSM parser<br/>[OsmParser.java]"]
  node_heightparser["Height parser"]
  node_binary["Binary cache I/O<br/>[BinaryReader.java]"]
  node_binarywriter["Binary cache writer<br/>[BinaryWriter.java]"]
end

subgraph group_mapmodel["Map model and rendering"]
  node_osmdata["OSM elements<br/>[OsmData.java]"]
  node_heightdata["Height curve data"]
  node_heightcurve["Submergence model<br/>[HeightCurve.java]"]
  node_rtree["Spatial index<br/>[Tree.java]"]
  node_renderers["Map renderers"]
  node_height_renderer["Height renderer"]
end

subgraph group_routing["Route finding"]
  node_pathfinder["A* and Dijkstra<br/>[Pathfinder.java]"]
  node_graphbuilder["Road graph builder<br/>[GraphBuilder.java]"]
  node_pathobject["Route selection state"]
end

node_user(("Map user"))

node_user -->|"chooses dataset"| node_startup
node_startup -->|"returns choice"| node_controller
node_user -->|"map interaction"| node_interface
node_controller -->|"binds handlers"| node_events
node_events -->|"dispatches input"| node_controller
node_controller -->|"updates view"| node_interface
node_controller -->|"loads OSM"| node_osmparser
node_controller -->|"loads curves"| node_heightparser
node_controller -.->|"reads cache"| node_binary
node_controller -.->|"writes cache"| node_binarywriter
node_osmparser -->|"builds elements"| node_osmdata
node_osmparser -->|"connects road nodes"| node_graphbuilder
node_heightparser -->|"associates nodes"| node_osmdata
node_heightparser -->|"builds curve data"| node_heightdata
node_heightdata -->|"contains curves"| node_heightcurve
node_controller -->|"updates state"| node_appdata
node_appdata -->|"indexes elements"| node_rtree
node_controller -->|"draws map"| node_renderers
node_controller -->|"sets sea level"| node_height_renderer
node_height_renderer -->|"renders submersion"| node_heightcurve
node_controller -->|"updates route"| node_pathobject
node_pathobject -->|"requests path"| node_pathfinder
node_pathfinder -->|"searches road graph"| node_osmdata
node_graphbuilder -->|"adds adjacency"| node_osmdata

click node_controller "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/ui/AppController.java"
click node_startup "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/ui/StartupDialog.java"
click node_events "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/ui/EventHandler.java"
click node_interface "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/ui/UserInterface.java"
click node_appdata "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/ui/AppData.java"
click node_osmparser "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/OsmParser.java"
click node_heightparser "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/HeightCurveParser.java"
click node_binary "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/BinaryReader.java"
click node_binarywriter "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/BinaryWriter.java"
click node_osmdata "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/OsmData.java"
click node_heightdata "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/HeightCurveData.java"
click node_heightcurve "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/heightcurve/HeightCurve.java"
click node_rtree "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/RTree/Tree.java"
click node_renderers "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/rendering/AbstractRenderer.java"
click node_height_renderer "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/rendering/HeightCurveRenderer.java"
click node_pathfinder "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/pathfinding/Pathfinder.java"
click node_graphbuilder "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/pathfinding/GraphBuilder.java"
click node_pathobject "https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/pathfinding/PathfindingObject.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_controller,node_startup,node_events,node_interface,node_appdata,node_user toneBlue
class node_osmparser,node_heightparser,node_binary,node_binarywriter toneAmber
class node_osmdata,node_heightdata,node_heightcurve,node_rtree,node_renderers,node_height_renderer toneMint
class node_pathfinder,node_graphbuilder,node_pathobject toneRose
```

## Components

### Map application

- [App controller](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/ui/AppController.java): `src/main/java/models/ui/AppController.java`
- [Dataset selection](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/ui/StartupDialog.java): `src/main/java/models/ui/StartupDialog.java`
- [Input events](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/ui/EventHandler.java): `src/main/java/models/ui/EventHandler.java`
- [Map interface](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/ui/UserInterface.java): `src/main/java/models/ui/UserInterface.java`
- [Loaded map state](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/ui/AppData.java): `src/main/java/models/ui/AppData.java`

### Data ingestion

- [OSM parser](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/OsmParser.java): `src/main/java/models/parser/OsmParser.java`
- [Height parser](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/HeightCurveParser.java): `src/main/java/models/parser/HeightCurveParser.java`
- [Binary cache I/O](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/BinaryReader.java): `src/main/java/models/parser/BinaryReader.java`
- [Binary cache writer](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/BinaryWriter.java): `src/main/java/models/parser/BinaryWriter.java`

### Map model and rendering

- [OSM elements](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/OsmData.java): `src/main/java/models/parser/OsmData.java`
- [Height curve data](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/parser/HeightCurveData.java): `src/main/java/models/parser/HeightCurveData.java`
- [Submergence model](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/heightcurve/HeightCurve.java): `src/main/java/models/heightcurve/HeightCurve.java`
- [Spatial index](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/RTree/Tree.java): `src/main/java/models/RTree/Tree.java`
- [Map renderers](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/rendering/AbstractRenderer.java): `src/main/java/models/rendering/AbstractRenderer.java`
- [Height renderer](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/rendering/HeightCurveRenderer.java): `src/main/java/models/rendering/HeightCurveRenderer.java`

### Route finding

- [A* and Dijkstra](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/pathfinding/Pathfinder.java): `src/main/java/models/pathfinding/Pathfinder.java`
- [Road graph builder](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/pathfinding/GraphBuilder.java): `src/main/java/models/pathfinding/GraphBuilder.java`
- [Route selection state](https://github.com/simongsk/navigating-map-of-denmark-under-changing-sea-levels/blob/main/src/main/java/models/pathfinding/PathfindingObject.java): `src/main/java/models/pathfinding/PathfindingObject.java`

### Other components

- **Map user**

## Connections

- Map user → Dataset selection: chooses dataset
- Dataset selection → App controller: returns choice
- Map user → Map interface: map interaction
- App controller → Input events: binds handlers
- Input events → App controller: dispatches input
- App controller → Map interface: updates view
- App controller → OSM parser: loads OSM
- App controller → Height parser: loads curves
- App controller → Binary cache I/O: reads cache
- App controller → Binary cache writer: writes cache
- OSM parser → OSM elements: builds elements
- OSM parser → Road graph builder: connects road nodes
- Height parser → OSM elements: associates nodes
- Height parser → Height curve data: builds curve data
- Height curve data → Submergence model: contains curves
- App controller → Loaded map state: updates state
- Loaded map state → Spatial index: indexes elements
- App controller → Map renderers: draws map
- App controller → Height renderer: sets sea level
- Height renderer → Submergence model: renders submersion
- App controller → Route selection state: updates route
- Route selection state → A* and Dijkstra: requests path
- A* and Dijkstra → OSM elements: searches road graph
- Road graph builder → OSM elements: adds adjacency
