> ## Documentation Index
> Fetch the complete documentation index at: https://docs.canadava.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Aperçus des aéroports canadiens

> Aperçus vACA pour les principaux aéroports canadiens desservis par Air Canada : configuration des pistes, fréquences ATC, procédures courantes, points chauds, METAR en direct et couverture des réseaux ATC en ligne

export const Airports = ({airports = [], title = "Canadian Airport Briefings", labels = {}}) => {
  const DEFAULT_LABELS = {
    hub: "Hub",
    regional: "Regional",
    liveLabel: "VATSIM",
    liveTitle: "VATSIM ATIS broadcasting now"
  };
  const mergedLabels = {
    ...DEFAULT_LABELS,
    ...labels
  };
  const [liveIcaos, setLiveIcaos] = useState(() => new Set());
  useEffect(() => {
    let cancelled = false;
    const fetchAtisFeed = async () => {
      try {
        const res = await fetch("https://data.vatsim.net/v3/vatsim-data.json", {
          cache: "no-store"
        });
        if (!res.ok) return;
        const json = await res.json();
        const all = Array.isArray(json.atis) ? json.atis : [];
        const live = new Set();
        for (const a of all) {
          const cs = (a.callsign || "").toUpperCase();
          const m = cs.match(/^([A-Z]{4})(?:_[AD])?_ATIS$/);
          if (m) live.add(m[1]);
        }
        if (!cancelled) setLiveIcaos(live);
      } catch (_) {}
    };
    fetchAtisFeed();
    const interval = setInterval(fetchAtisFeed, 60 * 1000);
    return () => {
      cancelled = true;
      clearInterval(interval);
    };
  }, []);
  const typeKey = type => {
    const t = (type || "").toLowerCase();
    if (t.includes("hub") || t.includes("plaque") || t.includes("focus")) return "hub";
    if (t.includes("regional") || t.includes("régional") || t.includes("capital")) return "regional";
    return "default";
  };
  const typeLabel = k => {
    if (k === "hub") return mergedLabels.hub;
    if (k === "regional") return mergedLabels.regional;
    return "";
  };
  const TypeIcon = ({k}) => {
    const svgProps = {
      width: 14,
      height: 14,
      viewBox: "0 0 24 24",
      fill: "none",
      stroke: "currentColor",
      strokeWidth: 2,
      strokeLinecap: "round",
      strokeLinejoin: "round",
      "aria-hidden": true
    };
    switch (k) {
      case "hub":
        return <svg {...svgProps}>
            <path d="M16 10h4a2 2 0 0 1 0 4h-4l-4 7h-3l2-7H6l-2 2H1l2-4-2-4h3l2 2h5l-2-7h3z" />
          </svg>;
      case "regional":
        return <svg {...svgProps}>
            <path d="M17.8 19.2 16 11l3.5-3.5C21 6 21.5 4 21 3c-1-.5-3 0-4.5 1.5L13 8 4.8 6.2c-.5-.1-.9.1-1.1.5l-.3.5c-.2.5-.1 1 .3 1.3L9 12l-2 3H4l-1 1 3 2 2 3 1-1v-3l3-2 3.5 5.3c.3.4.8.5 1.3.3l.5-.2c.4-.3.6-.7.5-1.2z" />
          </svg>;
      default:
        return <svg {...svgProps}>
            <rect x="3" y="3" width="18" height="18" rx="2" />
          </svg>;
    }
  };
  const ChevronIcon = () => <svg width={16} height={16} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth={2} strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
      <polyline points="9 18 15 12 9 6" />
    </svg>;
  return <div className="kb-airports">
      <div className="kb-airports-header">
        <span className="kb-airports-eyebrow">{title}</span>
      </div>
      <div className="kb-airports-list">
        {airports.map((airport, i) => {
    const k = typeKey(airport.type);
    const sublabel = typeLabel(k);
    const isLive = airport.icao && liveIcaos.has(airport.icao.toUpperCase());
    return <a key={`a-${i}`} href={airport.href} className="kb-airports-row" data-type={k}>
              <span className="kb-airports-icon" aria-hidden="true">
                <TypeIcon k={k} />
              </span>
              <div className="kb-airports-text">
                <div className="kb-airports-name">
                  <span className="kb-airports-name-label">{airport.name}</span>
                  {airport.icao && <span className="kb-airports-icao">{airport.icao}</span>}
                  {isLive && <span className="kb-airports-live" title={mergedLabels.liveTitle}>
                      <span className="kb-airports-live-dot" aria-hidden="true" />
                      <span className="kb-airports-live-label">
                        {mergedLabels.liveLabel}
                      </span>
                    </span>}
                </div>
                {airport.description && <div className="kb-airports-description">
                    {airport.description}
                  </div>}
              </div>
              <div className="kb-airports-type-col">
                {sublabel && <span className="kb-airports-sublabel">{sublabel}</span>}
              </div>
              <span className="kb-airports-chevron" aria-hidden="true">
                <ChevronIcon />
              </span>
            </a>;
  })}
      </div>
    </div>;
};

