fly.imetroll.com

ADS-B proxy (OpenSky) dla komponentu Delphi TAircraft / TPlanes.

Policy: tylko samoloty w żądanym obszarze. Nigdy nie zwraca całego świata. Brak obszaru → HTTP 400.

Auth jak weather: ?key= na /v1/* (poza /v1/health i /v1/areas).

Endpointy

Method / pathAuthOpis
GET /v1/healthpublicStatus + policy + tryby select
GET /v1/areaspublicKatalog nazwanych obszarów (id → bbox)
GET /v1/stateskey=Samoloty tylko w obszarze (OpenSky lub sample)
GET /v1/sample/stateskey=Sample przefiltrowany do obszaru (też wymaga select)
GET /v1/trackskey=Trasa + seria wysokości dla icao24

Wybór obszaru (wymagany) – 3 tryby

TrybGET paramsOpis
rectanglelamin lomin lamax lomaxProstokąt WGS84 (south, west, north, east). Max ~40°×60°.
radiuslat lon radius_kmŚrodek + promień [km]. Alias: clat/clon/radius. Max 1500 km. Odpowiedź filtruje haversine (koło).
namedarea=idId z /v1/areas (np. pl, warsaw).
GET /v1/states?lamin=49&lomin=14&lamax=55&lomax=25&key=YOUR_KEY
GET /v1/states?lat=52.23&lon=21.01&radius_km=80&key=YOUR_KEY
GET /v1/states?area=pl&key=YOUR_KEY

GET /v1/states – parametry wejściowe

ParametrTypTrybOpis
laminfloatrectanglePołudnie (−90…90)
lominfloatrectangleZachód (−180…180)
lamaxfloatrectanglePółnoc
lomaxfloatrectangleWschód
lat / clatfloatradiusŚrodek – szerokość
lon / clonfloatradiusŚrodek – długość
radius_kmfloatradiusPromień w kilometrach (0…1500]
areastringnamedId obszaru z katalogu
keystringwszystkieKlucz API (nginx)

GET /v1/states – pola JSON (odpowiedź)

PoleTypOpis
timeintUnix time snapshot
sourcestringopensky | sample
countintLiczba samolotów w obszarze
bboxobjectObszar zapytania (patrz niżej)
bbox.modestringrectangle | radius
bbox.lamin/lomin/lamax/lomaxfloatEnvelope (zawsze; dla radius = bbox opisujący koło)
bbox.lat/lon/radius_kmfloatTylko mode=radius
bbox.areastring?Named id gdy użyto area=
notestring?Uwaga (np. fallback sample)
aircraft[]arrayStany tylko w obszarze
aircraft[].icao24stringHex ICAO24 (lowercase)
aircraft[].callsignstringCallsign
aircraft[].origin_countrystringKraj
aircraft[].lat / lonfloatPozycja WGS84
aircraft[].baro_altitudefloat?Wysokość baro [m]
aircraft[].geo_altitudefloat?Wysokość geo [m]
aircraft[].on_groundboolNa ziemi
aircraft[].velocityfloat?Prędkość [m/s]
aircraft[].true_trackfloat?Kurs [°]
aircraft[].vertical_ratefloat?V/S [m/s]
aircraft[].squawkstring?Squawk
aircraft[].time_positionint?Czas pozycji
aircraft[].last_contactint?Ostatni kontakt

GET /v1/tracks

Param / poleOpis
icao24 (GET, wymagany)Identyfikator ICAO24
time (opcjonalny)Unix time (0 = bieżący lot)
path[]{t, lat, lon, alt, track, on_ground}

Błędy

HTTPKiedy
400Brak obszaru, zły zakres, nieznany area, bbox/radius za duży, brak icao24
401Brak / zły key=
404Nieznana ścieżka

Delphi TAircraft – Active = automatyczne zapytanie po wyborze obszaru

Aircraft1.Active = True na mapie: każdy wybór obszaru myszą/palcem (nav selectArea / BeginAreaSelect) albo podanie współrzędnych (ApplyCoords / ApplyCoordsText / ApplyBounds / ApplyAreaId) od razu wysyła zapytanie do fly (RefreshAsync). Trwające zapytanie dla starego obszaru jest porzucane. Active = False → tylko zmiana Area (wywołaj Request sam).

Aircraft1.ApiKey := '...';
Aircraft1.RequireApiKey := True;
Aircraft1.Active := True;                 // + IntervalSec odświeżanie
// A) rysowanie (pan/drag zablokowane) → Map area select → fly
Aircraft1.BeginAreaSelect;                // lub BeginAreaSelect(aakRadius) = koło
// B) współrzędne: lat/lon + opcjonalny promień [km] (0 = Area.RadiusKm, domyślnie 80)
Aircraft1.ApplyCoords(52.23, 21.01, 50);  // → GET /v1/states?lat=52.23&lon=21.01&radius_km=50
Aircraft1.ApplyCoordsText(Edit1.Text);    // "52.23, 21.01, 50" | "52,23; 21,01" | "lat=52.2 lon=21 r=30"
// C) prostokąt ze współrzędnych / named
Aircraft1.ApplyBounds(49, 14, 55, 25);    // lamin lomin lamax lomax
Aircraft1.ApplyAreaId('warsaw');          // area=warsaw
// Właściwości: UseMapAreaSelection, AutoRequestOnAreaSelect (True), ShowAreaOnMap (True), OnAreaApplied
// Map.OnAreaSelected pozostaje Twoim zdarzeniem – TAircraft słucha osobno (multicast).

Help: TAircraft