ZEM 11 — PROGRAMOVÝ DIAGRAM

map.js + map2.js · GPS · OSM · Graph · Dijkstra
map.js
ZEM 11 · hlavná mapa / OSM / dlaždice / vykresľovanie
ŠTART map.js
Načítanie konfigurácie mapy
MIN_LON · MAX_LON
MIN_LAT · MAX_LAT
TILE_SIZE · ZOOM
Inicializácia Canvas
canvas.getContext("2d")
Výber OSM XML/PBF dlaždíc
tiles_xml/
Načítanie geografických dát
OSM nodes + ways
Je tile načítaný?
NIE
fetch tile
načítanie XML
ÁNO
spracovanie dát
vytvorenie geometrie
Extrakcia
highway ways
Prevod
LAT/LON → SCREEN X/Y
Kreslenie ciest
Canvas Path
Používateľ zoomuje?
ÁNO
zoomIn()
alebo
zoomOut()
NIE
mapa zostáva
drawMap()
prekreslenie Canvas
MAP.JS BEŽÍ
PROGRAMOVÁ HRANICA
map2.js
ZEM 11 · mestská navigácia · GPS · vyhľadávanie · graf · trasa
ŠTART map2.js
init()
resizeCanvas()
devicePixelRatio
canvas.width / canvas.height
POIs.json načítané?
NIE
cityIndex = []
chyba načítania
ÁNO
cityIndex = data
VYHĽADÁVANIE MESTA / OBCE
Nájde sa mesto?
NIE
„Mesto alebo obec sa nenašla.“
ÁNO
showCitySuggestions()
NAČÍTANIE MESTA
loadCity(file)

fetch(street JSON)
cityData = await response.json()
extractStreets()
streets[]
Má mesto ulice?
NIE
„Mesto nemá žiadne ulice“
ÁNO
pokračovať
getStreetBounds()
minLat / maxLat
minLon / maxLon
fitMapToCity()
centerLat
centerLon
zoom
VYTVORENIE GRAFU ULÍC
buildGraph()
graph.clear()
pre každý street

getStreetNodes()
nodeToGeo()

geoKey(lat, lon)
Existuje node v grafe?
NIE
graph.set()
vytvor node
ÁNO
použi existujúci node
distanceGeo()
výpočet vzdialenosti medzi node-mi
graph.edges.push()
obojsmerné spojenie
GRAPH

node → edge → node
HLAVNÉ VYKRESĽOVANIE
drawMap()
drawStreets()
geoToScreen()
LAT/LON → SCREEN X/Y
streetColor()
highway → farba
streetWidth()
highway → šírka
Canvas stroke()
drawStreetLabels()
drawRoute()
drawMarkers()
drawGPSPosition()
GPS SYSTÉM
toggleGPS()
startGPS()

requestWakeLock()
navigator.geolocation
watchPosition()
GPS position
lat · lon · accuracy · speed · heading
accuracy > 100 m?
ÁNO
ignorovať GPS fix
NIE
updateGPSPosition()
calculateHeading()
alebo
heading zo zariadenia
smoothHeading()
plynulé otáčanie šípky
gpsFollowMode?
NIE
GPS beží
mapa stojí
ÁNO
centerMapOnGPS()
updateGPSDisplay()
drawMap()
GPS FOLLOW / RUČNÝ POSUN
Používateľ začne posúvať mapu?
ÁNO
gpsFollowMode = false
showGPSDragMessage()
NIE
pokračovať
pointermove
offsetX += ΔX
offsetY += ΔY
drawMap()
NAVIGÁCIA / TRASA
startRouteMode()
routeMode?
NIE
klik na mapu nerobí trasu
ÁNO
čaká na bod A
1. klik
routeStart = A
2. klik
routeTarget = B
calculateRoute()
nearestGraphNode(A)

najbližší graph node
nearestGraphNode(B)

najbližší graph node
DIJKSTRA
dijkstra( startKey, targetKey )
distance[]
previous[]
queue[]
startDistance = 0
Queue je prázdna?
ÁNO
koniec hľadania
NIE
sort queue
shift()
current == target?
ÁNO
break
NIE
prejsť edges
newDistance < distance?
ÁNO
distance.set()
previous.set()
queue.push()
NIE
ďalšia hrana
Rekonštrukcia cesty

target ← previous ← previous ← start
routePath[]
výpočet celkovej vzdialenosti
distanceGeo()
formatDistance()
m / km
drawRoute()
modrá trasa
drawMap()
WAKE LOCK
requestWakeLock()
navigator.wakeLock.request("screen")
visibilityState == visible?
ÁNO
requestWakeLock()
NIE
nič
releaseWakeLock()
pri stopGPS()
HLAVNÁ SLUČKA PROGRAMU
USER / GPS / SEARCH / ZOOM / PAN
zmena stavu
drawMap()
Canvas sa prekreslí
Ďalšia udalosť?
ÁNO
späť do programu
NIE
čakať
ZEM 11 NAVIGÁCIA BEŽÍ
Proces / funkcia
Podmienka
Tok programu
GPS
Trasa
Graph / Dijkstra
Canvas rendering