export const ChartsLinks = ({icao, title = "Charts", freeLabel = "Free"}) => {
  const code = (icao || "").toUpperCase().trim();
  const providers = [{
    name: "ChartFox",
    href: code ? `https://chartfox.org/${code}` : "https://chartfox.org",
    logoSrc: "https://chartfox.org/images/icons/180x180.png",
    badge: freeLabel
  }, {
    name: "Navigraph",
    href: code ? `https://charts.navigraph.com/airport/${code}` : "https://charts.navigraph.com",
    logoSrc: "https://charts.navigraph.com/favicon.ico"
  }];
  return <div className="kb-charts-links">
      <div className="kb-charts-links-header">
        <span className="kb-charts-links-eyebrow">{title}</span>
      </div>
      <div className="kb-charts-links-grid">
        {providers.map(({name, href, logoSrc, badge}) => <a key={name} className="kb-charts-link" href={href} target="_blank" rel="noopener noreferrer">
            <span className="kb-charts-link-logo" aria-hidden="true">
              <img src={logoSrc} alt="" width="20" height="20" loading="lazy" />
            </span>
            <span className="kb-charts-link-name">{name}</span>
            {badge && <span className="kb-charts-link-badge">{badge}</span>}
            <span className="kb-charts-link-chevron" aria-hidden="true">
              <svg width="14" height="14" viewBox="0 0 14 14" fill="none">
                <path d="M5 3L9 7L5 11" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
              </svg>
            </span>
          </a>)}
      </div>
    </div>;
};

<img className="block dark:hidden" src="https://mintcdn.com/virtualaircanada/XtVYTuxmXrU2YyU6/images/aops/airports/airports-light.png?fit=max&auto=format&n=XtVYTuxmXrU2YyU6&q=85&s=115d00e62d40e9781d6f8386dc5cdb6d" alt="Aperçus des aéroports canadiens" width="2064" height="1104" data-path="images/aops/airports/airports-light.png" />

<img className="hidden dark:block" src="https://mintcdn.com/virtualaircanada/XtVYTuxmXrU2YyU6/images/aops/airports/airports-dark.png?fit=max&auto=format&n=XtVYTuxmXrU2YyU6&q=85&s=1f770e38bd6ad415b5a8d5bc4e9bbd9f" alt="Aperçus des aéroports canadiens" width="2064" height="1104" data-path="images/aops/airports/airports-dark.png" />

<Info>Pour usage en simulation de vol uniquement - Ne **PAS** utiliser pour le vol réel</Info>

Cette section vous donne une référence rapide pour les aéroports canadiens que vous allez piloter le plus souvent chez Virtual Air Canada. Chaque page couvre la configuration du terrain (pistes, longueurs, catégories ILS), les fréquences ATC publiées, le rythme opérationnel typique, les points chauds et dangers courants, ainsi qu'un METAR en direct tiré de l'API du FAA Aviation Weather Center afin que vous puissiez vérifier les conditions sans quitter la page.

