{"name": "Aerodrome_Spatial_Planner", "package_name": "AerodromeSpatialPlanner", "version": "1.2", "experimental": false, "qgis_min": "3.16.0", "qgis_max": "4.99.0", "downloads": 147, "uploaded_by": "rahulpandey696", "upload_datetime": "2026-09-14T04:35:18.774580", "changelog": "changelog=\r\n    [1.2] - 2026-09-14\r\n\r\n    SECURITY\r\n    - Removed all insecure TLS fallbacks. Six request sites (Open-Meteo archive\r\n      and forecast, NOAA WMM declination, Overpass airways, climate data, API\r\n      connectivity test) retried with verify=False after an SSLError, silencing\r\n      urllib3 warnings and exposing those calls to interception. Certificate\r\n      verification is now always enforced and urllib3.disable_warnings() is gone.\r\n    - Output folder is opened via QDesktopServices.openUrl() instead of\r\n      os.startfile() and subprocess.Popen(['open'/'xdg-open', ...]), removing\r\n      partial-executable-path resolution and process spawning entirely.\r\n    - Removed the unused xml.etree.ElementTree import from the engine, which\r\n      flagged as an untrusted-XML parsing risk despite never being called.\r\n    - Replaced silent exception handlers. Four \"except: pass\" blocks (lighting\r\n      swatch colouring, two AOI centroid derivations, graphics-view zoom anchors)\r\n      and one bare \"except: continue\" in compute_runway_slope() now catch\r\n      Exception explicitly and report through QgsMessageLog, so failures are\r\n      diagnosable instead of invisible. Slope sampling additionally reports how\r\n      many chainage points could not be reprojected to the DTM CRS.\r\n    - Illustrative placeholder obstacles in the obstruction map now use a seeded\r\n      numpy.random.default_rng(42) rather than the random module.\r\n\r\n    FIXED\r\n    - Magnetic variation was applied with the wrong sign. Runway magnetic bearings\r\n      and designators were computed as TRUE + variation instead of TRUE - variation.\r\n      At sites with East variation this produced a magnetic bearing greater than\r\n      true (the opposite of correct), and designators off by the full variation\r\n      doubled. Affected analyze_runway_orientations_icao(), get_runway_designation(),\r\n      and both runway-designation-point writers. Reported by a user testing against\r\n      CYET (Edson, AB) and a second North American site.\r\n    - Runway designator rounding used banker's rounding. Python's round() rounds\r\n      half-to-even, so a magnetic bearing of 345 deg yielded RWY 34 (correct: 35),\r\n      145 deg yielded 14 (correct: 15), and 005 deg yielded 36 (correct: 01). Now\r\n      uses arithmetic round-half-up per ICAO Annex 14 Sec. 5.2.2.\r\n    - Magnetic annual change was double-counted. Declination fetched from the NOAA\r\n      WMM API is already valid for the current epoch, but the secular variation was\r\n      then applied again across (current_year - wind_data_mid_year), adding up to\r\n      ~10 years of spurious drift on top. The variation's source epoch is now\r\n      tracked and advanced only to an explicit target epoch.\r\n\r\n    CHANGED\r\n    - True/magnetic conversion consolidated into true_to_magnetic(),\r\n      magnetic_to_true() and runway_number_from_magnetic() on the engine class,\r\n      replacing four independent inline copies of the formula.\r\n    - Compliance reports and the analysis log now state variation as \"16.0 deg E\"\r\n      rather than a bare signed value, and print the conversion convention in use.\r\n    - NOAA declination fetch records the epoch of the returned value.\r\n    - Declination button tooltip documents the sign convention.", "external_deps": null, "download_url": "https://plugins.qgis.org/plugins/AerodromeSpatialPlanner/version/1.2/download/"}