← Kristoffer Lersveen

case study · 01 / 07

iOS · Swift · SwiftUI · MapLibre

Luftrom

A fast, native iOS map for drone pilots in Norway: where you may fly, what applies there, and the ground truth you need before take-off.

The pre-flight check

Long-press anywhere on the map and the app answers one question for that point. These are the lines it works through, in order.

  1. Zonesevery official geozone that covers the pointfrom the bundled dataset
  2. Ceilingthe 120 m limit above groundfixed rule
  3. Terrainground height at the pointKartverket
  4. Weatherground wind, gusts, rain, temperatureMET Norway
  5. Daylightsunrise and sunsetMET Norway
  6. Verdictone answer, with the next step to takecomputed on the phone

The problem

Before a flight in Norway you piece the answer together from several places: a zone map, a weather forecast, the sun, the rules. The official app is the only way to get tower permission, but it is not built for the quick question a pilot has in the car park: can I fly here, and is it worth it right now.

Luftrom is the quick question, answered on one screen. It deliberately stops at permission: that still has to come from the official channel, so the app hands you over to it.

What I built

  • All official Norwegian drone geozones on topographic maps. Tap a zone to see what it is, who owns it, what you must do, and how to contact them.
  • The one-tap check above, plus 48 hours of flying weather rated hour by hour against your own drone's wind and temperature limits.
  • Saved spots, an optional "good window tomorrow" notification, and a home-screen and lock-screen widget.
  • A logbook that copies the conditions in from the check, with totals and CSV export, and a pre-flight checklist you can edit.
  • Siri and Shortcuts, in Norwegian and English.

Decisions worth explaining

Data drives the rules
Apart from the 120 m ceiling, no rule is hard-coded from regulation text. Zone meaning comes from the dataset, so a regulation change is a data refresh, not an app release.
A converter that refuses bad data
A script converts the official zone file into the app's format and rejects anything that breaks the contract: duplicate ids, unknown categories, non-metre units. The unit tests check the same contract from the app side.
Offline first for what matters
Zones and the verdict work with no connection. Map tiles, weather and terrain need one, and the app says so instead of guessing.
Say what it does not cover
Temporary restrictions and wind above ground have no usable machine-readable source, so the app does not pretend to know them. It points to where to check instead.
Private by construction
No account and no tracking. Everything the pilot enters, from drones to logbook, stays on the phone.
A border that cannot lose a zone
Outside Norway the check says "outside coverage" instead of giving a verdict. The outline is buffered outward so it never cuts off Norwegian territory, and a test requires every bundled zone to sit inside it.

Stack

  • Swift
  • SwiftUI
  • SwiftData
  • MapLibre
  • WidgetKit
  • App Intents
  • XcodeGen
  • fastlane
  • Python tooling

Data and credit

Geozones: Luftfartstilsynet, via dronesoner.no (ED-269). Base map, terrain height and place names: © Kartverket (CC BY 4.0). Weather and sun: MET Norway (CC BY 4.0).