From 20270f5816b4bb14ea8278edad6d424dab24a0b6 Mon Sep 17 00:00:00 2001 From: eneller Date: Wed, 21 Jan 2026 15:33:39 +0100 Subject: [PATCH] Create Web UI using shiny commit 3de1345642f8c8132d616b2b42ecaf57a14db5f7 Merge: 9106db3 f4955af Author: eneller Date: Wed Jan 21 15:14:32 2026 +0100 Merge branch 'feat/trajectories-and-alternative-gui' into feat/add-osm-for-trajectory commit 9106db35a9c5c9013a8b09e7e3e7d30ab8c0df0f Author: eneller Date: Wed Jan 21 15:13:28 2026 +0100 build: lock renv commit f4955af7f46009de4b7f525ea499a529fc2e0bfa Author: eneller Date: Wed Jan 21 13:13:23 2026 +0100 build: exclude demo chunks from purl commit 2757a86383ee759190e794fd479d4417e4a6afb1 Author: lukasadrion Date: Wed Jan 21 13:12:34 2026 +0100 :bug: add getAircraftTrajectories function commit 133827c2bd46a7ad6f1a6e6cbc0d9d73c172a1c1 Author: lukasadrion Date: Wed Jan 21 12:54:03 2026 +0100 add interactive map with leaflet commit a7aa5025ea529b434d7c10b58fc45bca4c6e6c84 Merge: 74292bd 93f4e3e Author: eneller Date: Wed Jan 21 12:22:42 2026 +0100 Merge remote-tracking branch 'refs/remotes/origin/feat/trajectories-and-alternative-gui' into feat/trajectories-and-alternative-gui commit 93f4e3e81d16907bc039c7e50fb4ff53f8148263 Author: lukasadrion Date: Wed Jan 21 00:21:50 2026 +0100 :memo: add more documentation commit 74292bd0ec239f85f1146cd707bbc02a92e0fe48 Merge: ec51069 86a9e41 Author: eneller Date: Wed Jan 21 00:09:16 2026 +0100 Merge remote-tracking branch 'origin/feat/trajectories-and-alternative-gui' into feat/trajectories-and-alternative-gui commit ec51069f1d56cc95f6bb2302a5f5be32ead6961f Author: eneller Date: Tue Jan 20 23:49:51 2026 +0100 wip: fix: trajectory stats for single aircraft commit 86a9e4163f545453c7fca3117cb134c3615e4561 Author: lukasadrion Date: Tue Jan 20 23:36:07 2026 +0100 :bug: fixed the credentials bug for documentation commit 387e1caa7fe5d5429c50c81536824ef16811d4a6 Author: lukasadrion Date: Tue Jan 20 23:10:08 2026 +0100 :memo: add documentation to main commit 696f52eda3e22078f1173636fe18e5e752727ecd Author: lukasadrion Date: Tue Jan 20 16:53:19 2026 +0100 :recycle: refactor all logic to main.rmd commit eb497462681e861bfbc6471e20f156c9a3bcb1be Author: lukasadrion Date: Tue Jan 20 16:13:41 2026 +0100 :adhesive_bandage: fix small issues in main commit f491345ea0ff2938dea1e3a9af2ea9f1845e2144 Author: eneller Date: Tue Jan 20 15:46:26 2026 +0100 refactor: consolidate main.Rmd statistics commit aacdc126385df319fa30018a144eb073ad31a12b Author: lukasadrion Date: Tue Jan 20 15:31:21 2026 +0100 :recycle: refactor app.Rmd commit e4c7ce4977cd89cb0c1fe4054bd320f4d400f2a7 Author: eneller Date: Tue Jan 20 13:48:49 2026 +0100 chore: move app from R to Rmd commit d9a33a5d2b142f7b169c1fa9ef7d757e42586356 Author: eneller Date: Mon Jan 19 17:45:35 2026 +0100 build: add dependencies commit d8dd920d6b55534e31aee1639276cdb8d520c304 Author: Patrik M <57401452+Patrik157@users.noreply.github.com> Date: Mon Jan 19 17:25:18 2026 +0100 Added trajectories and alternative GUI --- renv.lock | 994 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/app.Rmd | 301 ++++++++++++++++ src/main.Rmd | 678 ++++++++++++++++++++++++++++++++--- 3 files changed, 1922 insertions(+), 51 deletions(-) create mode 100644 src/app.Rmd diff --git a/renv.lock b/renv.lock index 2881e72..99f9f37 100644 --- a/renv.lock +++ b/renv.lock @@ -58,6 +58,31 @@ "Maintainer": "Kirill Müller ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "KernSmooth": { + "Package": "KernSmooth", + "Version": "2.23-26", + "Source": "Repository", + "Priority": "recommended", + "Date": "2024-12-10", + "Title": "Functions for Kernel Smoothing Supporting Wand & Jones (1995)", + "Authors@R": "c(person(\"Matt\", \"Wand\", role = \"aut\", email = \"Matt.Wand@uts.edu.au\"), person(\"Cleve\", \"Moler\", role = \"ctb\", comment = \"LINPACK routines in src/d*\"), person(\"Brian\", \"Ripley\", role = c(\"trl\", \"cre\", \"ctb\"), email = \"Brian.Ripley@R-project.org\", comment = \"R port and updates\"))", + "Note": "Maintainers are not available to give advice on using a package they did not author.", + "Depends": [ + "R (>= 2.5.0)", + "stats" + ], + "Suggests": [ + "MASS", + "carData" + ], + "Description": "Functions for kernel smoothing (and density estimation) corresponding to the book: Wand, M.P. and Jones, M.C. (1995) \"Kernel Smoothing\".", + "License": "Unlimited", + "ByteCompile": "yes", + "NeedsCompilation": "yes", + "Author": "Matt Wand [aut], Cleve Moler [ctb] (LINPACK routines in src/d*), Brian Ripley [trl, cre, ctb] (R port and updates)", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" + }, "MASS": { "Package": "MASS", "Version": "7.3-65", @@ -503,6 +528,68 @@ "Maintainer": "Winston Chang ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "class": { + "Package": "class", + "Version": "7.3-23", + "Source": "Repository", + "Priority": "recommended", + "Date": "2025-01-01", + "Depends": [ + "R (>= 3.0.0)", + "stats", + "utils" + ], + "Imports": [ + "MASS" + ], + "Authors@R": "c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\"), email = \"Brian.Ripley@R-project.org\"), person(\"William\", \"Venables\", role = \"cph\"))", + "Description": "Various functions for classification, including k-nearest neighbour, Learning Vector Quantization and Self-Organizing Maps.", + "Title": "Functions for Classification", + "ByteCompile": "yes", + "License": "GPL-2 | GPL-3", + "URL": "http://www.stats.ox.ac.uk/pub/MASS4/", + "NeedsCompilation": "yes", + "Author": "Brian Ripley [aut, cre, cph], William Venables [cph]", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" + }, + "classInt": { + "Package": "classInt", + "Version": "0.4-11", + "Source": "Repository", + "Date": "2025-01-06", + "Title": "Choose Univariate Class Intervals", + "Authors@R": "c( person(\"Roger\", \"Bivand\", role=c(\"aut\", \"cre\"), email=\"Roger.Bivand@nhh.no\", comment=c(ORCID=\"0000-0003-2392-6140\")), person(\"Bill\", \"Denney\", role=\"ctb\", comment=c(ORCID=\"0000-0002-5759-428X\")), person(\"Richard\", \"Dunlap\", role=\"ctb\"), person(\"Diego\", \"Hernangómez\", role=\"ctb\", comment=c(ORCID=\"0000-0001-8457-4658\")), person(\"Hisaji\", \"Ono\", role=\"ctb\"), person(\"Josiah\", \"Parry\", role = \"ctb\", comment = c(ORCID = \"0000-0001-9910-865X\")), person(\"Matthieu\", \"Stigler\", role=\"ctb\", comment =c(ORCID=\"0000-0002-6802-4290\")))", + "Depends": [ + "R (>= 2.2)" + ], + "Imports": [ + "grDevices", + "stats", + "graphics", + "e1071", + "class", + "KernSmooth" + ], + "Suggests": [ + "spData (>= 0.2.6.2)", + "units", + "knitr", + "rmarkdown", + "tinytest" + ], + "NeedsCompilation": "yes", + "Description": "Selected commonly used methods for choosing univariate class intervals for mapping or other graphics purposes.", + "License": "GPL (>= 2)", + "URL": "https://r-spatial.github.io/classInt/, https://github.com/r-spatial/classInt/", + "BugReports": "https://github.com/r-spatial/classInt/issues/", + "RoxygenNote": "6.1.1", + "Encoding": "UTF-8", + "VignetteBuilder": "knitr", + "Author": "Roger Bivand [aut, cre] (), Bill Denney [ctb] (), Richard Dunlap [ctb], Diego Hernangómez [ctb] (), Hisaji Ono [ctb], Josiah Parry [ctb] (), Matthieu Stigler [ctb] ()", + "Maintainer": "Roger Bivand ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, "cli": { "Package": "cli", "Version": "3.6.5", @@ -623,6 +710,30 @@ "Author": "Martin Maechler [aut, cre] (), Peter Rousseeuw [aut] (Fortran original, ), Anja Struyf [aut] (S original), Mia Hubert [aut] (S original, ), Kurt Hornik [trl, ctb] (port to R; maintenance(1999-2000), ), Matthias Studer [ctb], Pierre Roudier [ctb], Juan Gonzalez [ctb], Kamil Kozlowski [ctb], Erich Schubert [ctb] (fastpam options for pam(), ), Keefe Murphy [ctb] (volume.ellipsoid({d >= 3}))", "Repository": "CRAN" }, + "commonmark": { + "Package": "commonmark", + "Version": "2.0.0", + "Source": "Repository", + "Type": "Package", + "Title": "High Performance CommonMark and Github Markdown Rendering in R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", ,\"jeroenooms@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"John MacFarlane\", role = \"cph\", comment = \"Author of cmark\"))", + "Description": "The CommonMark specification defines a rationalized version of markdown syntax. This package uses the 'cmark' reference implementation for converting markdown text into various formats including html, latex and groff man. In addition it exposes the markdown parse tree in xml format. Also includes opt-in support for GFM extensions including tables, autolinks, and strikethrough text.", + "License": "BSD_2_clause + file LICENSE", + "URL": "https://docs.ropensci.org/commonmark/ https://ropensci.r-universe.dev/commonmark", + "BugReports": "https://github.com/r-lib/commonmark/issues", + "Suggests": [ + "curl", + "testthat", + "xml2" + ], + "RoxygenNote": "7.3.2", + "Language": "en-US", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), John MacFarlane [cph] (Author of cmark)", + "Maintainer": "Jeroen Ooms ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, "cpp11": { "Package": "cpp11", "Version": "0.5.2", @@ -733,6 +844,38 @@ "Maintainer": "Jeroen Ooms ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "crosstalk": { + "Package": "crosstalk", + "Version": "1.2.2", + "Source": "Repository", + "Type": "Package", + "Title": "Inter-Widget Interactivity for HTML Widgets", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(, \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js library\"), person(\"Kristopher Michael\", \"Kowal\", role = c(\"ctb\", \"cph\"), comment = \"es5-shim library\"), person(, \"es5-shim contributors\", role = c(\"ctb\", \"cph\"), comment = \"es5-shim library\"), person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"), comment = \"ion.rangeSlider library\"), person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"), comment = \"Javascript strftime library\") )", + "Description": "Provides building blocks for allowing HTML widgets to communicate with each other, with Shiny or without (i.e. static .html files). Currently supports linked brushing and filtering.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/crosstalk/, https://github.com/rstudio/crosstalk", + "BugReports": "https://github.com/rstudio/crosstalk/issues", + "Imports": [ + "htmltools (>= 0.3.6)", + "jsonlite", + "lazyeval", + "R6" + ], + "Suggests": [ + "bslib", + "ggplot2", + "sass", + "shiny", + "testthat (>= 2.1.0)" + ], + "Config/Needs/website": "jcheng5/d3scatter, DT, leaflet, rmarkdown", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Joe Cheng [aut], Carson Sievert [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd], jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Brian Reavis [ctb, cph] (selectize.js library), Kristopher Michael Kowal [ctb, cph] (es5-shim library), es5-shim contributors [ctb, cph] (es5-shim library), Denis Ineshin [ctb, cph] (ion.rangeSlider library), Sami Samhuri [ctb, cph] (Javascript strftime library)", + "Maintainer": "Carson Sievert ", + "Repository": "RSPM" + }, "curl": { "Package": "curl", "Version": "7.0.0", @@ -980,6 +1123,42 @@ "Maintainer": "Hadley Wickham ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "e1071": { + "Package": "e1071", + "Version": "1.7-17", + "Source": "Repository", + "Title": "Misc Functions of the Department of Statistics, Probability Theory Group (Formerly: E1071), TU Wien", + "Imports": [ + "graphics", + "grDevices", + "class", + "stats", + "methods", + "utils", + "proxy" + ], + "Suggests": [ + "cluster", + "mlbench", + "nnet", + "randomForest", + "rpart", + "SparseM", + "xtable", + "Matrix", + "MASS", + "slam" + ], + "Authors@R": "c(person(given = \"David\", family = \"Meyer\", role = c(\"aut\", \"cre\"), email = \"David.Meyer@R-project.org\", comment = c(ORCID = \"0000-0002-5196-3048\")), person(given = \"Evgenia\", family = \"Dimitriadou\", role = c(\"aut\",\"cph\")), person(given = \"Kurt\", family = \"Hornik\", role = \"aut\", email = \"Kurt.Hornik@R-project.org\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(given = \"Andreas\", family = \"Weingessel\", role = \"aut\"), person(given = \"Friedrich\", family = \"Leisch\", role = \"aut\"), person(given = \"Chih-Chung\", family = \"Chang\", role = c(\"ctb\",\"cph\"), comment = \"libsvm C++-code\"), person(given = \"Chih-Chen\", family = \"Lin\", role = c(\"ctb\",\"cph\"), comment = \"libsvm C++-code\"))", + "Description": "Functions for latent class analysis, short time Fourier transform, fuzzy clustering, support vector machines, shortest path computation, bagged clustering, naive Bayes classifier, generalized k-nearest neighbour ...", + "License": "GPL-2 | GPL-3", + "LazyLoad": "yes", + "NeedsCompilation": "yes", + "Author": "David Meyer [aut, cre] (ORCID: ), Evgenia Dimitriadou [aut, cph], Kurt Hornik [aut] (ORCID: ), Andreas Weingessel [aut], Friedrich Leisch [aut], Chih-Chung Chang [ctb, cph] (libsvm C++-code), Chih-Chen Lin [ctb, cph] (libsvm C++-code)", + "Maintainer": "David Meyer ", + "Repository": "https://packagemanager.posit.co/cran/latest", + "Encoding": "UTF-8" + }, "evaluate": { "Package": "evaluate", "Version": "1.0.5", @@ -1475,6 +1654,80 @@ "Maintainer": "Carson Sievert ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "htmlwidgets": { + "Package": "htmlwidgets", + "Version": "1.6.4", + "Source": "Repository", + "Type": "Package", + "Title": "HTML Widgets for R", + "Authors@R": "c( person(\"Ramnath\", \"Vaidyanathan\", role = c(\"aut\", \"cph\")), person(\"Yihui\", \"Xie\", role = \"aut\"), person(\"JJ\", \"Allaire\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Kenton\", \"Russell\", role = c(\"aut\", \"cph\")), person(\"Ellis\", \"Hughes\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A framework for creating HTML widgets that render in various contexts including the R console, 'R Markdown' documents, and 'Shiny' web applications.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/ramnathv/htmlwidgets", + "BugReports": "https://github.com/ramnathv/htmlwidgets/issues", + "Imports": [ + "grDevices", + "htmltools (>= 0.5.7)", + "jsonlite (>= 0.9.16)", + "knitr (>= 1.8)", + "rmarkdown", + "yaml" + ], + "Suggests": [ + "testthat" + ], + "Enhances": [ + "shiny (>= 1.1)" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Ramnath Vaidyanathan [aut, cph], Yihui Xie [aut], JJ Allaire [aut], Joe Cheng [aut], Carson Sievert [aut, cre] (), Kenton Russell [aut, cph], Ellis Hughes [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Carson Sievert ", + "Repository": "RSPM" + }, + "httpuv": { + "Package": "httpuv", + "Version": "1.6.16", + "Source": "Repository", + "Type": "Package", + "Title": "HTTP and WebSocket Server Library", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit, PBC\", \"fnd\", role = \"cph\"), person(\"Hector\", \"Corrada Bravo\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Andrzej\", \"Krzemienski\", role = \"cph\", comment = \"optional.hpp\"), person(\"libuv project contributors\", role = \"cph\", comment = \"libuv library, see src/libuv/AUTHORS file\"), person(\"Joyent, Inc. and other Node contributors\", role = \"cph\", comment = \"libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file\"), person(\"Niels\", \"Provos\", role = \"cph\", comment = \"libuv subcomponent: tree.h\"), person(\"Internet Systems Consortium, Inc.\", role = \"cph\", comment = \"libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c\"), person(\"Alexander\", \"Chemeris\", role = \"cph\", comment = \"libuv subcomponent: stdint-msvc2008.h (from msinttypes)\"), person(\"Google, Inc.\", role = \"cph\", comment = \"libuv subcomponent: pthread-fixes.c\"), person(\"Sony Mobile Communcations AB\", role = \"cph\", comment = \"libuv subcomponent: pthread-fixes.c\"), person(\"Berkeley Software Design Inc.\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Kenneth\", \"MacKay\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016)\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Steve\", \"Reid\", role = \"aut\", comment = \"SHA-1 implementation\"), person(\"James\", \"Brown\", role = \"aut\", comment = \"SHA-1 implementation\"), person(\"Bob\", \"Trower\", role = \"aut\", comment = \"base64 implementation\"), person(\"Alexander\", \"Peslyak\", role = \"aut\", comment = \"MD5 implementation\"), person(\"Trantor Standard Systems\", role = \"cph\", comment = \"base64 implementation\"), person(\"Igor\", \"Sysoev\", role = \"cph\", comment = \"http-parser\") )", + "Description": "Provides low-level socket and protocol support for handling HTTP and WebSocket requests directly from within R. It is primarily intended as a building block for other packages, rather than making it particularly easy to create complete web applications using httpuv alone. httpuv is built on top of the libuv and http-parser C libraries, both of which were developed by Joyent, Inc. (See LICENSE file for libuv and http-parser license information.)", + "License": "GPL (>= 2) | file LICENSE", + "URL": "https://github.com/rstudio/httpuv", + "BugReports": "https://github.com/rstudio/httpuv/issues", + "Depends": [ + "R (>= 2.15.1)" + ], + "Imports": [ + "later (>= 0.8.0)", + "promises", + "R6", + "Rcpp (>= 1.0.7)", + "utils" + ], + "Suggests": [ + "callr", + "curl", + "jsonlite", + "testthat", + "websocket" + ], + "LinkingTo": [ + "later", + "Rcpp" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "GNU make, zlib", + "Collate": "'RcppExports.R' 'httpuv.R' 'random_port.R' 'server.R' 'staticServer.R' 'static_paths.R' 'utils.R'", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Winston Chang [aut, cre], Posit, PBC fnd [cph], Hector Corrada Bravo [ctb], Jeroen Ooms [ctb], Andrzej Krzemienski [cph] (optional.hpp), libuv project contributors [cph] (libuv library, see src/libuv/AUTHORS file), Joyent, Inc. and other Node contributors [cph] (libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file), Niels Provos [cph] (libuv subcomponent: tree.h), Internet Systems Consortium, Inc. [cph] (libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c), Alexander Chemeris [cph] (libuv subcomponent: stdint-msvc2008.h (from msinttypes)), Google, Inc. [cph] (libuv subcomponent: pthread-fixes.c), Sony Mobile Communcations AB [cph] (libuv subcomponent: pthread-fixes.c), Berkeley Software Design Inc. [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Kenneth MacKay [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016) [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Steve Reid [aut] (SHA-1 implementation), James Brown [aut] (SHA-1 implementation), Bob Trower [aut] (base64 implementation), Alexander Peslyak [aut] (MD5 implementation), Trantor Standard Systems [cph] (base64 implementation), Igor Sysoev [cph] (http-parser)", + "Maintainer": "Winston Chang ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, "httr": { "Package": "httr", "Version": "1.4.7", @@ -1714,6 +1967,199 @@ "Repository": "https://packagemanager.posit.co/cran/latest", "Encoding": "UTF-8" }, + "later": { + "Package": "later", + "Version": "1.4.5", + "Source": "Repository", + "Type": "Package", + "Title": "Utilities for Scheduling Functions to Execute Later with Event Loops", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\"), person(\"Evan\", \"Nemerson\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\") )", + "Description": "Executes arbitrary R or C functions some time after the current time, after the R execution stack has emptied. The functions are scheduled in an event loop.", + "License": "MIT + file LICENSE", + "URL": "https://later.r-lib.org, https://github.com/r-lib/later", + "BugReports": "https://github.com/r-lib/later/issues", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ + "Rcpp (>= 1.0.10)", + "rlang" + ], + "Suggests": [ + "knitr", + "nanonext", + "promises", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-07-18", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut] (ORCID: ), Joe Cheng [aut], Charlie Gao [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Marcus Geelnard [ctb, cph] (TinyCThread library, https://tinycthread.github.io/), Evan Nemerson [ctb, cph] (TinyCThread library, https://tinycthread.github.io/)", + "Maintainer": "Charlie Gao ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "lattice": { + "Package": "lattice", + "Version": "0.22-7", + "Source": "Repository", + "Date": "2025-03-31", + "Priority": "recommended", + "Title": "Trellis Graphics for R", + "Authors@R": "c(person(\"Deepayan\", \"Sarkar\", role = c(\"aut\", \"cre\"), email = \"deepayan.sarkar@r-project.org\", comment = c(ORCID = \"0000-0003-4107-1553\")), person(\"Felix\", \"Andrews\", role = \"ctb\"), person(\"Kevin\", \"Wright\", role = \"ctb\", comment = \"documentation\"), person(\"Neil\", \"Klepeis\", role = \"ctb\"), person(\"Johan\", \"Larsson\", role = \"ctb\", comment = \"miscellaneous improvements\"), person(\"Zhijian (Jason)\", \"Wen\", role = \"cph\", comment = \"filled contour code\"), person(\"Paul\", \"Murrell\", role = \"ctb\", email = \"paul@stat.auckland.ac.nz\"), person(\"Stefan\", \"Eng\", role = \"ctb\", comment = \"violin plot improvements\"), person(\"Achim\", \"Zeileis\", role = \"ctb\", comment = \"modern colors\"), person(\"Alexandre\", \"Courtiol\", role = \"ctb\", comment = \"generics for larrows, lpolygon, lrect and lsegments\") )", + "Description": "A powerful and elegant high-level data visualization system inspired by Trellis graphics, with an emphasis on multivariate data. Lattice is sufficient for typical graphics needs, and is also flexible enough to handle most nonstandard requirements. See ?Lattice for an introduction.", + "Depends": [ + "R (>= 4.0.0)" + ], + "Suggests": [ + "KernSmooth", + "MASS", + "latticeExtra", + "colorspace" + ], + "Imports": [ + "grid", + "grDevices", + "graphics", + "stats", + "utils" + ], + "Enhances": [ + "chron", + "zoo" + ], + "LazyLoad": "yes", + "LazyData": "yes", + "License": "GPL (>= 2)", + "URL": "https://lattice.r-forge.r-project.org/", + "BugReports": "https://github.com/deepayan/lattice/issues", + "NeedsCompilation": "yes", + "Author": "Deepayan Sarkar [aut, cre] (), Felix Andrews [ctb], Kevin Wright [ctb] (documentation), Neil Klepeis [ctb], Johan Larsson [ctb] (miscellaneous improvements), Zhijian (Jason) Wen [cph] (filled contour code), Paul Murrell [ctb], Stefan Eng [ctb] (violin plot improvements), Achim Zeileis [ctb] (modern colors), Alexandre Courtiol [ctb] (generics for larrows, lpolygon, lrect and lsegments)", + "Maintainer": "Deepayan Sarkar ", + "Repository": "CRAN" + }, + "lazyeval": { + "Package": "lazyeval", + "Version": "0.2.2", + "Source": "Repository", + "Title": "Lazy (Non-Standard) Evaluation", + "Description": "An alternative approach to non-standard evaluation using formulas. Provides a full implementation of LISP style 'quasiquotation', making it easier to generate code with other code.", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", ,\"hadley@rstudio.com\", c(\"aut\", \"cre\")), person(\"RStudio\", role = \"cph\") )", + "License": "GPL-3", + "LazyData": "true", + "Depends": [ + "R (>= 3.1.0)" + ], + "Suggests": [ + "knitr", + "rmarkdown (>= 0.2.65)", + "testthat", + "covr" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "6.1.1", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], RStudio [cph]", + "Maintainer": "Hadley Wickham ", + "Repository": "RSPM", + "Encoding": "UTF-8" + }, + "leaflet": { + "Package": "leaflet", + "Version": "2.2.3", + "Source": "Repository", + "Type": "Package", + "Title": "Create Interactive Web Maps with the JavaScript 'Leaflet' Library", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Bhaskar\", \"Karambelkar\", role = \"aut\"), person(\"Yihui\", \"Xie\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Kenton\", \"Russell\", role = \"ctb\"), person(\"Kent\", \"Johnson\", role = \"ctb\"), person(\"Vladimir\", \"Agafonkin\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet library\"), person(\"CloudMade\", role = \"cph\", comment = \"Leaflet library\"), person(\"Leaflet contributors\", role = \"ctb\", comment = \"Leaflet library\"), person(\"Brandon Copeland\", role = c(\"ctb\", \"cph\"), comment = \"leaflet-measure plugin\"), person(\"Joerg Dietrich\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet.Terminator plugin\"), person(\"Benjamin Becquet\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet.MagnifyingGlass plugin\"), person(\"Norkart AS\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet.MiniMap plugin\"), person(\"L. Voogdt\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet.awesome-markers plugin\"), person(\"Daniel Montague\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet.EasyButton plugin\"), person(\"Kartena AB\", role = c(\"ctb\", \"cph\"), comment = \"Proj4Leaflet plugin\"), person(\"Robert Kajic\", role = c(\"ctb\", \"cph\"), comment = \"leaflet-locationfilter plugin\"), person(\"Mapbox\", role = c(\"ctb\", \"cph\"), comment = \"leaflet-omnivore plugin\"), person(\"Michael Bostock\", role = c(\"ctb\", \"cph\"), comment = \"topojson\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Create and customize interactive maps using the 'Leaflet' JavaScript library and the 'htmlwidgets' package. These maps can be used directly from the R console, from 'RStudio', in Shiny applications and R Markdown documents.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/leaflet/, https://github.com/rstudio/leaflet", + "BugReports": "https://github.com/rstudio/leaflet/issues", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ + "crosstalk", + "htmltools", + "htmlwidgets (>= 1.5.4)", + "jquerylib", + "leaflet.providers (>= 2.0.0)", + "magrittr", + "methods", + "png", + "raster (>= 3.6.3)", + "RColorBrewer", + "rlang", + "scales (>= 1.0.0)", + "sf (>= 0.9-6)", + "stats", + "viridisLite", + "xfun" + ], + "Suggests": [ + "knitr", + "maps", + "purrr", + "R6", + "RJSONIO", + "rmarkdown", + "s2", + "shiny (>= 1.0.0)", + "sp", + "terra", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "dplyr, ncdf4, rnaturalearth, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Joe Cheng [aut], Barret Schloerke [aut] (ORCID: ), Bhaskar Karambelkar [aut], Yihui Xie [aut], Garrick Aden-Buie [aut, cre] (ORCID: ), Hadley Wickham [ctb], Kenton Russell [ctb], Kent Johnson [ctb], Vladimir Agafonkin [ctb, cph] (Leaflet library), CloudMade [cph] (Leaflet library), Leaflet contributors [ctb] (Leaflet library), Brandon Copeland [ctb, cph] (leaflet-measure plugin), Joerg Dietrich [ctb, cph] (Leaflet.Terminator plugin), Benjamin Becquet [ctb, cph] (Leaflet.MagnifyingGlass plugin), Norkart AS [ctb, cph] (Leaflet.MiniMap plugin), L. Voogdt [ctb, cph] (Leaflet.awesome-markers plugin), Daniel Montague [ctb, cph] (Leaflet.EasyButton plugin), Kartena AB [ctb, cph] (Proj4Leaflet plugin), Robert Kajic [ctb, cph] (leaflet-locationfilter plugin), Mapbox [ctb, cph] (leaflet-omnivore plugin), Michael Bostock [ctb, cph] (topojson), Posit Software, PBC [cph, fnd]", + "Maintainer": "Garrick Aden-Buie ", + "Repository": "RSPM" + }, + "leaflet.providers": { + "Package": "leaflet.providers", + "Version": "2.0.0", + "Source": "Repository", + "Type": "Package", + "Title": "Leaflet Providers", + "Authors@R": "c( person(\"Leslie\", \"Huang\", , \"lesliehuang@nyu.edu\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = c(\"ctb\", \"cre\"), comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Leaflet Providers contributors\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet Providers plugin\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Contains third-party map tile provider information from 'Leaflet.js', , to be used with the 'leaflet' R package. Additionally, 'leaflet.providers' enables users to retrieve up-to-date provider information between package updates.", + "License": "BSD_2_clause + file LICENSE", + "URL": "https://rstudio.github.io/leaflet.providers/, https://github.com/rstudio/leaflet.providers", + "BugReports": "https://github.com/rstudio/leaflet.providers/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Imports": [ + "htmltools" + ], + "Suggests": [ + "jsonlite", + "testthat (>= 3.0.0)", + "V8" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.2.3", + "Collate": "'providers_data.R' 'get_current_providers.R' 'leaflet.providers-package.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "Leslie Huang [aut], Barret Schloerke [ctb, cre] (), Leaflet Providers contributors [ctb, cph] (Leaflet Providers plugin), Posit Software, PBC [cph, fnd]", + "Maintainer": "Barret Schloerke ", + "Repository": "RSPM" + }, "lifecycle": { "Package": "lifecycle", "Version": "1.0.4", @@ -2014,6 +2460,42 @@ "Maintainer": "Jeroen Ooms ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "otel": { + "Package": "otel", + "Version": "0.2.0", + "Source": "Repository", + "Title": "OpenTelemetry R API", + "Authors@R": "person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\"))", + "Description": "High-quality, ubiquitous, and portable telemetry to enable effective observability. OpenTelemetry is a collection of tools, APIs, and SDKs used to instrument, generate, collect, and export telemetry data (metrics, logs, and traces) for analysis in order to understand your software's performance and behavior. This package implements the OpenTelemetry API: . Use this package as a dependency if you want to instrument your R package for OpenTelemetry.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "Depends": [ + "R (>= 3.6.0)" + ], + "Suggests": [ + "callr", + "cli", + "glue", + "jsonlite", + "otelsdk", + "processx", + "shiny", + "spelling", + "testthat (>= 3.0.0)", + "utils", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "URL": "https://otel.r-lib.org, https://github.com/r-lib/otel", + "Additional_repositories": "https://github.com/r-lib/otelsdk/releases/download/devel", + "BugReports": "https://github.com/r-lib/otel/issues", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre]", + "Maintainer": "Gábor Csárdi ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, "pillar": { "Package": "pillar", "Version": "1.11.1", @@ -2232,6 +2714,79 @@ "Maintainer": "Gábor Csárdi ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "promises": { + "Package": "promises", + "Version": "1.5.0", + "Source": "Repository", + "Type": "Package", + "Title": "Abstractions for Promise-Based Asynchronous Programming", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides fundamental abstractions for doing asynchronous programming in R using promises. Asynchronous programming is useful for allowing a single R process to orchestrate multiple tasks in the background while also attending to something else. Semantics are similar to 'JavaScript' promises, but with a syntax that is idiomatic R.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/promises/, https://github.com/rstudio/promises", + "BugReports": "https://github.com/rstudio/promises/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "fastmap (>= 1.1.0)", + "later", + "lifecycle", + "magrittr (>= 1.5)", + "otel (>= 0.2.0)", + "R6", + "rlang" + ], + "Suggests": [ + "future (>= 1.21.0)", + "knitr", + "mirai", + "otelsdk (>= 0.2.0)", + "purrr", + "Rcpp", + "rmarkdown", + "spelling", + "testthat (>= 3.0.0)", + "vembedr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "rsconnect, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-05-27", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Joe Cheng [aut], Barret Schloerke [aut, cre] (ORCID: ), Winston Chang [aut] (ORCID: ), Charlie Gao [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Barret Schloerke ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "proxy": { + "Package": "proxy", + "Version": "0.4-29", + "Source": "Repository", + "Type": "Package", + "Title": "Distance and Similarity Measures", + "Authors@R": "c(person(given = \"David\", family = \"Meyer\", role = c(\"aut\", \"cre\"), email = \"David.Meyer@R-project.org\", comment = c(ORCID = \"0000-0002-5196-3048\")),\t person(given = \"Christian\", family = \"Buchta\", role = \"aut\"))", + "Description": "Provides an extensible framework for the efficient calculation of auto- and cross-proximities, along with implementations of the most popular ones.", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "stats", + "utils" + ], + "Suggests": [ + "cba" + ], + "Collate": "registry.R database.R dist.R similarities.R dissimilarities.R util.R seal.R", + "License": "GPL-2 | GPL-3", + "NeedsCompilation": "yes", + "Author": "David Meyer [aut, cre] (ORCID: ), Christian Buchta [aut]", + "Maintainer": "David Meyer ", + "Repository": "https://packagemanager.posit.co/cran/latest", + "Encoding": "UTF-8" + }, "purrr": { "Package": "purrr", "Version": "1.2.0", @@ -2310,6 +2865,49 @@ "Maintainer": "Hadley Wickham ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "raster": { + "Package": "raster", + "Version": "3.6-32", + "Source": "Repository", + "Type": "Package", + "Title": "Geographic Data Analysis and Modeling", + "Date": "2025-03-27", + "Imports": [ + "Rcpp", + "methods", + "terra (>= 1.8-5)" + ], + "LinkingTo": [ + "Rcpp" + ], + "Depends": [ + "sp (>= 1.4-5)", + "R (>= 3.5.0)" + ], + "Suggests": [ + "ncdf4", + "igraph", + "tcltk", + "parallel", + "rasterVis", + "MASS", + "sf", + "tinytest", + "gstat", + "fields", + "exactextractr" + ], + "Description": "Reading, writing, manipulating, analyzing and modeling of spatial data. This package has been superseded by the \"terra\" package .", + "License": "GPL (>= 3)", + "URL": "https://rspatial.org/raster", + "BugReports": "https://github.com/rspatial/raster/issues/", + "Authors@R": "c( person(\"Robert J.\", \"Hijmans\", role = c(\"cre\", \"aut\"), email = \"r.hijmans@gmail.com\", comment = c(ORCID = \"0000-0001-5872-2872\")), person(\"Jacob\", \"van Etten\", role = \"ctb\"), person(\"Michael\", \"Sumner\", role = \"ctb\"), person(\"Joe\", \"Cheng\", role = \"ctb\"), person(\"Dan\", \"Baston\", role = \"ctb\"), person(\"Andrew\", \"Bevan\", role = \"ctb\"), person(\"Roger\", \"Bivand\", role = \"ctb\"), person(\"Lorenzo\", \"Busetto\", role = \"ctb\"), person(\"Mort\", \"Canty\", role = \"ctb\"), person(\"Ben\", \"Fasoli\", role = \"ctb\"), person(\"David\", \"Forrest\", role = \"ctb\"), person(\"Aniruddha\", \"Ghosh\", role = \"ctb\"), person(\"Duncan\", \"Golicher\", role = \"ctb\"), person(\"Josh\", \"Gray\", role = \"ctb\"), person(\"Jonathan A.\", \"Greenberg\", role = \"ctb\"), person(\"Paul\", \"Hiemstra\", role = \"ctb\"), person(\"Kassel\", \"Hingee\", role = \"ctb\"), person(\"Alex\", \"Ilich\", role = \"ctb\"), person(\"Institute for Mathematics Applied Geosciences\", role=\"cph\"), person(\"Charles\", \"Karney\", role = \"ctb\"), person(\"Matteo\", \"Mattiuzzi\", role = \"ctb\"), person(\"Steven\", \"Mosher\", role = \"ctb\"), person(\"Babak\", \"Naimi\", role = \"ctb\"),\t person(\"Jakub\", \"Nowosad\", role = \"ctb\"), person(\"Edzer\", \"Pebesma\", role = \"ctb\"), person(\"Oscar\", \"Perpinan Lamigueiro\", role = \"ctb\"), person(\"Etienne B.\", \"Racine\", role = \"ctb\"), person(\"Barry\", \"Rowlingson\", role = \"ctb\"), person(\"Ashton\", \"Shortridge\", role = \"ctb\"), person(\"Bill\", \"Venables\", role = \"ctb\"), person(\"Rafael\", \"Wueest\", role = \"ctb\") )", + "NeedsCompilation": "yes", + "Author": "Robert J. Hijmans [cre, aut] (), Jacob van Etten [ctb], Michael Sumner [ctb], Joe Cheng [ctb], Dan Baston [ctb], Andrew Bevan [ctb], Roger Bivand [ctb], Lorenzo Busetto [ctb], Mort Canty [ctb], Ben Fasoli [ctb], David Forrest [ctb], Aniruddha Ghosh [ctb], Duncan Golicher [ctb], Josh Gray [ctb], Jonathan A. Greenberg [ctb], Paul Hiemstra [ctb], Kassel Hingee [ctb], Alex Ilich [ctb], Institute for Mathematics Applied Geosciences [cph], Charles Karney [ctb], Matteo Mattiuzzi [ctb], Steven Mosher [ctb], Babak Naimi [ctb], Jakub Nowosad [ctb], Edzer Pebesma [ctb], Oscar Perpinan Lamigueiro [ctb], Etienne B. Racine [ctb], Barry Rowlingson [ctb], Ashton Shortridge [ctb], Bill Venables [ctb], Rafael Wueest [ctb]", + "Maintainer": "Robert J. Hijmans ", + "Repository": "RSPM", + "Encoding": "UTF-8" + }, "readr": { "Package": "readr", "Version": "2.1.6", @@ -2527,6 +3125,42 @@ "Maintainer": "Yihui Xie ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "s2": { + "Package": "s2", + "Version": "1.1.9", + "Source": "Repository", + "Title": "Spherical Geometry Operators Using the S2 Geometry Library", + "Authors@R": "c( person(given = \"Dewey\", family = \"Dunnington\", role = c(\"aut\"), email = \"dewey@fishandwhistle.net\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(given = \"Edzer\", family = \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(\"Ege\", \"Rubak\", email=\"rubak@math.aau.dk\", role = c(\"aut\")), person(\"Jeroen\", \"Ooms\", , \"jeroen.ooms@stat.ucla.edu\", role = \"ctb\", comment = \"configure script\"), person(family = \"Google, Inc.\", role = \"cph\", comment = \"Original s2geometry.io source code\") )", + "Description": "Provides R bindings for Google's s2 library for geometric calculations on the sphere. High-performance constructors and exporters provide high compatibility with existing spatial packages, transformers construct new geometries from existing geometries, predicates provide a means to select geometries based on spatial relationships, and accessors extract information about geometries.", + "License": "Apache License (== 2.0)", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.2", + "SystemRequirements": "cmake, OpenSSL >= 1.0.1, Abseil >= 20230802.0", + "LinkingTo": [ + "Rcpp", + "wk" + ], + "Imports": [ + "Rcpp", + "wk (>= 0.6.0)" + ], + "Suggests": [ + "bit64", + "testthat (>= 3.0.0)", + "vctrs" + ], + "URL": "https://r-spatial.github.io/s2/, https://github.com/r-spatial/s2, http://s2geometry.io/", + "BugReports": "https://github.com/r-spatial/s2/issues", + "Depends": [ + "R (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Dewey Dunnington [aut] (ORCID: ), Edzer Pebesma [aut, cre] (ORCID: ), Ege Rubak [aut], Jeroen Ooms [ctb] (configure script), Google, Inc. [cph] (Original s2geometry.io source code)", + "Maintainer": "Edzer Pebesma ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, "sass": { "Package": "sass", "Version": "0.4.10", @@ -2607,6 +3241,158 @@ "Maintainer": "Thomas Lin Pedersen ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "sf": { + "Package": "sf", + "Version": "1.0-24", + "Source": "Repository", + "Title": "Simple Features for R", + "Authors@R": "c(person(given = \"Edzer\", family = \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(given = \"Roger\", family = \"Bivand\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2392-6140\")), person(given = \"Etienne\", family = \"Racine\", role = \"ctb\"), person(given = \"Michael\", family = \"Sumner\", role = \"ctb\"), person(given = \"Ian\", family = \"Cook\", role = \"ctb\"), person(given = \"Tim\", family = \"Keitt\", role = \"ctb\"), person(given = \"Robin\", family = \"Lovelace\", role = \"ctb\"), person(given = \"Hadley\", family = \"Wickham\", role = \"ctb\"), person(given = \"Jeroen\", family = \"Ooms\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(given = \"Kirill\", family = \"M\\u00fcller\", role = \"ctb\"), person(given = \"Thomas Lin\", family = \"Pedersen\", role = \"ctb\"), person(given = \"Dan\", family = \"Baston\", role = \"ctb\"), person(given = \"Dewey\", family = \"Dunnington\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9415-4582\")) )", + "Description": "Support for simple feature access, a standardized way to encode and analyze spatial vector data. Binds to 'GDAL' for reading and writing data, to 'GEOS' for geometrical operations, and to 'PROJ' for projection conversions and datum transformations. Uses by default the 's2' package for geometry operations on geodetic (long/lat degree) coordinates.", + "License": "GPL-2 | MIT + file LICENSE", + "URL": "https://r-spatial.github.io/sf/, https://github.com/r-spatial/sf", + "BugReports": "https://github.com/r-spatial/sf/issues", + "Depends": [ + "methods", + "R (>= 3.3.0)" + ], + "Imports": [ + "classInt (>= 0.4-1)", + "DBI (>= 0.8)", + "graphics", + "grDevices", + "grid", + "magrittr", + "s2 (>= 1.1.0)", + "stats", + "tools", + "units (>= 0.7-0)", + "utils" + ], + "Suggests": [ + "blob", + "nanoarrow", + "covr", + "dplyr (>= 1.0.0)", + "ggplot2", + "knitr", + "lwgeom (>= 0.2-14)", + "maps", + "mapview", + "Matrix", + "microbenchmark", + "odbc", + "pbapply", + "pillar", + "pool", + "raster", + "rlang", + "rmarkdown", + "RPostgres (>= 1.1.0)", + "RPostgreSQL", + "RSQLite", + "sp (>= 1.2-4)", + "spatstat (>= 2.0-1)", + "spatstat.geom", + "spatstat.random", + "spatstat.linnet", + "spatstat.utils", + "stars (>= 0.6-0)", + "terra", + "testthat (>= 3.0.0)", + "tibble (>= 1.4.1)", + "tidyr (>= 1.2.0)", + "tidyselect (>= 1.0.0)", + "tmap (>= 2.0)", + "vctrs", + "wk (>= 0.9.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Config/testthat/edition": "2", + "Config/needs/coverage": "XML", + "SystemRequirements": "GDAL (>= 2.0.1), GEOS (>= 3.4.0), PROJ (>= 4.8.0), sqlite3", + "Collate": "'RcppExports.R' 'init.R' 'import-standalone-s3-register.R' 'crs.R' 'bbox.R' 'read.R' 'db.R' 'sfc.R' 'sfg.R' 'sf.R' 'bind.R' 'wkb.R' 'wkt.R' 'plot.R' 'geom-measures.R' 'geom-predicates.R' 'geom-transformers.R' 'transform.R' 'proj.R' 'sp.R' 'grid.R' 'arith.R' 'tidyverse.R' 'tidyverse-vctrs.R' 'cast_sfg.R' 'cast_sfc.R' 'graticule.R' 'datasets.R' 'aggregate.R' 'agr.R' 'maps.R' 'join.R' 'sample.R' 'valid.R' 'collection_extract.R' 'jitter.R' 'sgbp.R' 'spatstat.R' 'stars.R' 'crop.R' 'gdal_utils.R' 'nearest.R' 'normalize.R' 'sf-package.R' 'defunct.R' 'z_range.R' 'm_range.R' 'shift_longitude.R' 'make_grid.R' 's2.R' 'terra.R' 'geos-overlayng.R' 'break_antimeridian.R'", + "NeedsCompilation": "yes", + "Author": "Edzer Pebesma [aut, cre] (ORCID: ), Roger Bivand [ctb] (ORCID: ), Etienne Racine [ctb], Michael Sumner [ctb], Ian Cook [ctb], Tim Keitt [ctb], Robin Lovelace [ctb], Hadley Wickham [ctb], Jeroen Ooms [ctb] (ORCID: ), Kirill Müller [ctb], Thomas Lin Pedersen [ctb], Dan Baston [ctb], Dewey Dunnington [ctb] (ORCID: )", + "Maintainer": "Edzer Pebesma ", + "Repository": "CRAN" + }, + "shiny": { + "Package": "shiny", + "Version": "1.12.1", + "Source": "Repository", + "Type": "Package", + "Title": "Web Application Framework for R", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Garrick\", \"Aden-Buie\", , \"garrick@adenbuie.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Alan\", \"Dipert\", role = \"aut\"), person(\"Barbara\", \"Borges\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(, \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(, \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Prem Nawaz\", \"Khan\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Victor\", \"Tsaran\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Dennis\", \"Lembree\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Srinivasu\", \"Chakravarthula\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Cathy\", \"O'Connor\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(, \"PayPal, Inc\", role = \"cph\", comment = \"Bootstrap accessibility plugin\"), person(\"Stefan\", \"Petre\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Andrew\", \"Rowls\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js library\"), person(\"Salmen\", \"Bejaoui\", role = c(\"ctb\", \"cph\"), comment = \"selectize-plugin-a11y library\"), person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"), comment = \"ion.rangeSlider library\"), person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"), comment = \"Javascript strftime library\"), person(, \"SpryMedia Limited\", role = c(\"ctb\", \"cph\"), comment = \"DataTables library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"R Core Team\", role = c(\"ctb\", \"cph\"), comment = \"tar implementation from R\") )", + "Description": "Makes it incredibly easy to build interactive web applications with R. Automatic \"reactive\" binding between inputs and outputs and extensive prebuilt widgets make it possible to build beautiful, responsive, and powerful applications with minimal effort.", + "License": "GPL-3 | file LICENSE", + "URL": "https://shiny.posit.co/, https://github.com/rstudio/shiny", + "BugReports": "https://github.com/rstudio/shiny/issues", + "Depends": [ + "methods", + "R (>= 3.0.2)" + ], + "Imports": [ + "bslib (>= 0.6.0)", + "cachem (>= 1.1.0)", + "cli", + "commonmark (>= 2.0.0)", + "fastmap (>= 1.1.1)", + "fontawesome (>= 0.4.0)", + "glue (>= 1.3.2)", + "grDevices", + "htmltools (>= 0.5.4)", + "httpuv (>= 1.5.2)", + "jsonlite (>= 0.9.16)", + "later (>= 1.0.0)", + "lifecycle (>= 0.2.0)", + "mime (>= 0.3)", + "otel", + "promises (>= 1.5.0)", + "R6 (>= 2.0)", + "rlang (>= 0.4.10)", + "sourcetools", + "tools", + "utils", + "withr", + "xtable" + ], + "Suggests": [ + "Cairo (>= 1.5-5)", + "coro (>= 1.1.0)", + "datasets", + "DT", + "dygraphs", + "future", + "ggplot2", + "knitr (>= 1.6)", + "magrittr", + "markdown", + "mirai", + "otelsdk (>= 0.2.0)", + "ragg", + "reactlog (>= 1.0.0)", + "rmarkdown", + "sass", + "showtext", + "testthat (>= 3.2.1)", + "watcher", + "yaml" + ], + "Config/Needs/check": "shinytest2", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Collate": "'globals.R' 'app-state.R' 'app_template.R' 'bind-cache.R' 'bind-event.R' 'bookmark-state-local.R' 'bookmark-state.R' 'bootstrap-deprecated.R' 'bootstrap-layout.R' 'conditions.R' 'map.R' 'utils.R' 'bootstrap.R' 'busy-indicators-spinners.R' 'busy-indicators.R' 'cache-utils.R' 'deprecated.R' 'devmode.R' 'diagnose.R' 'extended-task.R' 'fileupload.R' 'graph.R' 'reactives.R' 'reactive-domains.R' 'history.R' 'hooks.R' 'html-deps.R' 'image-interact-opts.R' 'image-interact.R' 'imageutils.R' 'input-action.R' 'input-checkbox.R' 'input-checkboxgroup.R' 'input-date.R' 'input-daterange.R' 'input-file.R' 'input-numeric.R' 'input-password.R' 'input-radiobuttons.R' 'input-select.R' 'input-slider.R' 'input-submit.R' 'input-text.R' 'input-textarea.R' 'input-utils.R' 'insert-tab.R' 'insert-ui.R' 'jqueryui.R' 'knitr.R' 'middleware-shiny.R' 'middleware.R' 'timer.R' 'shiny.R' 'mock-session.R' 'modal.R' 'modules.R' 'notifications.R' 'otel-attr-srcref.R' 'otel-collect.R' 'otel-enable.R' 'otel-error.R' 'otel-label.R' 'otel-reactive-update.R' 'otel-session.R' 'otel-shiny.R' 'otel-with.R' 'priorityqueue.R' 'progress.R' 'react.R' 'reexports.R' 'render-cached-plot.R' 'render-plot.R' 'render-table.R' 'run-url.R' 'runapp.R' 'serializers.R' 'server-input-handlers.R' 'server-resource-paths.R' 'server.R' 'shiny-options.R' 'shiny-package.R' 'shinyapp.R' 'shinyui.R' 'shinywrappers.R' 'showcase.R' 'snapshot.R' 'staticimports.R' 'tar.R' 'test-export.R' 'test-server.R' 'test.R' 'update-input.R' 'utils-lang.R' 'utils-tags.R' 'version_bs_date_picker.R' 'version_ion_range_slider.R' 'version_jquery.R' 'version_jqueryui.R' 'version_selectize.R' 'version_strftime.R' 'viewer.R'", + "NeedsCompilation": "no", + "Author": "Winston Chang [aut] (ORCID: ), Joe Cheng [aut], JJ Allaire [aut], Carson Sievert [aut, cre] (ORCID: ), Barret Schloerke [aut] (ORCID: ), Garrick Aden-Buie [aut] (ORCID: ), Yihui Xie [aut], Jeff Allen [aut], Jonathan McPherson [aut], Alan Dipert [aut], Barbara Borges [aut], Posit Software, PBC [cph, fnd] (ROR: ), jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt), jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Prem Nawaz Khan [ctb] (Bootstrap accessibility plugin), Victor Tsaran [ctb] (Bootstrap accessibility plugin), Dennis Lembree [ctb] (Bootstrap accessibility plugin), Srinivasu Chakravarthula [ctb] (Bootstrap accessibility plugin), Cathy O'Connor [ctb] (Bootstrap accessibility plugin), PayPal, Inc [cph] (Bootstrap accessibility plugin), Stefan Petre [ctb, cph] (Bootstrap-datepicker library), Andrew Rowls [ctb, cph] (Bootstrap-datepicker library), Brian Reavis [ctb, cph] (selectize.js library), Salmen Bejaoui [ctb, cph] (selectize-plugin-a11y library), Denis Ineshin [ctb, cph] (ion.rangeSlider library), Sami Samhuri [ctb, cph] (Javascript strftime library), SpryMedia Limited [ctb, cph] (DataTables library), Ivan Sagalaev [ctb, cph] (highlight.js library), R Core Team [ctb, cph] (tar implementation from R)", + "Maintainer": "Carson Sievert ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, "signal": { "Package": "signal", "Version": "1.8-1", @@ -2638,6 +3424,70 @@ "Maintainer": "Uwe Ligges ", "Repository": "CRAN" }, + "sourcetools": { + "Package": "sourcetools", + "Version": "0.1.7-1", + "Source": "Repository", + "Type": "Package", + "Title": "Tools for Reading, Tokenizing and Parsing R Code", + "Author": "Kevin Ushey", + "Maintainer": "Kevin Ushey ", + "Description": "Tools for the reading and tokenization of R code. The 'sourcetools' package provides both an R and C++ interface for the tokenization of R code, and helpers for interacting with the tokenized representation of R code.", + "License": "MIT + file LICENSE", + "Depends": [ + "R (>= 3.0.2)" + ], + "Suggests": [ + "testthat" + ], + "RoxygenNote": "5.0.1", + "BugReports": "https://github.com/kevinushey/sourcetools/issues", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "sp": { + "Package": "sp", + "Version": "2.2-0", + "Source": "Repository", + "Title": "Classes and Methods for Spatial Data", + "Authors@R": "c(person(\"Edzer\", \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\"), person(\"Roger\", \"Bivand\", role = \"aut\", email = \"Roger.Bivand@nhh.no\"), person(\"Barry\", \"Rowlingson\", role = \"ctb\"), person(\"Virgilio\", \"Gomez-Rubio\", role = \"ctb\"), person(\"Robert\", \"Hijmans\", role = \"ctb\"), person(\"Michael\", \"Sumner\", role = \"ctb\"), person(\"Don\", \"MacQueen\", role = \"ctb\"), person(\"Jim\", \"Lemon\", role = \"ctb\"), person(\"Finn\", \"Lindgren\", role = \"ctb\"), person(\"Josh\", \"O'Brien\", role = \"ctb\"), person(\"Joseph\", \"O'Rourke\", role = \"ctb\"), person(\"Patrick\", \"Hausmann\", role = \"ctb\"))", + "Depends": [ + "R (>= 3.5.0)", + "methods" + ], + "Imports": [ + "utils", + "stats", + "graphics", + "grDevices", + "lattice", + "grid" + ], + "Suggests": [ + "RColorBrewer", + "gstat", + "deldir", + "knitr", + "maps", + "mapview", + "rmarkdown", + "sf", + "terra", + "raster" + ], + "Description": "Classes and methods for spatial data; the classes document where the spatial location information resides, for 2D or 3D data. Utility functions are provided, e.g. for plotting data as maps, spatial selection, as well as methods for retrieving coordinates, for subsetting, print, summary, etc. From this version, 'rgdal', 'maptools', and 'rgeos' are no longer used at all, see for details.", + "License": "GPL (>= 2)", + "URL": "https://github.com/edzer/sp/ https://edzer.github.io/sp/", + "BugReports": "https://github.com/edzer/sp/issues", + "Collate": "bpy.colors.R AAA.R Class-CRS.R CRS-methods.R Class-Spatial.R Spatial-methods.R projected.R Class-SpatialPoints.R SpatialPoints-methods.R Class-SpatialPointsDataFrame.R SpatialPointsDataFrame-methods.R Class-SpatialMultiPoints.R SpatialMultiPoints-methods.R Class-SpatialMultiPointsDataFrame.R SpatialMultiPointsDataFrame-methods.R Class-GridTopology.R Class-SpatialGrid.R Class-SpatialGridDataFrame.R Class-SpatialLines.R SpatialLines-methods.R Class-SpatialLinesDataFrame.R SpatialLinesDataFrame-methods.R Class-SpatialPolygons.R Class-SpatialPolygonsDataFrame.R SpatialPolygons-methods.R SpatialPolygonsDataFrame-methods.R GridTopology-methods.R SpatialGrid-methods.R SpatialGridDataFrame-methods.R SpatialPolygons-internals.R point.in.polygon.R SpatialPolygons-displayMethods.R zerodist.R image.R stack.R bubble.R mapasp.R select.spatial.R gridded.R asciigrid.R spplot.R over.R spsample.R recenter.R dms.R gridlines.R spdists.R rbind.R flipSGDF.R chfids.R loadmeuse.R compassRose.R surfaceArea.R spOptions.R subset.R disaggregate.R sp_spat1.R merge.R aggregate.R elide.R sp2Mondrian.R", + "VignetteBuilder": "knitr", + "NeedsCompilation": "yes", + "Author": "Edzer Pebesma [aut, cre], Roger Bivand [aut], Barry Rowlingson [ctb], Virgilio Gomez-Rubio [ctb], Robert Hijmans [ctb], Michael Sumner [ctb], Don MacQueen [ctb], Jim Lemon [ctb], Finn Lindgren [ctb], Josh O'Brien [ctb], Joseph O'Rourke [ctb], Patrick Hausmann [ctb]", + "Maintainer": "Edzer Pebesma ", + "Repository": "https://packagemanager.posit.co/cran/latest", + "Encoding": "UTF-8" + }, "ssh": { "Package": "ssh", "Version": "0.9.4", @@ -2798,6 +3648,47 @@ "Maintainer": "Jeroen Ooms ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "terra": { + "Package": "terra", + "Version": "1.8-93", + "Source": "Repository", + "Type": "Package", + "Title": "Spatial Data Analysis", + "Date": "2026-01-11", + "Depends": [ + "R (>= 3.5.0)", + "methods" + ], + "Suggests": [ + "parallel", + "tinytest", + "ncdf4", + "sf (>= 0.9-8)", + "deldir", + "XML", + "leaflet (>= 2.2.1)", + "htmlwidgets" + ], + "LinkingTo": [ + "Rcpp" + ], + "Imports": [ + "Rcpp (>= 1.0-10)" + ], + "SystemRequirements": "C++17, GDAL (>= 2.2.3), GEOS (>= 3.4.0), PROJ (>= 4.9.3), TBB, sqlite3", + "Encoding": "UTF-8", + "Language": "en-US", + "Maintainer": "Robert J. Hijmans ", + "Description": "Methods for spatial data analysis with vector (points, lines, polygons) and raster (grid) data. Methods for vector data include geometric operations such as intersect and buffer. Raster methods include local, focal, global, zonal and geometric operations. The predict and interpolate methods facilitate the use of regression type (interpolation, machine learning) models for spatial prediction, including with satellite remote sensing data. Processing of very large files is supported. See the manual and tutorials on to get started.", + "License": "GPL (>= 3)", + "URL": "https://rspatial.org/, https://rspatial.github.io/terra/", + "BugReports": "https://github.com/rspatial/terra/issues", + "LazyLoad": "yes", + "Authors@R": "c( person(\"Robert J.\", \"Hijmans\", role=c(\"cre\", \"aut\"), email=\"r.hijmans@gmail.com\", comment=c(ORCID=\"0000-0001-5872-2872\")),\t\t\t person(\"Márcia\", \"Barbosa\", role=\"ctb\", comment=c(ORCID=\"0000-0001-8972-7713\")), person(\"Roger\", \"Bivand\", role=\"ctb\", comment=c(ORCID=\"0000-0003-2392-6140\")), person(\"Andrew\", \"Brown\", role=\"ctb\", comment=c(ORCID=\"0000-0002-4565-533X\")), person(\"Michael\", \"Chirico\", role=\"ctb\", comment=c(ORCID=\"0000-0003-0787-087X\")), person(\"Emanuele\", \"Cordano\", role=\"ctb\",comment=c(ORCID=\"0000-0002-3508-5898\")), person(\"Krzysztof\", \"Dyba\", role=\"ctb\", comment=c(ORCID=\"0000-0002-8614-3816\")), person(\"Edzer\", \"Pebesma\", role=\"ctb\", comment=c(ORCID=\"0000-0001-8049-7069\")), person(\"Barry\", \"Rowlingson\", role=\"ctb\", comment=c(ORCID=\"0000-0002-8586-6625\")), person(\"Michael D.\", \"Sumner\", role=\"ctb\", comment=c(ORCID=\"0000-0002-2471-7511\")))", + "NeedsCompilation": "yes", + "Author": "Robert J. Hijmans [cre, aut] (ORCID: ), Márcia Barbosa [ctb] (ORCID: ), Roger Bivand [ctb] (ORCID: ), Andrew Brown [ctb] (ORCID: ), Michael Chirico [ctb] (ORCID: ), Emanuele Cordano [ctb] (ORCID: ), Krzysztof Dyba [ctb] (ORCID: ), Edzer Pebesma [ctb] (ORCID: ), Barry Rowlingson [ctb] (ORCID: ), Michael D. Sumner [ctb] (ORCID: )", + "Repository": "CRAN" + }, "tibble": { "Package": "tibble", "Version": "3.3.0", @@ -3081,6 +3972,50 @@ "Maintainer": "Davis Vaughan ", "Repository": "RSPM" }, + "units": { + "Package": "units", + "Version": "1.0-0", + "Source": "Repository", + "Title": "Measurement Units for R Vectors", + "Authors@R": "c(person(\"Edzer\", \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(\"Thomas\", \"Mailund\", role = \"aut\", email = \"mailund@birc.au.dk\"), person(\"Tomasz\", \"Kalinowski\", role = \"aut\"), person(\"James\", \"Hiebert\", role = \"ctb\"), person(\"Iñaki\", \"Ucar\", role = \"aut\", email = \"iucar@fedoraproject.org\", comment = c(ORCID = \"0000-0001-6403-5550\")), person(\"Thomas Lin\", \"Pedersen\", role = \"ctb\") )", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "Rcpp" + ], + "LinkingTo": [ + "Rcpp (>= 0.12.10)" + ], + "Suggests": [ + "NISTunits", + "measurements", + "xml2", + "magrittr", + "pillar (>= 1.3.0)", + "dplyr (>= 1.0.0)", + "vctrs (>= 0.3.1)", + "ggplot2 (> 3.2.1)", + "testthat (>= 3.0.0)", + "vdiffr", + "knitr", + "rvest", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "Description": "Support for measurement units in R vectors, matrices and arrays: automatic propagation, conversion, derivation and simplification of units; raising errors in case of unit incompatibility. Compatible with the POSIXct, Date and difftime classes. Uses the UNIDATA udunits library and unit database for unit compatibility checking and conversion. Documentation about 'units' is provided in the paper by Pebesma, Mailund & Hiebert (2016, ), included in this package as a vignette; see 'citation(\"units\")' for details.", + "SystemRequirements": "udunits-2", + "License": "GPL-2", + "URL": "https://r-quantities.github.io/units/, https://github.com/r-quantities/units", + "BugReports": "https://github.com/r-quantities/units/issues", + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Edzer Pebesma [aut, cre] (ORCID: ), Thomas Mailund [aut], Tomasz Kalinowski [aut], James Hiebert [ctb], Iñaki Ucar [aut] (ORCID: ), Thomas Lin Pedersen [ctb]", + "Maintainer": "Edzer Pebesma ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, "utf8": { "Package": "utf8", "Version": "1.2.6", @@ -3296,6 +4231,35 @@ "Maintainer": "Lionel Henry ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "wk": { + "Package": "wk", + "Version": "0.9.5", + "Source": "Repository", + "Title": "Lightweight Well-Known Geometry Parsing", + "Authors@R": "c( person(given = \"Dewey\", family = \"Dunnington\", role = c(\"aut\", \"cre\"), email = \"dewey@fishandwhistle.net\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(given = \"Edzer\", family = \"Pebesma\", role = c(\"aut\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(given = \"Anthony\", family = \"North\", email = \"anthony.jl.north@gmail.com\", role = c(\"ctb\")) )", + "Maintainer": "Dewey Dunnington ", + "Description": "Provides a minimal R and C++ API for parsing well-known binary and well-known text representation of geometries to and from R-native formats. Well-known binary is compact and fast to parse; well-known text is human-readable and is useful for writing tests. These formats are useful in R only if the information they contain can be accessed in R, for which high-performance functions are provided here.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Suggests": [ + "testthat (>= 3.0.0)", + "vctrs (>= 0.3.0)", + "sf", + "tibble", + "readr" + ], + "URL": "https://paleolimbot.github.io/wk/, https://github.com/paleolimbot/wk", + "BugReports": "https://github.com/paleolimbot/wk/issues", + "Config/testthat/edition": "3", + "Depends": [ + "R (>= 2.10)" + ], + "LazyData": "true", + "NeedsCompilation": "yes", + "Author": "Dewey Dunnington [aut, cre] (ORCID: ), Edzer Pebesma [aut] (ORCID: ), Anthony North [ctb]", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, "xfun": { "Package": "xfun", "Version": "0.55", @@ -3385,6 +4349,36 @@ "Maintainer": "Jeroen Ooms ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "xtable": { + "Package": "xtable", + "Version": "1.8-4", + "Source": "Repository", + "Date": "2019-04-08", + "Title": "Export Tables to LaTeX or HTML", + "Authors@R": "c(person(\"David B.\", \"Dahl\", role=\"aut\"), person(\"David\", \"Scott\", role=c(\"aut\",\"cre\"), email=\"d.scott@auckland.ac.nz\"), person(\"Charles\", \"Roosen\", role=\"aut\"), person(\"Arni\", \"Magnusson\", role=\"aut\"), person(\"Jonathan\", \"Swinton\", role=\"aut\"), person(\"Ajay\", \"Shah\", role=\"ctb\"), person(\"Arne\", \"Henningsen\", role=\"ctb\"), person(\"Benno\", \"Puetz\", role=\"ctb\"), person(\"Bernhard\", \"Pfaff\", role=\"ctb\"), person(\"Claudio\", \"Agostinelli\", role=\"ctb\"), person(\"Claudius\", \"Loehnert\", role=\"ctb\"), person(\"David\", \"Mitchell\", role=\"ctb\"), person(\"David\", \"Whiting\", role=\"ctb\"), person(\"Fernando da\", \"Rosa\", role=\"ctb\"), person(\"Guido\", \"Gay\", role=\"ctb\"), person(\"Guido\", \"Schulz\", role=\"ctb\"), person(\"Ian\", \"Fellows\", role=\"ctb\"), person(\"Jeff\", \"Laake\", role=\"ctb\"), person(\"John\", \"Walker\", role=\"ctb\"), person(\"Jun\", \"Yan\", role=\"ctb\"), person(\"Liviu\", \"Andronic\", role=\"ctb\"), person(\"Markus\", \"Loecher\", role=\"ctb\"), person(\"Martin\", \"Gubri\", role=\"ctb\"), person(\"Matthieu\", \"Stigler\", role=\"ctb\"), person(\"Robert\", \"Castelo\", role=\"ctb\"), person(\"Seth\", \"Falcon\", role=\"ctb\"), person(\"Stefan\", \"Edwards\", role=\"ctb\"), person(\"Sven\", \"Garbade\", role=\"ctb\"), person(\"Uwe\", \"Ligges\", role=\"ctb\"))", + "Maintainer": "David Scott ", + "Imports": [ + "stats", + "utils" + ], + "Suggests": [ + "knitr", + "plm", + "zoo", + "survival" + ], + "VignetteBuilder": "knitr", + "Description": "Coerce data to LaTeX and HTML tables.", + "URL": "http://xtable.r-forge.r-project.org/", + "Depends": [ + "R (>= 2.10.0)" + ], + "License": "GPL (>= 2)", + "Repository": "https://packagemanager.posit.co/cran/latest", + "NeedsCompilation": "no", + "Author": "David B. Dahl [aut], David Scott [aut, cre], Charles Roosen [aut], Arni Magnusson [aut], Jonathan Swinton [aut], Ajay Shah [ctb], Arne Henningsen [ctb], Benno Puetz [ctb], Bernhard Pfaff [ctb], Claudio Agostinelli [ctb], Claudius Loehnert [ctb], David Mitchell [ctb], David Whiting [ctb], Fernando da Rosa [ctb], Guido Gay [ctb], Guido Schulz [ctb], Ian Fellows [ctb], Jeff Laake [ctb], John Walker [ctb], Jun Yan [ctb], Liviu Andronic [ctb], Markus Loecher [ctb], Martin Gubri [ctb], Matthieu Stigler [ctb], Robert Castelo [ctb], Seth Falcon [ctb], Stefan Edwards [ctb], Sven Garbade [ctb], Uwe Ligges [ctb]", + "Encoding": "UTF-8" + }, "yaml": { "Package": "yaml", "Version": "2.3.12", diff --git a/src/app.Rmd b/src/app.Rmd new file mode 100644 index 0000000..6df794a --- /dev/null +++ b/src/app.Rmd @@ -0,0 +1,301 @@ +```{r backend, include=FALSE} +# Load all functions from main.Rmd +knitr::purl("./main.Rmd", output = tempfile(), quiet = TRUE) |> source() +``` + +# Web Interface +```{r shiny} +# Flight Trajectory Analysis - Shiny GUI Application +# This app allows interactive selection of flights and displays trajectory analysis +# All core functions are loaded from main.Rmd + +# UI Definition +ui <- fluidPage( + titlePanel("Flight Trajectory Analysis - GUI"), + + sidebarLayout( + sidebarPanel( + width = 3, + + h4("OpenSky Credentials"), + textInput("client_id", "Client ID:", value = Sys.getenv('OPENSKY_CLIENT_ID')), + passwordInput("client_secret", "Client Secret:", value = Sys.getenv('OPENSKY_CLIENT_SECRET')), + + hr(), + + h4("Airport Selection"), + textInput("airport_code", "Airport ICAO Code:", value = "EDDF"), + sliderInput("hours_back", "Hours back from now:", min = 1, max = 12, value = 1), + + actionButton("load_departures", "Load Departures", class = "btn-primary"), + + hr(), + + h4("Flight Selection"), + selectInput("selected_flight", "Select Flight:", choices = NULL), + + actionButton("analyze_flight", "Analyze Selected Flight", class = "btn-success"), + + hr(), + + h4("Batch Analysis"), + numericInput("batch_size", "Days of flights to analyze:", value = 5, min = 1, max = 30), + actionButton("batch_analyze", "Run Batch Analysis", class = "btn-warning"), + + hr(), + + verbatimTextOutput("status_text") + ), + + mainPanel( + width = 9, + + tabsetPanel( + id = "main_tabs", + + tabPanel("Departures List", + h4("Available Departures"), + tableOutput("departures_table") + ), + + tabPanel("Single Flight Analysis", + fluidRow( + column(6, leafletOutput("route_plot", height = "400px")), + column(6, plotOutput("altitude_plot", height = "400px")) + ), + fluidRow( + column(6, plotOutput("trajectory_plot", height = "400px")), + column(6, + h4("Trajectory Characteristics"), + tableOutput("characteristics_table")) + ) + ), + + tabPanel("Statistical Analysis", + h4("Multiple Trajectory Statistics"), + tableOutput("stats_summary_table"), + hr(), + fluidRow( + column(12, plotOutput("boxplots", height = "500px")) + ), + fluidRow( + column(12, plotOutput("density_plots", height = "500px")) + ), + fluidRow( + column(12, plotOutput("histograms", height = "500px")) + ) + ), + + tabPanel("Interpretation", + h4("Analysis Interpretation"), + verbatimTextOutput("interpretation_text") + ) + ) + ) + ) +) + +# Server Logic +server <- function(input, output, session) { + + # Reactive values to store data + rv <- reactiveValues( + creds = NULL, + departures = NULL, + departures_df = NULL, + current_route = NULL, + current_trj = NULL, + current_icao = NULL, + trajectory_stats_df = NULL + ) + + # Status message + status <- reactiveVal("Ready. Enter credentials and load departures.") + + output$status_text <- renderText({ + status() + }) + + # Load departures + observeEvent(input$load_departures, { + req(input$client_id, input$client_secret, input$airport_code) + + status("Loading departures...") + + tryCatch({ + # Use getCredentials from main.Rmd + rv$creds <- getCredentials( + client_id = input$client_id, + client_secret = input$client_secret + ) + + time_now <- Sys.time() + rv$departures <- getAirportDepartures( + airport = input$airport_code, + startTime = time_now - hours(input$hours_back), + endTime = time_now, + credentials = rv$creds + ) + + if (length(rv$departures) > 0) { + # Create departures dataframe for display + departures_list <- lapply(seq_along(rv$departures), function(i) { + dep <- rv$departures[[i]] + data.frame( + Index = i, + ICAO24 = dep[["ICAO24"]] %||% NA, + #FIXME Callsign, Origin, Destination + Callsign = dep[["callsign"]] %||% NA, + Origin = dep[["estDepartureAirport"]] %||% NA, + Destination = dep[["estArrivalAirport"]] %||% NA, + DepartureTime = as.POSIXct(dep[["departure_time"]] %||% NA, origin = "1970-01-01"), + stringsAsFactors = FALSE + ) + }) + rv$departures_df <- do.call(rbind, departures_list) + + # Update flight selection dropdown + choices <- setNames( + seq_along(rv$departures), + paste(rv$departures_df$ICAO24, "-", rv$departures_df$Callsign, + "(", rv$departures_df$Destination, ")") + ) + updateSelectInput(session, "selected_flight", choices = choices) + + status(paste("Loaded", length(rv$departures), "departures from", input$airport_code)) + } else { + status("No departures found for the selected time period.") + } + + }, error = function(e) { + status(paste("Error loading departures:", e$message)) + }) + }) + + # Display departures table + output$departures_table <- renderTable({ + req(rv$departures_df) + rv$departures_df + }) + + # Analyze selected flight + observeEvent(input$analyze_flight, { + req(rv$departures, input$selected_flight, rv$creds) + + status("Analyzing selected flight...") + + tryCatch({ + idx <- as.integer(input$selected_flight) + dep <- rv$departures[[idx]] + icao24 <- dep[["ICAO24"]] + dep_time <- dep[["departure_time"]] + + rv$current_icao <- icao24 + + # Use getAircraftTrack from main.Rmd + route_df <- getAircraftTrack(icao24, dep_time, rv$creds) + + if (is.null(route_df) || nrow(route_df) < 2) { + status(paste("No path data available for", icao24)) + return() + } + + rv$current_route <- route_df + + # Use getTrajFromRoute from main.Rmd + rv$current_trj <- getTrajFromRoute(route_df) + status(paste("Successfully analyzed", icao24, "with", nrow(route_df), "points")) + + # Switch to analysis tab + updateTabsetPanel(session, "main_tabs", selected = "Single Flight Analysis") + + }, error = function(e) { + status(paste("Error analyzing flight:", e$message)) + }) + }) + + # Route plot + output$route_plot <- renderLeaflet({ + req(rv$current_route) + createInteractiveMap(rv$current_route) + }) + + # Altitude plot + output$altitude_plot <- renderPlot({ + req(rv$current_route) + plot(rv$current_route$time, rv$current_route$alt, type = "l", col = "red", lwd = 2, + main = paste("Altitude Profile of", rv$current_icao), + xlab = "Time (Unix)", ylab = "Altitude (m)") + }) + + # Trajectory plot + output$trajectory_plot <- renderPlot({ + req(rv$current_trj) + plot(rv$current_trj, main = paste("Trajectory of", rv$current_icao)) + }) + + # Characteristics table + output$characteristics_table <- renderTable({ + req(rv$current_trj) + calculateTrajectoryStats(rv$current_trj, format = "table") + }) + + # Batch analysis + observeEvent(input$batch_analyze, { + req(rv$departures, rv$creds) + + status("Running batch analysis...") + + tryCatch({ + + withProgress(message = 'Analyzing flights', value = 0, { + all_trajectories <- getAircraftTrajectories(rv$current_icao, time = Sys.time(), creds, days = input$batch_size) + }) + + if (length(all_trajectories) > 0) { + rv$trajectory_stats_df <- do.call(rbind, all_trajectories) + status(paste("Batch analysis complete:", nrow(rv$trajectory_stats_df), "trajectories analyzed")) + updateTabsetPanel(session, "main_tabs", selected = "Statistical Analysis") + } else { + status("No trajectory data collected in batch analysis") + } + + }, error = function(e) { + status(paste("Error in batch analysis:", e$message)) + }) + }) + + # Statistics summary table - use calculateStatsSummary from main.Rmd + output$stats_summary_table <- renderTable({ + req(rv$trajectory_stats_df) + calculateStatsSummary(rv$trajectory_stats_df) + }) + + # Boxplots - use createBoxplots from main.Rmd + output$boxplots <- renderPlot({ + req(rv$trajectory_stats_df) + createBoxplots(rv$trajectory_stats_df) + }) + + # Density plots - use createDensityPlots from main.Rmd + output$density_plots <- renderPlot({ + req(rv$trajectory_stats_df) + createDensityPlots(rv$trajectory_stats_df) + }) + + # Histograms - use createHistograms from main.Rmd + output$histograms <- renderPlot({ + req(rv$trajectory_stats_df) + createHistograms(rv$trajectory_stats_df) + }) + + # Interpretation text - use generateInterpretation from main.Rmd + output$interpretation_text <- renderText({ + req(rv$trajectory_stats_df) + generateInterpretation(rv$trajectory_stats_df) + }) +} + +# Run the application +shinyApp(ui = ui, server = server) +``` diff --git a/src/main.Rmd b/src/main.Rmd index 5b68f02..2ba747b 100644 --- a/src/main.Rmd +++ b/src/main.Rmd @@ -1,16 +1,21 @@ --- -title: "Topic 8" +title: "Topic 8 - Flight Trajectory Analysis" output: - pdf_document: default html_document: default + pdf_document: default date: "`r Sys.Date()`" --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) +# include `eval=isArtifact()` to check if pdf/html is being produced +isArtifact <- function(){ + isOutput <-knitr::is_html_output() || knitr::is_latex_output() + return(isOutput) +} ``` -```{r preamble, message=FALSE} +```{r preamble, message=FALSE, include=FALSE} # Load Libraries library(dplyr) library(lubridate) @@ -21,74 +26,645 @@ library(dotenv) library(httr) library(jsonlite) library(trajr) +library(shiny) +library(leaflet) ``` -# Download flights -```{r opensky} +```{r opensky, include=FALSE} +# Openskies API Functions time_now <- Sys.time() creds <- getCredentials( client_id = Sys.getenv('OPENSKY_CLIENT_ID'), client_secret = Sys.getenv('OPENSKY_CLIENT_SECRET')) -# get departures from Frankfurt airport -departures <- getAirportDepartures(airport = "EDDF", startTime = time_now - hours(1), endTime = time_now, credentials = creds ) - +# Get flights for a specific aircraft from OpenSky API getFlights <- function(icao, time, creds){ flights <-getAircraftFlights(icao, startTime = time - days(1), endTime = time, credentials = creds ) return(flights) } -icao <- departures[[1]][["ICAO24"]] -flights <- getFlights(icao,Sys.time(), creds) -# TODO map from all available flights to tracks -query <- list(icao24= icao, time=as.numeric(flights[[1]][["departure_time"]])) -# can get tracks for up to 30 days in the past -response <-makeAuthenticatedRequest('tracks/all',query, creds) -track_data <- fromJSON(content(response, as = "text", encoding = "UTF-8")) -if (!is.null(track_data$path) && length(track_data$path) > 0) { - +# Get aircraft track from OpenSky API +getAircraftTrack <- function(icao, time, creds) { + query <- list(icao24 = icao, time = as.numeric(time)) + response <- makeAuthenticatedRequest('tracks/all', query, creds) + track_data <- fromJSON(content(response, as = "text", encoding = "UTF-8")) + if (!is.null(track_data$path) && length(track_data$path) > 0) { route_df <- as.data.frame(track_data$path) colnames(route_df) <- c("time", "lat", "lon", "alt", "heading", "on_ground") - - message("Loading of route successfull! Points: ", nrow(route_df)) - - plot(route_df$lon, route_df$lat, type="o", pch=20, col="blue", - main=paste("Geographic route of", icao), - xlab="Longitude", ylab="Latitude") - - plot(route_df$time, route_df$alt, type="l", col="red", lwd=2, - main=paste("Altitude profile of", icao), - xlab="Time (Unix)", ylab="Height (Meter)") - - } else { - print("No path points from api") + return(route_df) } + return(NULL) +} + + ``` -# GUI selection -```{r gui} -icaos <- lapply(departures, function(x) x[["ICAO24"]]) -options <- unlist(icaos) # tcltk needs a character vector +```{r trajectory-functions, include=FALSE} +# Trajectory Conversion Functions -# Create a GUI list selection -listSelect <- function(options){ - selected_option <- NULL - tryCatch({ - selected_option <- select.list( - title = "Select an aircraft", - choices = options, - preselect = NULL, - multiple = FALSE, - graphics = TRUE - ) - }, error = function(w) { - message('No GUI available') - } +# Convert route to distance in meters +getRouteDistance <- function(route_df) { + lat_ref <- route_df$lat[1] + lon_ref <- route_df$lon[1] + meters_per_deg_lat <- 111320 + meters_per_deg_lon <- 111320 * cos(lat_ref * pi / 180) + x_meters <- (route_df$lon - lon_ref) * meters_per_deg_lon + y_meters <- (route_df$lat - lat_ref) * meters_per_deg_lat + return(list('x' = x_meters, 'y' = y_meters)) +} + +# Get time in seconds from start +getRouteTime <- function(route_df) { + return(route_df$time - route_df$time[1]) +} + +# Create trajr object from route +getTrajFromRoute <- function(route_df) { + meters <- getRouteDistance(route_df) + time <- getRouteTime(route_df) + trj <- TrajFromCoords( + data.frame(x = meters$x, y = meters$y, time = time), + xCol = "x", yCol = "y", timeCol = "time" ) - if (nzchar(selected_option)){ - return(selected_option) + return(trj) +} + +# Calculate trajectory characteristics +# Input: either route_df (data.frame with lat/lon) or trj (trajr object) +# format: "row" for batch analysis (one row per flight), "table" for single flight display +calculateTrajectoryStats <- function(input, icao = NULL, format = "row") { + # Determine if input is route_df or trj + if (inherits(input, "Trajectory")) { + trj <- input + } else { + trj <- getTrajFromRoute(input) } - return(options[1]) + + # Calculate all metrics + duration <- TrajDuration(trj) + path_length <- TrajLength(trj) + diffusion_distance <- TrajDistance(trj) + straightness <- TrajStraightness(trj) + mean_velocity <- path_length / duration + + fractal_dim <- tryCatch({ + min_step <- path_length / 100 + max_step <- path_length / 2 + if (min_step > 0 && max_step > min_step) { + step_sizes <- exp(seq(log(min_step), log(max_step), length.out = 10)) + TrajFractalDimension(trj, stepSizes = step_sizes) + } else { + NA + } + }, error = function(e) NA) + + # Return format based on use case + if (format == "table") { + # For single flight display (Parameter | Value) + return(data.frame( + Parameter = c( + "Duration (s)", "Duration (min)", + "Path Length (km)", + "Diffusion Distance (m)", + "Diffusion Distance (km)", + "Straightness Index", + "Mean Velocity (km/h)", + "Fractal Dimension" + ), + Value = c( + round(duration, 2), + round(duration / 60, 2), + round(path_length / 1000, 2), + round(diffusion_distance, 2), + round(diffusion_distance / 1000, 2), + round(straightness, 4), + round(mean_velocity * 3.6, 2), + round(fractal_dim, 4) + ) + )) + } else { + # For batch analysis (one row per flight) + return(data.frame( + icao24 = icao, + diffusion_distance_km = diffusion_distance / 1000, + path_length_km = path_length / 1000, + straightness = straightness, + duration_min = duration / 60, + mean_velocity_kmh = mean_velocity * 3.6, + fractal_dimension = fractal_dim + )) + } +} + +# Calculate trajectory parameters for a single flight +calculate_trajectory_params <- function(icao, departure_time, creds) { + tryCatch({ + route_df <- getAircraftTrack(icao, departure_time, creds) + + if (is.null(route_df) || nrow(route_df) < 3) return(NULL) + + return(calculateTrajectoryStats(route_df, icao = icao, format = "row")) + + }, error = function(e) { + message("Error processing ", icao, ": ", e$message) + return(NULL) + }) +} + +getAircraftTrajectories <- function(icao, time, creds, days = 5){ + tracks <- list() + for (i in 0: (days-1)) { + flights <- getFlights(icao,time - days(i),creds) + for (f in flights){ + track <- calculate_trajectory_params(icao, f[["departure_time"]], creds) + if (!is.null(track)){ + tracks[[length(tracks)+1]] <- track + } + Sys.sleep(0.5) # API courtesy + } + } + return(tracks) } ``` + +```{r stat-functions, include=FALSE} +# Statistical Helper Functions + +# Get parameter names and labels for trajectory statistics +getTrajectoryParams <- function() { + list( + params = c("diffusion_distance_km", "straightness", "duration_min", + "mean_velocity_kmh", "fractal_dimension"), + labels = c("Diffusion Distance (km)", "Straightness", "Duration (min)", + "Mean Velocity (km/h)", "Fractal Dimension") + ) +} + +# Calculate statistics summary table +calculateStatsSummary <- function(trajectory_stats_df) { + p <- getTrajectoryParams() + + stats_list <- lapply(seq_along(p$params), function(i) { + x <- trajectory_stats_df[[p$params[i]]] + x <- x[!is.na(x)] + if (length(x) < 2) return(NULL) + + data.frame( + Parameter = p$labels[i], + N = length(x), + Mean = round(mean(x), 4), + Variance = round(var(x), 4), + Std_Dev = round(sd(x), 4), + Q1 = round(quantile(x, 0.25), 4), + Median = round(median(x), 4), + Q3 = round(quantile(x, 0.75), 4) + ) + }) + + do.call(rbind, stats_list[!sapply(stats_list, is.null)]) +} +``` + +```{r viz-functions, include=FALSE} +# Visualization Functions + +# Create interactive map with leaflet +createInteractiveMap <- function(route) { + leaflet(route) %>% + addTiles() %>% + addPolylines(lng=~lon, lat=~lat, color="blue", weight=3, opacity=0.8) %>% + addCircleMarkers( + lng = ~lon[1], + lat = ~lat[1], + color = "green", + radius = 6, + popup = "Origin" + ) %>% + addCircleMarkers( + lng = ~lon[nrow(route)], + lat = ~lat[nrow(route)], + color = "red", + radius = 6, + popup = "Destination" + ) +} + +# Create boxplots for trajectory statistics +createBoxplots <- function(trajectory_stats_df) { + p <- getTrajectoryParams() + + par(mfrow = c(2, 3)) + for (i in seq_along(p$params)) { + data <- trajectory_stats_df[[p$params[i]]][!is.na(trajectory_stats_df[[p$params[i]]])] + if (length(data) >= 2) { + boxplot(data, main = p$labels[i], ylab = p$labels[i], col = "lightblue", border = "darkblue") + points(1, mean(data), pch = 18, col = "red", cex = 1.5) + } + } + par(mfrow = c(1, 1)) +} + +# Create density plots for trajectory statistics +createDensityPlots <- function(trajectory_stats_df) { + p <- getTrajectoryParams() + + par(mfrow = c(2, 3)) + for (i in seq_along(p$params)) { + data <- trajectory_stats_df[[p$params[i]]][!is.na(trajectory_stats_df[[p$params[i]]])] + if (length(data) >= 3) { + dens <- density(data) + plot(dens, main = paste("Density:", p$labels[i]), xlab = p$labels[i], col = "darkblue", lwd = 2) + polygon(dens, col = rgb(0, 0, 1, 0.3), border = "darkblue") + abline(v = mean(data), col = "red", lwd = 2, lty = 2) + abline(v = median(data), col = "green", lwd = 2, lty = 3) + } + } + par(mfrow = c(1, 1)) +} + +# Create histograms for trajectory statistics +createHistograms <- function(trajectory_stats_df) { + p <- getTrajectoryParams() + + par(mfrow = c(2, 3)) + for (i in seq_along(p$params)) { + data <- trajectory_stats_df[[p$params[i]]][!is.na(trajectory_stats_df[[p$params[i]]])] + if (length(data) >= 3) { + hist(data, probability = TRUE, main = paste("Histogram:", p$labels[i]), + xlab = p$labels[i], col = "lightgray", border = "darkgray") + lines(density(data), col = "red", lwd = 2) + } + } + par(mfrow = c(1, 1)) +} + +# Generate interpretation text for trajectory statistics +generateInterpretation <- function(trajectory_stats_df) { + df <- trajectory_stats_df + + text <- "========== INTERPRETATION OF TRAJECTORY PARAMETERS ==========\n\n" + + dd <- df$diffusion_distance_km[!is.na(df$diffusion_distance_km)] + if (length(dd) >= 2) { + text <- paste0(text, "1. DIFFUSION DISTANCE (Net Displacement):\n") + text <- paste0(text, " - Mean: ", round(mean(dd), 2), " km\n") + text <- paste0(text, " - Represents straight-line distance from origin to destination.\n") + text <- paste0(text, " - Variance: ", round(var(dd), 2), " (indicates diversity in flight distances)\n\n") + } + + st <- df$straightness[!is.na(df$straightness)] + if (length(st) >= 2) { + text <- paste0(text, "2. STRAIGHTNESS INDEX:\n") + text <- paste0(text, " - Mean: ", round(mean(st), 4), " (range 0-1, where 1 = perfectly straight)\n") + text <- paste0(text, " - Values close to 1 indicate efficient, direct flight paths.\n") + text <- paste0(text, " - Lower values suggest deviations due to weather, airspace, or routing.\n\n") + } + + dur <- df$duration_min[!is.na(df$duration_min)] + if (length(dur) >= 2) { + text <- paste0(text, "3. DURATION OF TRAVEL:\n") + text <- paste0(text, " - Mean: ", round(mean(dur), 2), " minutes\n") + text <- paste0(text, " - Range: ", round(min(dur), 2), " - ", round(max(dur), 2), " minutes\n") + text <- paste0(text, " - IQR: ", round(IQR(dur), 2), " minutes (middle 50% of flights)\n\n") + } + + vel <- df$mean_velocity_kmh[!is.na(df$mean_velocity_kmh)] + if (length(vel) >= 2) { + text <- paste0(text, "4. MEAN TRAVEL VELOCITY:\n") + text <- paste0(text, " - Mean: ", round(mean(vel), 2), " km/h\n") + text <- paste0(text, " - Typical commercial aircraft cruise: 800-900 km/h\n") + text <- paste0(text, " - Lower values may include taxi, takeoff, and landing phases.\n\n") + } + + fd <- df$fractal_dimension[!is.na(df$fractal_dimension)] + if (length(fd) >= 2) { + text <- paste0(text, "5. FRACTAL DIMENSION:\n") + text <- paste0(text, " - Mean: ", round(mean(fd), 4), "\n") + text <- paste0(text, " - Value of 1.0 = perfectly straight line\n") + text <- paste0(text, " - Values closer to 2.0 = more complex, space-filling paths\n") + text <- paste0(text, " - Aircraft typically show low fractal dimension (efficient paths).\n\n") + } + + text <- paste0(text, "========== END OF ANALYSIS ==========") + text +} +``` + + +# Abstract + +This project implements an R-based application for the retrieval, processing, and statistical analysis of aircraft trajectories. Flight data is obtained from the OpenSky Network API, transformed into analyzable trajectory objects using the `trajr` package, and subsequently characterized using established movement ecology metrics. The methodology enables quantitative comparison of flight paths through parameters such as path length, straightness index, and fractal dimension. + +# Introduction + +## Background + +The analysis of movement trajectories constitutes a fundamental aspect of spatial data science, with applications ranging from animal behavior studies to transportation network optimization. In the context of aviation, trajectory analysis provides insights into flight efficiency, airspace utilization, and routing patterns. + +## Objectives + +The primary objectives of this project are: + +1. **Data Acquisition**: Implement robust methods for retrieving real-time flight trajectory data from the OpenSky Network +2. **Trajectory Characterization**: Apply established metrics from movement ecology to quantify flight path properties +3. **Statistical Analysis**: Perform comparative analysis across multiple flights to identify patterns and distributions + +## Theoretical Framework + +The `trajr` package, originally developed for animal movement analysis, provides a comprehensive toolkit for trajectory characterization. Key metrics employed in this analysis include: + +- **Path Length**: Total distance traveled along the trajectory +- **Diffusion Distance**: Euclidean displacement from origin to destination +- **Straightness Index**: Ratio of diffusion distance to path length (range 0-1) +- **Fractal Dimension**: Measure of path complexity (1 = straight line, approaching 2 = space-filling curve) + +# Methodology + +## Data Source + +Flight trajectory data is obtained from the OpenSky Network, a community-based receiver network providing open access to air traffic surveillance data. The API provides: + +- Aircraft state vectors (position, velocity, heading) +- Historical flight tracks +- Airport departure and arrival information + +## Data Processing Pipeline + +The analysis workflow consists of the following stages: + +1. **Authentication**: Establish connection to OpenSky API using credentials +2. **Query Execution**: Retrieve departure information for specified airport and time window +3. **Track Retrieval**: Obtain detailed waypoint data for individual flights +4. **Coordinate Transformation**: Convert geographic coordinates to metric distances +5. **Trajectory Construction**: Create `trajr` trajectory objects for analysis +6. **Statistical Computation**: Calculate trajectory metrics and aggregate statistics + +# Implementation + +The following section will demonstrate the implementation of the methodology using R code snippets. +The full analysis is also available in the GUI-based Shiny application. + +## Step 1: API Authentication + +The `getCredentials()` function retrieves API credentials from environment variables, ensuring secure credential management. + +```{r, purl=FALSE} +creds <- getCredentials( + client_id = Sys.getenv("OPENSKY_CLIENT_ID"), + client_secret = Sys.getenv("OPENSKY_CLIENT_SECRET") +) +``` + +## Step 2: Data Acquisition + +Recent departures from Frankfurt Airport (ICAO: EDDF) are queried for a two-hour time window. This airport was selected due to its high traffic volume, ensuring sufficient data availability. + +```{r demo-departures, purl=FALSE} +time_now <- Sys.time() +departures <- getAirportDepartures( + airport = "EDDF", + startTime = time_now - hours(2), + endTime = time_now - hours(1), + credentials = creds +) +cat("Departures retrieved:", length(departures), "\n") +``` + +## Step 3: Track Data Retrieval + +The `getAircraftTrack()` function retrieves detailed waypoint data for individual aircraft. The function iterates through available departures until valid track data is obtained. + +```{r demo-track, purl=FALSE} +route_df <- NULL +icao <- "N/A" + +if (length(departures) > 0) { + for (i in seq_along(departures)) { + icao <- departures[[i]][["ICAO24"]] + dep_time <- departures[[i]][["departure_time"]] + route_df <- getAircraftTrack(icao, dep_time, creds) + if (!is.null(route_df) && nrow(route_df) >= 3) { + cat("Aircraft ICAO24:", icao, "\n") + cat("Track points acquired:", nrow(route_df), "\n") + break + } + Sys.sleep(1) + } +} + +if (is.null(route_df)) { + cat("No valid track data available\n") +} +``` + +## Step 4: Spatial Visualization + +The geographic trajectory is visualized on an interactive map with leaflet using the `createInteractiveMap()` function. Green and red markers indicate departure and current/final position, respectively. + +```{r demo-route-plot, fig.width=7, fig.height=5, purl=FALSE} +if (!is.null(route_df)) { + createInteractiveMap(route_df) +} else { + cat("Insufficient data for visualization\n") +} +``` + +## Step 5: Vertical Profile Analysis + +The altitude profile reveals distinct flight phases: climb, cruise, and descent. This temporal representation provides insight into vertical movement patterns. + +```{r demo-altitude-plot, fig.width=7, fig.height=4, purl=FALSE} +if (!is.null(route_df)) { + time_minutes <- (route_df$time - route_df$time[1]) / 60 + plot(time_minutes, route_df$alt, type = "l", col = "red", lwd = 2, + main = paste("Altitude Profile -", icao), + xlab = "Elapsed Time (min)", ylab = "Barometric Altitude (m)") + grid() +} else { + cat("Insufficient data for altitude analysis\n") +} +``` + +## Step 6: Trajectory Object Construction + +The `getTrajFromRoute()` function transforms geographic coordinates into a metric coordinate system and constructs a `trajr` trajectory object. This transformation is necessary for accurate distance calculations. + +```{r demo-trajectory-plot, fig.width=7, fig.height=5, purl=FALSE} +if (!is.null(route_df)) { + trj <- getTrajFromRoute(route_df) + plot(trj, main = paste("Metric Trajectory -", icao)) + cat("Trajectory object created with", nrow(trj), "waypoints\n") +} else { + cat("Insufficient data for trajectory construction\n") +} +``` + +## Step 7: Single Flight Characterization + +The `calculateTrajectoryStats()` function computes comprehensive trajectory metrics. The table format provides a clear overview of individual flight characteristics. + +```{r demo-stats-table, purl=FALSE} +if (!is.null(route_df)) { + stats_table <- calculateTrajectoryStats(route_df, icao = icao, format = "table") + knitr::kable(stats_table, caption = paste("Trajectory Metrics for Aircraft", icao)) +} else { + cat("Insufficient data for statistical analysis\n") +} +``` + +## Step 8: Multi-Flight Data Collection + +To enable statistical inference, trajectory data is collected for multiple flights. The algorithm attempts to retrieve valid track data for up to five departures in this example. + +```{r demo-multiple-tracks, purl=FALSE} +flight_data <- list() +successful_flights <- 0 + +if (length(departures) > 0) { + max_attempts <- min(10, length(departures)) + + for (i in seq_len(max_attempts)) { + icao_temp <- departures[[i]][["ICAO24"]] + dep_time_temp <- departures[[i]][["departure_time"]] + + route_df_temp <- getAircraftTrack(icao_temp, dep_time_temp, creds) + + if (!is.null(route_df_temp) && nrow(route_df_temp) >= 3) { + stats <- calculateTrajectoryStats(route_df_temp, icao = icao_temp, format = "row") + if (!is.null(stats)) { + flight_data[[length(flight_data) + 1]] <- stats + successful_flights <- successful_flights + 1 + cat("Flight", successful_flights, "| ICAO:", icao_temp, + "| Waypoints:", nrow(route_df_temp), "\n") + } + } + + if (successful_flights >= 5) break + } + + if (length(flight_data) > 0) { + all_flights_stats <- do.call(rbind, flight_data) + cat("\nSample size (n):", nrow(all_flights_stats), "flights\n") + } else { + all_flights_stats <- NULL + cat("No valid trajectories obtained\n") + } +} else { + all_flights_stats <- NULL + cat("No departure data available\n") +} +``` + +# Results + +## Individual Flight Metrics + +The following table presents computed metrics for all successfully analyzed flights. + +```{r demo-all-stats-table, purl=FALSE} +if (!is.null(all_flights_stats)) { + display_stats <- all_flights_stats + display_stats$diffusion_distance_km <- round(display_stats$diffusion_distance_km, 2) + display_stats$path_length_km <- round(display_stats$path_length_km, 2) + display_stats$straightness <- round(display_stats$straightness, 4) + display_stats$duration_min <- round(display_stats$duration_min, 1) + display_stats$mean_velocity_kmh <- round(display_stats$mean_velocity_kmh, 1) + display_stats$fractal_dimension <- round(display_stats$fractal_dimension, 4) + + knitr::kable(display_stats, caption = "Computed Trajectory Metrics", + col.names = c("ICAO24", "Displacement (km)", "Path Length (km)", + "Straightness", "Duration (min)", "Velocity (km/h)", "Fractal Dim.")) +} else { + cat("No data available for tabulation\n") +} +``` + +## Descriptive Statistics + +The `calculateStatsSummary()` function computes central tendency and dispersion measures for each trajectory parameter. + +```{r demo-summary-stats, purl=FALSE} +if (!is.null(all_flights_stats) && nrow(all_flights_stats) >= 2) { + summary_stats <- calculateStatsSummary(all_flights_stats) + knitr::kable(summary_stats, caption = "Descriptive Statistics Summary") +} else { + cat("Minimum sample size (n >= 2) not met\n") +} +``` + +## Distribution Analysis: Boxplots + +Boxplots provide a robust visualization of parameter distributions, displaying median, interquartile range, and potential outliers. The red diamond indicates the arithmetic mean. + +```{r demo-boxplots, fig.width=10, fig.height=8, purl=FALSE} +if (!is.null(all_flights_stats) && nrow(all_flights_stats) >= 2) { + createBoxplots(all_flights_stats) +} else { + cat("Minimum sample size (n >= 2) not met\n") +} +``` + +## Distribution Analysis: Kernel Density Estimation + +Density plots employ kernel density estimation to approximate the probability distribution of each parameter. Vertical lines indicate mean (red, dashed) and median (green, dotted). + +```{r demo-density, fig.width=10, fig.height=8, purl=FALSE} +if (!is.null(all_flights_stats) && nrow(all_flights_stats) >= 3) { + createDensityPlots(all_flights_stats) +} else { + cat("Minimum sample size (n >= 3) not met for density estimation\n") +} +``` + +## Distribution Analysis: Histograms + +Histograms with overlaid density curves provide an alternative visualization of parameter distributions. + +```{r demo-histograms, fig.width=10, fig.height=8, purl=FALSE} +if (!is.null(all_flights_stats) && nrow(all_flights_stats) >= 3) { + createHistograms(all_flights_stats) +} else { + cat("Minimum sample size (n >= 3) not met for histogram analysis\n") +} +``` + +## Parameter Interpretation + +The `generateInterpretation()` function provides contextual analysis of the computed trajectory metrics. + +```{r demo-interpretation, purl=FALSE} +if (!is.null(all_flights_stats) && nrow(all_flights_stats) >= 2) { + interpretation <- generateInterpretation(all_flights_stats) + cat(interpretation) +} else { + cat("Minimum sample size (n >= 2) not met for interpretation\n") +} +``` + +# Discussion + +## Key Findings + +The trajectory analysis reveals several characteristics typical of commercial aviation: + +1. **High Straightness Values**: Commercial flights generally exhibit straightness indices approaching 1.0, indicating efficient direct routing between waypoints. + +2. **Low Fractal Dimension**: Values close to 1.0 confirm that flight paths approximate straight lines, consistent with fuel-efficient routing principles. + +3. **Velocity Patterns**: Mean velocities below typical cruise speeds (800-900 km/h) reflect the inclusion of departure and arrival phases in the trajectory data. + +## Limitations + +- **Temporal Resolution**: Track data granularity varies based on ADS-B receiver coverage +- **Sample Size**: Statistical inference is limited by the number of available flights with complete track data + +# Conclusion + +This project demonstrates the successful application of movement ecology metrics to aviation trajectory analysis. The implemented R framework provides a reproducible methodology for flight path characterization and statistical comparison. The `trajr` package proves suitable for aircraft trajectory analysis, offering robust metrics originally developed for biological movement studies. + +# References + +- OpenSky Network: https://opensky-network.org/ +- McLean, D.J. & Skowron Volponi, M.A. (2018). trajr: An R package for characterisation of animal trajectories. Ethology, 124(6), 440-448: https://CRAN.R-project.org/package=trajr +