Les huit aéroports présentés ici sont les trois plaques tournantes principales d'Air Canada (Toronto, Montréal, Vancouver), Calgary comme quatrième porte d'entrée majeure de l'Ouest, et quatre villes régionales où Air Canada exploite un service grandes lignes ou Express quotidien (Ottawa, Québec, Edmonton, Halifax). Utilisez ces aperçus durant la planification prévol, en complément de votre dossier SimBrief, des cartes et du plus récent METAR / TAF.

## Aéroports

<Airports
  title="Aperçus des aéroports canadiens"
  labels={{ hub: "Plaque tournante", regional: "Régional", liveTitle: "ATIS VATSIM en cours de diffusion" }}
  airports={[
{ type: "hub", icao: "CYYZ", name: "Toronto Pearson", href: "/fr/aops/airports/toronto-pearson", description: "Aéroport le plus achalandé du Canada, cinq pistes" },
{ type: "hub", icao: "CYUL", name: "Montréal-Trudeau", href: "/fr/aops/airports/montreal-trudeau", description: "ATC bilingue, deux pistes parallèles" },
{ type: "hub", icao: "CYVR", name: "Vancouver", href: "/fr/aops/airports/vancouver-international", description: "Sur l'île Sea Island, brouillard côtier et relief" },
{ type: "hub", icao: "CYYC", name: "Calgary", href: "/fr/aops/airports/calgary-international", description: "Prairie en altitude, vents chinook" },
{ type: "regional", icao: "CYOW", name: "Ottawa", href: "/fr/aops/airports/ottawa", description: "Capitale nationale, ATC bilingue" },
{ type: "regional", icao: "CYQB", name: "Québec", href: "/fr/aops/airports/quebec-city", description: "ATC bilingue, ILS unique, opérations hivernales intenses" },
{ type: "regional", icao: "CYEG", name: "Edmonton", href: "/fr/aops/airports/edmonton", description: "Grand froid, pistes sécantes" },
{ type: "regional", icao: "CYHZ", name: "Halifax", href: "/fr/aops/airports/halifax", description: "Porte transatlantique gros-porteurs, brouillard côtier" }
]}
/>

## Cartes

<ChartsLinks title="Cartes" freeLabel="Gratuit" />

## Comment utiliser ces aperçus

Le schéma de pistes sur chaque page est un diagramme stylisé, pas une carte de navigation. Utilisez-le pour reconnaître la configuration du terrain d'un coup d'œil. Pour les procédures réelles, les autorisations de roulage et les cartes d'approche, consultez toujours le Canada Air Pilot (CAP) en vigueur et la trousse <Tooltip tip="Avis aux navigateurs aériens" cta="Voir le glossaire" href="/fr/aops/additional-resources/glossary/notam">NOTAM</Tooltip> à jour.

Le bloc Météo en direct récupère le <Tooltip tip="Compte rendu météorologique d'aérodrome" cta="Voir le glossaire" href="/fr/aops/additional-resources/glossary/metar">METAR</Tooltip> le plus récent de l'Aviation Weather Center et se rafraîchit toutes les cinq minutes. Cliquez sur **Metar & Taf Visual decoder** pour une ventilation graphique incluant le TAF, le plafond, les composantes de vent et les conditions prévues.

Le bloc Cartes de réseaux ATC en ligne mène vers les cartes de couverture en direct des principaux réseaux ATC virtuels. Vérifiez toujours qui est en ligne avant de refouler, particulièrement sur VATSIM où la couverture des grands terrains canadiens varie au fil de la journée.

<Card title="Retour aux ASOPs" icon="arrow-left" href="/fr/aops/overview/index">
  Retournez à l'index des ASOPs
</Card>
