Skip to content

Instantly share code, notes, and snippets.

@espinielli
Last active January 21, 2020 08:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save espinielli/b1ccc1bf11c6e354f0d7986ffbe0dcb7 to your computer and use it in GitHub Desktop.
Save espinielli/b1ccc1bf11c6e354f0d7986ffbe0dcb7 to your computer and use it in GitHub Desktop.
R: ggplot2 map of some European airports
.Rproj.user
.Rhistory
.RData
.Ruserdata
icao ir390_date
LSZH 25-11-2014 18:46
LSGG 16-12-2014 15:17
EGBB 20-01-2015 14:53
EGCC 26-01-2015 10:21
GCLP 28-01-2015 10:03
GCTS 28-01-2015 10:45
LEMD 28-01-2015 11:25
LEBB 28-01-2015 12:37
LEBL 28-01-2015 13:05
LEIB 28-01-2015 13:34
LEMG 28-01-2015 14:03
GCFV 02-02-2015 11:12
GCXO 12-02-2015 12:06
LIME 18-02-2015 14:28
EIDW 18-02-2015 15:21
EGLL 18-02-2015 15:59
EKCH 19-02-2015 12:18
LEAL 24-02-2015 16:02
LIPZ 02-03-2015 09:50
EGKK 08-03-2015 15:11
LOWW 19-03-2015 10:51
LFPG 19-03-2015 13:36
LEVC 31-03-2015 10:49
EPWA 31-03-2015 12:49
EDDP 31-03-2015 13:39
LBSF 31-03-2015 15:39
LJLJ 01-04-2015 13:51
LIRF 15-04-2015 10:33
EDDL 24-04-2015 14:01
EDDF 06-05-2015 15:06
GCRR 08-05-2015 18:42
EGSS 21-05-2015 10:51
EDDK 26-06-2015 09:19
EDDW 27-08-2015 12:41
EGGD 27-08-2015 18:06
LFPO 01-09-2015 15:49
LGAV 01-09-2015 16:38
LHBP 02-09-2015 10:57
LICC 16-10-2015 18:59
EBCI 21-10-2015 13:59
EETN 04-11-2015 17:52
LIMC 18-11-2015 14:41
EDDN 01-12-2015 10:11
EDDE 02-12-2015 16:27
EVRA 08-12-2015 09:37
EDDV 14-12-2015 10:32
EBBR 16-12-2015 11:09
EDDM 17-12-2015 10:20
ESSA 11-01-2016 09:13
LFSB 18-01-2016 12:25
LIPE 19-01-2016 20:09
EICK 27-01-2016 11:21
EDDH 12-02-2016 13:28
LIML 23-02-2016 16:33
EDDR 09-03-2016 13:35
EGGW 07-06-2016 12:37
EFHK 17-06-2016 06:21
ENGM 19-07-2016 02:45
LPPR 22-12-2016 10:38
EDDG 22-12-2016 10:58
ELLX 09-01-2017 18:43
LIRN 11-01-2017 19:42
LEPA 11-01-2017 21:32
EDDB 11-01-2017 22:41
EDDT 11-01-2017 22:52
LKPR 12-01-2017 00:10
EGPH 12-01-2017 03:41
ESGG 12-01-2017 04:49
LFLL 12-01-2017 14:13
LPPT 13-01-2017 02:05
EDDS 20-02-2017 08:55
LEZL 05-04-2017 13:04
LMML 05-04-2017 13:44
EHAM 29-08-2017 11:02
LIMF 09-11-2017 17:33
EGNT 21-01-2018 01:45
LDZA 15-02-2018 11:34
EGPD 20-02-2018 16:21
EGPF 20-02-2018 22:41
LIRA 18-05-2018 21:34
LROP 29-08-2018 11:33
LZIB 28-09-2018 12:54
EDDC 03-04-2019 21:09
LPFR 03-04-2019 23:14
EGLC 25-04-2019 13:29
LFML 07-06-2019 12:09
LFBO 26-06-2019 12:35
LFMN 06-09-2019 16:08
EYVI 22-09-2019 06:08
LCLK NA
apt_icao longitude latitude is_eapn is_imped
EBBR 4.48444444444444 50.901388888888874 TRUE TRUE
EBCI 4.45277777777778 50.46 FALSE TRUE
EDDE 10.95805555555555 50.979722222222215 FALSE TRUE
EDDH 9.98833333333333 53.63027777777777 TRUE TRUE
EDDK 7.14277777777778 50.86583333333333 FALSE TRUE
EDDP 12.23638888888888 51.423888888888875 FALSE TRUE
EDDR 7.10944444444444 49.21444444444444 FALSE TRUE
EDDS 9.22194444444444 48.69 TRUE TRUE
EDDV 9.683611111111109 52.46027777777777 FALSE TRUE
EFHK 24.963333333333328 60.31722222222221 FALSE TRUE
EGBB -1.74805555555556 52.453888888888876 FALSE TRUE
EGGW -0.3683333333333333 51.87472222222222 TRUE TRUE
EGLC 0.0552777777777778 51.50527777777777 FALSE TRUE
EGLL -0.4613888888888888 51.4775 TRUE TRUE
EGNT -1.68972222222222 55.03805555555555 FALSE TRUE
EGPD -2.1980555555555603 57.2025 FALSE TRUE
EHAM 4.764166666666669 52.30805555555555 TRUE TRUE
EICK -8.49111111111111 51.84138888888887 FALSE TRUE
EIDW -6.2700000000000005 53.42138888888888 TRUE TRUE
EPWA 20.96722222222222 52.16583333333333 FALSE TRUE
ESGG 12.291111111111109 57.660000000000004 TRUE TRUE
ESSA 17.918611111111108 59.65194444444444 TRUE TRUE
GCFV -13.86388888888888 28.45277777777777 FALSE TRUE
GCRR -13.605277777777768 28.945555555555547 FALSE TRUE
GCXO -16.34166666666666 28.48277777777777 FALSE TRUE
LBSF 23.408333333333328 42.695 FALSE TRUE
LDZA 16.06888888888888 45.74305555555555 FALSE TRUE
LEIB 1.37305555555556 38.87277777777777 FALSE TRUE
LEMG -4.499166666666669 36.675000000000004 FALSE TRUE
LEPA 2.73888888888889 39.551666666666655 TRUE TRUE
LFPG 2.5477777777777804 49.009722222222216 TRUE TRUE
LFPO 2.37944444444444 48.72333333333333 TRUE TRUE
LGAV 23.944444444444436 37.93666666666665 TRUE TRUE
LHBP 19.26194444444444 47.43944444444443 TRUE TRUE
LICC 15.06388888888888 37.466666666666654 FALSE TRUE
LIMC 8.723055555555561 45.63 TRUE TRUE
LIMF 7.64944444444444 45.2025 TRUE TRUE
LIRF 12.23888888888888 41.80027777777777 TRUE TRUE
LJLJ 14.45611111111111 46.22444444444444 FALSE TRUE
LKPR 14.26 50.10083333333333 TRUE TRUE
LMML 14.477500000000001 35.8575 FALSE TRUE
LOWW 16.569722222222218 48.11027777777777 TRUE TRUE
LPPR -8.67805555555556 41.23555555555555 FALSE TRUE
LSGG 6.10944444444444 46.23833333333333 TRUE TRUE
LSZH 8.54805555555556 47.458055555555546 TRUE TRUE
LZIB 17.21277777777777 48.17 FALSE TRUE
LFLL 5.08111111111111 45.72555555555555 TRUE TRUE
LIPZ 12.35194444444444 45.50527777777777 FALSE TRUE
EDDL 6.75722222222222 51.280833333333334 TRUE TRUE
EDDT 13.28777777777777 52.55972222222222 TRUE TRUE
EKCH 12.656111111111109 55.61805555555555 TRUE TRUE
LEBL 2.0783333333333296 41.296944444444435 TRUE TRUE
LEMD -3.5608333333333295 40.472222222222214 TRUE TRUE
LFML 5.215 43.43666666666665 TRUE TRUE
LFSB 7.5291666666666694 47.59 TRUE TRUE
LIRN 14.29083333333333 40.88444444444443 TRUE TRUE
EGCC -2.275 53.353888888888875 TRUE TRUE
LIRA 12.597222222222218 41.79944444444444 TRUE TRUE
EDDB 13.500555555555549 52.362222222222215 TRUE TRUE
EVRA 23.97111111111111 56.92361111111111 FALSE TRUE
EGGD -2.7191666666666703 51.38277777777777 FALSE TRUE
EGSS 0.23500000000000001 51.885000000000005 TRUE TRUE
EDDF 8.57055555555556 50.03333333333333 TRUE TRUE
GCTS -16.5725 28.044444444444437 FALSE TRUE
LIPE 11.29694444444444 44.530833333333334 TRUE TRUE
LROP 26.085 44.57111111111111 FALSE TRUE
ENGM 11.08388888888888 60.20277777777777 TRUE TRUE
EGPF -4.433055555555559 55.87194444444444 FALSE TRUE
LPFR -7.96583333333333 37.014444444444436 TRUE TRUE
EDDN 11.078055555555549 49.49861111111111 FALSE TRUE
GCLP -15.38666666666666 27.931944444444436 FALSE TRUE
LEBB -2.9105555555555602 43.30111111111111 FALSE TRUE
LEZL -5.898888888888889 37.41805555555555 FALSE TRUE
ELLX 6.20444444444444 49.62333333333333 FALSE TRUE
LCLK 33.63027777777777 34.87888888888887 FALSE FALSE
LIME 9.70027777777778 45.66888888888887 FALSE TRUE
EDDC 13.768055555555549 51.13444444444443 FALSE TRUE
EDDM 11.78611111111111 48.353888888888875 TRUE TRUE
EETN 24.8325 59.41333333333333 FALSE TRUE
EYVI 25.28777777777777 54.63694444444444 FALSE TRUE
LPPT -9.13416666666667 38.77416666666666 TRUE TRUE
EGPH -3.3725 55.95 TRUE TRUE
EDDW 8.78666666666667 53.0475 FALSE TRUE
LEAL -0.5580555555555555 38.28222222222222 FALSE TRUE
EGKK -0.1902777777777777 51.14805555555555 TRUE TRUE
LEVC -0.48166666666666663 39.48944444444444 FALSE TRUE
LFMN 7.215000000000001 43.66527777777777 TRUE TRUE
LIML 9.27833333333333 45.44944444444444 TRUE TRUE
EDDG 7.68472222222222 52.134722222222216 FALSE TRUE
LFBO 1.36777777777778 43.635000000000005 FALSE TRUE
#
# export to CSV the list of APDF airports
#
library(ROracle)
library(dplyr)
library(readr)
export_apdf_airports <- function(on_date = Sys.Date()) {
on_date <- format(on_date)
usr <- Sys.getenv("PRU_DEV_USR")
pwd <- Sys.getenv("PRU_DEV_PWD")
dbn <- Sys.getenv("PRU_DEV_DBNAME")
withr::local_envvar(c("TZ" = "UTC",
"ORA_SDTZ" = "UTC"))
con <- withr::local_db_connection(
ROracle::dbConnect(
DBI::dbDriver("Oracle"),
usr, pwd,
dbname = dbn,
timezone = "UTC")
)
query <- "
SELECT
apt.APT_ICAO, pru.LON AS LONGITUDE, pru.LAT AS LATITUDE,
apt.APT_IN_EAPN AS IS_EAPN,
DECODE(apt.APT_ICAO,'LCLK','N','Y') IS_IMPED
FROM
PRU_AIRPORT.STAT_AIRPORT_INFO apt, PRU_AIRPORT pru
WHERE
apt.APT_IS_POSTING = 'Y'
AND apt.APT_ICAO = pru.ICAO_CODE
AND (pru.WEF <= TO_DATE(?ON_DATE, 'YYYY-MM-DD')
AND TO_DATE(?ON_DATE, 'YYYY-MM-DD') < pru.TILL)
"
query <- DBI::sqlInterpolate(con, query, ON_DATE = on_date)
ROracle::dbSendQuery(con, query) %>%
ROracle::fetch(n = -1) %>%
janitor::clean_names()
}
export_apdf_airports() %>%
mutate_at(.vars = vars(matches('^is_')), .funs = ~ . == 'Y') %>%
write_csv("airport.csv")
# IR390 first processed date
# NO SQL but directly from Thierry
tibble::tribble(
~ICAO, ~IR390_DATE,
"LSZH", "25-11-2014 18:46",
"LSGG", "16-12-2014 15:17",
"EGBB", "20-01-2015 14:53",
"EGCC", "26-01-2015 10:21",
"GCLP", "28-01-2015 10:03",
"GCTS", "28-01-2015 10:45",
"LEMD", "28-01-2015 11:25",
"LEBB", "28-01-2015 12:37",
"LEBL", "28-01-2015 13:05",
"LEIB", "28-01-2015 13:34",
"LEMG", "28-01-2015 14:03",
"GCFV", "02-02-2015 11:12",
"GCXO", "12-02-2015 12:06",
"LIME", "18-02-2015 14:28",
"EIDW", "18-02-2015 15:21",
"EGLL", "18-02-2015 15:59",
"EKCH", "19-02-2015 12:18",
"LEAL", "24-02-2015 16:02",
"LIPZ", "02-03-2015 09:50",
"EGKK", "08-03-2015 15:11",
"LOWW", "19-03-2015 10:51",
"LFPG", "19-03-2015 13:36",
"LEVC", "31-03-2015 10:49",
"EPWA", "31-03-2015 12:49",
"EDDP", "31-03-2015 13:39",
"LBSF", "31-03-2015 15:39",
"LJLJ", "01-04-2015 13:51",
"LIRF", "15-04-2015 10:33",
"EDDL", "24-04-2015 14:01",
"EDDF", "06-05-2015 15:06",
"GCRR", "08-05-2015 18:42",
"EGSS", "21-05-2015 10:51",
"EDDK", "26-06-2015 09:19",
"EDDW", "27-08-2015 12:41",
"EGGD", "27-08-2015 18:06",
"LFPO", "01-09-2015 15:49",
"LGAV", "01-09-2015 16:38",
"LHBP", "02-09-2015 10:57",
"LICC", "16-10-2015 18:59",
"EBCI", "21-10-2015 13:59",
"EETN", "04-11-2015 17:52",
"LIMC", "18-11-2015 14:41",
"EDDN", "01-12-2015 10:11",
"EDDE", "02-12-2015 16:27",
"EVRA", "08-12-2015 09:37",
"EDDV", "14-12-2015 10:32",
"EBBR", "16-12-2015 11:09",
"EDDM", "17-12-2015 10:20",
"ESSA", "11-01-2016 09:13",
"LFSB", "18-01-2016 12:25",
"LIPE", "19-01-2016 20:09",
"EICK", "27-01-2016 11:21",
"EDDH", "12-02-2016 13:28",
"LIML", "23-02-2016 16:33",
"EDDR", "09-03-2016 13:35",
"EGGW", "07-06-2016 12:37",
"EFHK", "17-06-2016 06:21",
"ENGM", "19-07-2016 02:45",
"LPPR", "22-12-2016 10:38",
"EDDG", "22-12-2016 10:58",
"ELLX", "09-01-2017 18:43",
"LIRN", "11-01-2017 19:42",
"LEPA", "11-01-2017 21:32",
"EDDB", "11-01-2017 22:41",
"EDDT", "11-01-2017 22:52",
"LKPR", "12-01-2017 00:10",
"EGPH", "12-01-2017 03:41",
"ESGG", "12-01-2017 04:49",
"LFLL", "12-01-2017 14:13",
"LPPT", "13-01-2017 02:05",
"EDDS", "20-02-2017 08:55",
"LEZL", "05-04-2017 13:04",
"LMML", "05-04-2017 13:44",
"EHAM", "29-08-2017 11:02",
"LIMF", "09-11-2017 17:33",
"EGNT", "21-01-2018 01:45",
"LDZA", "15-02-2018 11:34",
"EGPD", "20-02-2018 16:21",
"EGPF", "20-02-2018 22:41",
"LIRA", "18-05-2018 21:34",
"LROP", "29-08-2018 11:33",
"LZIB", "28-09-2018 12:54",
"EDDC", "03-04-2019 21:09",
"LPFR", "03-04-2019 23:14",
"EGLC", "25-04-2019 13:29",
"LFML", "07-06-2019 12:09",
"LFBO", "26-06-2019 12:35",
"LFMN", "06-09-2019 16:08",
"EYVI", "22-09-2019 06:08",
"LCLK", NA
) %>%
janitor::clean_names() %>%
write_csv("airport-ir390-date.csv")
Version: 1.0
RestoreWorkspace: Default
SaveWorkspace: Default
AlwaysSaveHistory: Default
EnableCodeIndexing: Yes
UseSpacesForTab: Yes
NumSpacesForTab: 2
Encoding: UTF-8
RnwWeave: Sweave
LaTeX: pdfLaTeX
AutoAppendNewline: Yes
StripTrailingWhitespace: Yes
library(readr)
library(sf)
library(units)
library(rnaturalearth)
library(ggplot2)
library(ggrepel)
library(ggsflabel)
apts <- read_csv("airport.csv") %>%
# define groups ...
mutate(group = case_when(
!is_eapn & !is_imped ~ "ONGOING",
!is_eapn & is_imped ~ "NOT_EAPN",
is_eapn & !is_imped ~ "NOTHING",
is_eapn & is_imped ~ "EAPN"
)) %>%
# ... and get rid of the meaningless one
filter(group != "NOTHING") %>%
# make it a geographic object but keep the other the coords anyway
sf::st_as_sf(
coords = c("longitude","latitude"),
crs = 4326,
remove = FALSE,
agr = "identity") %>%
# use LAEA projection
st_transform(crs = 3035)
# global bounding box
bbox_3035 <- apts %>%
# put all buffers together...
sf::st_union() %>%
# ...take the polygon enclosing all of them ...
sf::st_convex_hull() %>%
# st_transform(3035) %>%
# ...with a 50 NM buffer around ...
st_buffer(set_units(150, km)) %>%
sf::st_bbox() %>%
# TODO: use 'round away from zero' eventually
# https://shrektan.com/post/2018/04/25/human-round-round-to-nearest-ties-away-from-zero/
# round() %>%
as.numeric() %>%
`names<-`(c("left", "bottom", "right", "top"))
# just plot them (for fun)
world <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf") %>%
st_transform(crs = 3035)
ggplot2::ggplot(data = world) +
ggplot2::geom_sf(colour = "gray70", size = 0.5 / .pt) +
ggplot2::geom_sf(data = apts, mapping = aes(fill = group), shape = 21, size = 2.5) +
scale_fill_manual(
breaks = c( "EAPN", "NOT_EAPN", "ONGOING"),
values = c("green", "blue", "red")) +
ggplot2::coord_sf(xlim = c(bbox_3035["left"], bbox_3035["right"]),
ylim = c(bbox_3035["bottom"], bbox_3035["top"]),
expand = TRUE) +
ggplot2::theme_minimal() +
ggplot2::theme(panel.background = ggplot2::element_rect(fill = "aliceblue"),
legend.position = "none")
ggsave("airport-apdf.png", width = 12)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment