adsb-1090/sql/04_airports.sql

89 lines
4.7 KiB
SQL

-- =============================================================================
-- 04_airports.sql — table de référence des aérodromes d'Île-de-France
--
-- Sert de liste d'exclusion à l'onglet « Départs hors aérodromes » : tout point
-- de décollage situé dans le rayon d'un aérodrome ACTIF est écarté des
-- résultats. Chaque site a son propre rayon, ajustable indépendamment.
--
-- Le rayon n'est pas la taille de l'aérodrome mais la zone dans laquelle un
-- avion en montée initiale est encore attribuable à ce terrain. Il est donc
-- plus large pour les grandes plateformes (trajectoires de départ étendues)
-- que pour un héliport.
--
-- Usage :
-- docker exec -i wordpress-postgres psql -U pgz_admin -d wpz_postgres \
-- -v ON_ERROR_STOP=1 < 04_airports.sql
-- =============================================================================
\set ON_ERROR_STOP on
CREATE TABLE IF NOT EXISTS adsb.airports (
id serial PRIMARY KEY,
code text NOT NULL UNIQUE, -- code OACI (LFPG, LFPO, ...)
nom text NOT NULL,
lat double precision NOT NULL,
lon double precision NOT NULL,
rayon_km double precision NOT NULL DEFAULT 8,
type text NOT NULL DEFAULT 'aerodrome', -- aeroport|aerodrome|heliport|base
actif boolean NOT NULL DEFAULT true,
commentaire text
);
COMMENT ON TABLE adsb.airports IS
'Aérodromes connus, utilisés comme zones d''exclusion pour la détection des '
'départs atypiques. actif=false désactive l''exclusion sans perdre la fiche.';
COMMENT ON COLUMN adsb.airports.rayon_km IS
'Rayon d''exclusion en km : zone dans laquelle une montée initiale est '
'considérée comme issue de ce terrain.';
-- Colonne géographique générée, pour un ST_DWithin indexable
ALTER TABLE adsb.airports
ADD COLUMN IF NOT EXISTS geom geography(Point,4326)
GENERATED ALWAYS AS (ST_SetSRID(ST_MakePoint(lon, lat), 4326)::geography) STORED;
CREATE INDEX IF NOT EXISTS airports_geom_gix ON adsb.airports USING GIST (geom);
CREATE INDEX IF NOT EXISTS airports_actif_idx ON adsb.airports (actif) WHERE actif;
-- ── Données de référence ─────────────────────────────────────────────────────
-- Rayons de départ, à ajuster selon les résultats observés.
INSERT INTO adsb.airports (code, nom, lat, lon, rayon_km, type, commentaire) VALUES
('LFPG', 'Paris-Charles de Gaulle', 49.0097, 2.5479, 15, 'aeroport',
'Doublets de pistes, départs très étalés — rayon large'),
('LFPO', 'Paris-Orly', 48.7233, 2.3794, 12, 'aeroport',
'Départs vers le sud et l''ouest'),
('LFPB', 'Paris-Le Bourget', 48.9694, 2.4414, 10, 'aeroport',
'Aviation d''affaires, trafic dense en jets'),
('LFPV', 'Vélizy-Villacoublay', 48.7744, 2.2014, 8, 'base',
'Base aérienne 107 — à ~6 km de la station, très bien captée'),
('LFPN', 'Toussus-le-Noble', 48.7519, 2.1062, 8, 'aerodrome',
'Aviation légère et écoles — fort volume de tours de piste'),
('LFPZ', 'Saint-Cyr-l''École', 48.8081, 2.0736, 6, 'aerodrome',
'Aviation légère, planeurs'),
('LFPI', 'Paris-Issy-les-Moulineaux', 48.8331, 2.2725, 4, 'heliport',
'Héliport de Paris — à ~1 km de la station, couverture excellente'),
('LFPM', 'Melun-Villaroche', 48.6047, 2.6711, 8, 'aerodrome',
'Essais en vol et aviation générale'),
('LFPT', 'Pontoise-Cormeilles', 49.0966, 2.0408, 8, 'aerodrome',
'Aviation légère, école'),
('LFPL', 'Lognes-Émerainville', 48.8228, 2.6261, 6, 'aerodrome',
'Aviation légère'),
('LFPK', 'Coulommiers-Voisins', 48.8375, 3.0161, 8, 'aerodrome',
'Limite est de la couverture'),
('LFXU', 'Les Mureaux', 48.9983, 1.9433, 6, 'aerodrome',
'Aérodrome industriel'),
('LFPU', 'Moret-Épisy', 48.3422, 2.7986, 6, 'aerodrome',
'Planeurs — souvent hors de portée'),
('LFAI', 'Nangis-Les Loges', 48.5961, 3.0067, 6, 'aerodrome',
'Aviation légère, parachutisme'),
('LFOP', 'Rouen-Vallée de Seine', 49.3842, 1.1758, 10, 'aeroport',
'Hors couverture nominale — désactivable'),
('LFOB', 'Beauvais-Tillé', 49.4544, 2.1128, 12, 'aeroport',
'Limite nord de la couverture')
ON CONFLICT (code) DO NOTHING;
-- Sites au-delà de la portée utile : renseignés mais désactivés par défaut,
-- pour éviter d'exclure inutilement des zones où l'on ne capte rien.
UPDATE adsb.airports SET actif = false WHERE code IN ('LFOP', 'LFPU');
SELECT code, nom, rayon_km, type, actif FROM adsb.airports ORDER BY actif DESC, code;