Opis
Komponent niewidoczny z palety „Maps” – middleware jak TWeather, ale dla ruchu lotniczego. Domyślny serwer https://fly.imetroll.com (proxy OpenSky z auth key=). Mapa z AircraftInfo=True rysuje ruchome ikony samolotów (wbudowane SVG lub własne). Klik → TMapInfoWindow + przycisk Pokaż trasę → /v1/tracks + okno z wykresem wysokości. Alias typu: TPlanes = TAircraft.
Moduł: MapCommon.Aircraft (+ Aircraft.Types / Client / Overlay) · Klasa bazowa: TComponent · Platformy: VCL + FMX

Demo na żywo
Live ADS-B nad PL (fly.imetroll.com + key=): samoloty, klik → info, Pokaż trasę → chart.
Zaznacz prostokąt / koło lub wpisz lat, lon[, km] → automatyczne zapytanie fly; InfoWindow + trasa/wykres.
▶ Active + obszar / współrzędneFunkcje
- Middleware: Request/RefreshAsync -> GET
/v1/states+key=-> OnDataReady / setAircraft. - Area required: rectangle (lamin/lomin/lamax/lomax), radius (lat/lon/radius_km) or area=id. Missing -> HTTP 400; never whole world.
- Active = auto query: przy
Active=Truezaznaczenie obszaru na mapie (prostokąt / koło) albo współrzędneApplyCoords(Lat, Lon[, RadiusKm])od razu wywołująRefreshAsync→ fly. - Map area select: istniejące selectArea mapy (pan-lock) → multicast area listener → TAircraft.Area.
Map.OnAreaSelectedzostaje Twoim zdarzeniem. - Auth: RequireApiKey=True; server 401 without key=.
- Icons SVG / IconDataURL; Map.Aircraft / AircraftInfo; InfoWindow + ShowRoute (/v1/tracks).
- Provider apFlyProxy / apSample (sample also area-filtered).
https://fly.imetroll.com -- GET/JSON tables on fly index.Właściwości
| Właściwość | Opis |
|---|---|
| ApiKey / Key, RequireApiKey, ApiKeyParam | Like TWeather -- key= on query. |
| BaseURL | Default https://fly.imetroll.com |
| Area.Kind / South|West|North|East | aakRectangle -> bbox to fly. |
| Area.CenterLat/Lon + RadiusKm | aakRadius -> lat/lon/radius_km to fly. |
| Area.AreaId | Named area (pl, warsaw, ...) -> area= to fly. |
| UseMapAreaSelection, AutoRequestOnAreaSelect | Zaznaczenie mapy → Area; przy Active=True → RefreshAsync (domyślnie oba True). |
| ShowAreaOnMap | ApplyCoords / ApplyBounds rysują obszar na mapie. |
| IntervalSec, Active, Display.*, Map, InfoWindow | Timer, icons, links. |
| RouteWindowSize, RouteColor, Provider | Route / apFlyProxy|apSample. |
Zdarzenia
| Zdarzenie | Opis |
|---|---|
| OnDataReady(JSON) | Po udanym states. |
| OnAircraftClick(State) | Klik ikony samolotu. |
| OnRouteReady(Track, RouteJSON) | Po pobraniu trasy. |
| OnAreaApplied | Area podmienione z mapy / współrzędnych (przed zapytaniem). |
| OnError | aekUnauthorized / sieć / HTTP / parse. |
Metody
| Metoda | Opis |
|---|---|
| Request / Refresh / RefreshAsync | Fetch states (always Area -> fly). |
| BeginAreaSelect / CancelAreaSelect | Start/stop existing map area draw (pan-lock). |
| ApplyMapArea | Prostokąt/koło z mapy → Area (+ zapytanie gdy Active). |
| ApplyCoords(Lat, Lon, RadiusKm=0) | Obszar ze współrzędnych (promień opcjonalny; 0 = Area.RadiusKm, 80 km). Active → RefreshAsync. |
| ApplyCoordsText(S): Boolean | Parsuje „52.23, 21.01, 50” / „52,23; 21,01” z TEdit → ApplyCoords. |
| ApplyBounds(S, W, N, E) / ApplyAreaId(id) | Prostokąt / nazwany obszar fly. Active → RefreshAsync. |
| ShowRoute / ShowRouteAsync / ClearRoute | Track + chart. |
| UpdateDisplay / ClearDisplay / DetectLinkedComponents | Map / InfoWindow. |
Przykłady
TAircraft + mapa + InfoWindow + key=
Aircraft1.ApiKey := GetEnvironmentVariable('AIRCRAFT_API_KEY'); // &key=
Aircraft1.RequireApiKey := True;
Aircraft1.BaseURL := 'https://fly.imetroll.com';
// Area: rectangle OR radius OR AreaId -- server never dumps whole world
Aircraft1.Area.Kind := aakRectangle;
Aircraft1.Area.South := 49; Aircraft1.Area.West := 14;
Aircraft1.Area.North := 55; Aircraft1.Area.East := 25;
// or: Aircraft1.Area.Kind := aakRadius; CenterLat/Lon + RadiusKm
// or: Aircraft1.Area.AreaId := 'pl';
Aircraft1.UseMapAreaSelection := True; // map selectArea -> Area
Aircraft1.AutoRequestOnAreaSelect := True; // Active=True: new area -> RefreshAsync at once
Aircraft1.IntervalSec := 10;
TileMap1.Aircraft := Aircraft1;
TileMap1.AircraftInfo := True;
Aircraft1.InfoWindow := MapInfoWindow1;
Aircraft1.Active := True;
// Active: draw on map -> fly query at once (pan-lock): Aircraft1.BeginAreaSelect; // or BeginAreaSelect(aakRadius)
// Active: coordinates -> fly query at once:
Aircraft1.ApplyCoords(52.23, 21.01, 50); // lat/lon/radius_km=50
Aircraft1.ApplyCoordsText(EditCoords.Text); // "52.23, 21.01, 50" | "52,23; 21,01"
Klik i trasa
procedure TForm1.AircraftClick(Sender: TObject; const State: TAircraftState);
begin
// InfoWindow już wypełnione przez TAircraft; opcjonalnie:
Memo1.Lines.Add(State.Callsign + ' ' + State.Icao24);
end;
procedure TForm1.BtnShowRouteClick(Sender: TObject);
begin
Aircraft1.ShowRouteAsync(LastIcao24); // trasa + wykres wysokości na mapie
end;Active: zaznaczenie obszaru lub współrzędne → automatyczne zapytanie
Aircraft1.Active = True na mapie: wybór obszaru (przycisk nawigacji Zaznacz obszar, BeginAreaSelect; mysz lub palec, pan/drag mapy zablokowany)
albo współrzędne (ApplyCoords / ApplyCoordsText / ApplyBounds / ApplyAreaId)
od razu wysyła zapytanie (RefreshAsync) do fly.imetroll.com/v1/states. Zapytanie trwające dla starego obszaru jest porzucane / anulowane.
Active = False → zmienia się tylko Area; zapytanie wywołujesz sam (Request).
| Źródło obszaru | TAircraft.Area | Zapytanie (Active=True) |
|---|---|---|
| Prostokąt narysowany na mapie | aakRectangle + South/West/North/East | lamin lomin lamax lomax |
| Koło narysowane na mapie | aakRadius + CenterLat/Lon + RadiusKm | lat lon radius_km |
ApplyCoords(Lat, Lon, RadiusKm) | aakRadius + CenterLat/Lon + RadiusKm | lat lon radius_km |
ApplyCoords(Lat, Lon) (bez promienia) | aakRadius + CenterLat/Lon + RadiusKm, RadiusKm = Area.RadiusKm (domyślnie 80 km) | lat lon radius_km |
ApplyCoordsText(Edit1.Text) | "52.23, 21.01, 50" · "52,23; 21,01; 50" · "52.23 21.01 50km" · "lat=52.2 lon=21 r=30" (promień opcjonalny); False = nie rozpoznano (+ OnError) | |
ApplyBounds(S, W, N, E) | aakRectangle | lamin lomin lamax lomax |
ApplyAreaId(id) | Area.AreaId | area=warsaw |
| Właściwość / zdarzenie | Opis |
|---|---|
UseMapAreaSelection (True) | Zaznaczenie na mapie podmienia Area. |
AutoRequestOnAreaSelect (True) | Przy Active=True: nowy obszar → RefreshAsync. False = tylko Area. |
ShowAreaOnMap (True) | ApplyCoords / ApplyBounds rysują obszar na mapie (bez ponownego areaSelected). |
OnAreaApplied | Po podmianie Area (przed zapytaniem). |
Map.OnAreaSelected pozostaje Twoim zdarzeniem: TAircraft, TBoats i TWeather słuchają tej samej mapy równolegle
(TMapCore.AddAreaSelectedListener, multicast) – jedno zaznaczenie może zasilić wszystkie trzy.
Aircraft1.Active := True;
Aircraft1.BeginAreaSelect; // rysuj na mapie → zapytanie
Aircraft1.ApplyCoords(52.23, 21.01, 50); // współrzędne + promień [km] → zapytanie
if not Aircraft1.ApplyCoordsText(Edit1.Text) then ShowMessage('lat, lon[, km]');
fly.imetroll.com -- GET and JSON
Area-scoped only. Missing area -> HTTP 400. Never dumps the whole world.
| Mode | GET | TAircraft |
|---|---|---|
| rectangle | lamin lomin lamax lomax | Area.Kind=aakRectangle + South/West/North/East |
| radius | lat lon radius_km | Area.Kind=aakRadius + CenterLat/Lon + RadiusKm |
| named | area=pl | Area.AreaId:='pl' |
| Endpoint | Auth | Description |
|---|---|---|
GET /v1/health | public | Status |
GET /v1/areas | public | Named id catalogue |
GET /v1/states | key= | Aircraft in area only |
GET /v1/sample/states | key= | Sample filtered to area |
GET /v1/tracks?icao24= | key= | Track + altitudes |
| JSON (states) | Description |
|---|---|
time, source, count, note? | Meta |
bbox.mode | rectangle | radius |
bbox.lamin/lomin/lamax/lomax | Envelope |
bbox.lat/lon/radius_km | When mode=radius |
aircraft[].icao24, callsign, origin_country, lat, lon | Id + position |
baro_altitude, geo_altitude, on_ground, velocity, true_track, vertical_rate, squawk | Flight state |
Full tables: fly.imetroll.com.
Pełna lista API
Generowana z deklaracji w kodzie (Source/*.pas): wszystkie opublikowane właściwości i zdarzenia TAircraft (także dziedziczone), właściwości publiczne i metody publiczne.
Właściwości opublikowane (19)
| Właściwość | Typ | Domyślnie | Opis |
|---|---|---|---|
Active | Boolean | False | |
BaseURL | string | Adres serwera Nominatim | |
ApiKey | string | Klucz API – tylko w kodzie, używany przez {apikey} | |
Key | string | ||
ApiKeyParam | string | ||
RequireApiKey | Boolean | True | |
Provider | TAircraftProvider | apFlyProxy | |
Area | TAircraftArea | Zaznaczony obszar (kształt, punkty, prostokąt, koło) | |
Display | TAircraftDisplay | ||
IntervalSec | Integer | AIRCRAFT_DEFAULT_INTERVAL_SEC | |
TimeoutMs | Integer | AIRCRAFT_DEFAULT_TIMEOUT_MS | |
Map | TComponent | ||
InfoWindow | TMapInfoWindow | ||
AutoLinkComponents | Boolean | True | Automatycznie łącz pierwszy dostawcę wyszukiwania / TMapAreas / TEditMap z formy |
RouteWindowSize | TAircraftRouteWindowSize | arwsLarge | |
RouteColor | string | ||
UseMapAreaSelection | Boolean | True | |
AutoRequestOnAreaSelect | Boolean | True | |
ShowAreaOnMap | Boolean | True |
Zdarzenia (5)
| Zdarzenie | Typ | Opis |
|---|---|---|
OnAreaApplied | TNotifyEvent | |
OnDataReady | TAircraftDataReadyEvent | |
OnError | TAircraftErrorEvent | Każdy błąd (ErrorKind, HTTP, komunikat PL/EN) |
OnAircraftClick | TAircraftClickEvent | |
OnRouteReady | TAircraftRouteReadyEvent |
Właściwości publiczne – tylko w kodzie (6)
| Właściwość | Typ | Opis |
|---|---|---|
Data | TAircraftSnapshot | |
LastTrack | TAircraftTrack | |
Busy | Boolean | Trwa zapytanie |
LastErrorKind | TAircraftErrorKind | |
LastError | string | |
LastRefresh | TDateTime |
Metody publiczne (19)
| Metoda | Opis |
|---|---|
function Refresh: Boolean | Ponownie wczytuje hierarchię i pliki |
function Request: Boolean | |
procedure RefreshAsync | |
procedure Cancel | |
function DataJSON: string | |
procedure DetectLinkedComponents | Wyszukuje na formie i łączy dostawcę / TMapAreas / TEditMap |
function MapCore: TMapCore | IMapCoreProvider – rdzeń dla TEditMapRaster |
procedure UpdateDisplay | |
procedure ClearDisplay | |
function ShowRoute(const Icao24: string): Boolean | |
procedure ShowRouteAsync(const Icao24: string) | |
procedure ClearRoute | |
function FindAircraft(const Icao24: string; out S: TAircraftState): Boolean | |
procedure BeginAreaSelect | |
procedure CancelAreaSelect | |
procedure ApplyCoords(const Lat, Lon: Double; const RadiusKm: Double = 0) | |
function ApplyCoordsText(const Text: string): Boolean | |
procedure ApplyBounds(const South, West, North, East: Double) | |
procedure ApplyAreaId(const AreaId: string) |
Pełny opis wszystkich właściwości: dokumentacja komponentów map.
Zobacz też
TTileMapVCL
Mapa kafelkowa dla aplikacji Windows (VCL) – OpenStreetMap, zdjęcia satelitarne, mapa terenu.
T3DMapVCL
Mapa wektorowa 2D/3D z budynkami, motywem dziennym/nocnym i własnymi kaflami z mapa.imetroll.com.