-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathafrilearndata-data-creation.R
584 lines (427 loc) · 23.1 KB
/
afrilearndata-data-creation.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
## code to prepare data objects from raw files stored in inst/extdata
## keeping the raw files allows the package also to be used to demonstrate reading in data
#############################################################################
# LINES
filename <- r"(inst/extdata/trans-african-highway.kml)" #windows safe paths
afrihighway <- sf::read_sf(filename)
#remove Description column, only has contents in first row
afrihighway <- afrihighway[ , which(names(afrihighway)!='Description')]
usethis::use_data(afrihighway, overwrite = TRUE)
############################################################################
# POLYGONS
# country boundaries from rnaturalearth
# just selected columns, save as shapefile to extdata for reading demos
# maybe simplify using rmapshaper to keep size low
library(rnaturalearth)
africountries <- rnaturalearth::ne_countries(continent = 'Africa', returnclass = 'sf')
columns_to_include <- c('name','name_long','iso_a3','pop_est','gdp_md_est','income_grp','lastcensus')
africountries <- africountries[ , which(names(africountries) %in% columns_to_include) ]
# ensure pop_est is numeric
africountries$pop_est <- as.numeric(africountries$pop_est)
# add columns for french, portuguese,
library(countrycode)
#africountries$name_fr <- countrycode(africountries$iso_a3, origin = 'iso3c', destination = 'iso.name.fr')
africountries$name_fr <- countrycode(africountries$iso_a3, origin = 'iso3c', destination = 'cldr.short.fr')
africountries$name_pt <- countrycode(africountries$iso_a3, origin = 'iso3c', destination = 'cldr.short.pt')
# afrikaans
africountries$name_af <- countrycode(africountries$iso_a3, origin = 'iso3c', destination = 'cldr.short.af')
# swahili
africountries$name_sw <- countrycode(africountries$iso_a3, origin = 'iso3c', destination = 'cldr.short.sw')
#Somlaliland come out as NA so put back in
africountries$name_fr[which(africountries$name=='Somaliland')] <- 'Somaliland'
africountries$name_pt[which(africountries$name=='Somaliland')] <- 'Somaliland'
africountries$name_af[which(africountries$name=='Somaliland')] <- 'Somaliland'
africountries$name_sw[which(africountries$name=='Somaliland')] <- 'Somaliland'
#maybe making sure CRS is correct
africountries <- sf::st_set_crs(africountries,4326)
usethis::use_data(africountries, overwrite = TRUE)
#save to extdata for reading demos
filename <- r"(inst/extdata/africountries.shp)" #windows safe paths
sf::write_sf(africountries, filename)
#TODO check this
# I suspect problem with UTF accents & a high popn. value
# Warning message:
# In CPL_write_ogr(obj, dsn, layer, driver, as.character(dataset_options), :
# GDAL Message 1: One or several characters couldn't be converted correctly from UTF-8 to ISO-8859-1. This warning will not be emitted anymore.
# In CPL_write_ogr(obj, dsn, layer, driver, as.character(dataset_options), :
# GDAL Message 1: Value 149229090 of field pop_est of feature 33 not successfully written. Possibly due to too larger number with respect to field width
#####################################################################################
# African continent
#https://gis.stackexchange.com/questions/92221/extract-raster-from-raster-using-polygon-shapefile-in-r
#sfworldland <- rnaturalearth::ne_download(scale='small',category='physical',type='land', returnclass = 'sf')
#sfworldlandmed <- rnaturalearth::ne_download(scale='medium',category='physical',type='land', returnclass = 'sf')
#see geocomputation
#BUT getting internal lines current issue
africountries$continent <- "Africa"
africontinent = africountries %>%
group_by(continent) %>%
summarize()
plot(sf::st_geometry(africontinent))
#twitter example & set_precision fix
sfcountries<- rnaturalearth::ne_countries(continent='Africa', returnclass='sf')
africontinent<- sfcountries %>%
group_by(continent) %>%
st_set_precision(10) %>% # edzers suggestion was 10000
summarize()
plot(sf::st_geometry(africontinent))
#TODO may want to add some missing islands to the continent e.g. cape verde, comoros
usethis::use_data(africontinent, overwrite = TRUE)
#save to extdata for reading demos
filename <- r"(inst/extdata/africontinent.shp)" #windows safe paths
sf::write_sf(africontinent, filename)
# potential 2nd polygon dataset of hexagonal equal area cartogram for African countries
#install.packages("geogrid")
library(geogrid)
new_cells <- geogrid::calculate_grid(shape = africountries, grid_type = "hexagonal", seed=4)
afrihex <- assign_polygons(africountries, new_cells)
mapview::mapview(afrihex, label='name')
# Warning message: sf layer has inconsistent datum (+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs).
# Need '+proj=longlat +datum=WGS84'
# don't want 2 cells in madagascar
# can modify random seed
# for (i in 1:6) {
# new_cells <- calculate_grid(shape = africountries, grid_type = 'hexagonal', seed = i)
# plot(new_cells, main = paste('Seed', i, sep=' '))
# }
#seeds 5,4,3,1 just have one cell for madagascar
#seed1 has lesotho below s.africa
#seed3 good:s.africa & lesotho in bottom row, bad: Eq. Guinea below Gabon
#seed4 best so far
#to add labels permanently to map
library(tmap)
tmap_mode("view")
tmap::tm_shape(afrihex) +
tm_borders("red") +
tm_text("name", col='blue')
#potential other tilemaps but gives error I think due to madagascar
#install.packages("tilemaps")
library(tilemaps)
afritilemap <- generate_map(africountries, square = FALSE, flat_topped = TRUE)
# although coordinates are longitude/latitude, st_touches assumes that they are planar
# Error in generate_map(africountries, square = FALSE, flat_topped = TRUE) :
# regions are not contiguous
############################################################################
# POINTS capitals
# needs to go after polygons because uses country names from that
library(maps)
data(world.cities)
library(countrycode) # to aid in matching country names in world.cities
dfcapitals <- world.cities[ which(world.cities$capital==1), ]
# may have problems with countrynames being different
# this gets 45
#dfafricapitals <- dfcapitals[ which(dfcapitals$country.etc %in% africountries$name_long), ]
#convert to iso3 using countrycode
dfcapitals$iso3c <- countrycode::countrycode(dfcapitals$country.etc, origin = 'country.name', destination = 'iso3c')
#use iso3c to identify capitals in Africa
# now gets 52
dfafricapitals <- dfcapitals[ which(dfcapitals$iso3c %in% africountries$iso_a3), ]
# but that does include Serbia(iso3c NA) & Netherlands Antilles(iso3c NA) & Micronesia
# down to 49
dfafricapitals <- dfafricapitals[ !is.na(dfafricapitals$iso3c), ]
#remove capital column
dfafricapitals <- dfafricapitals[ , which(names(dfafricapitals) != "capital") ]
#rename column country.etc
names(dfafricapitals)[1] <- "capitalname"
names(dfafricapitals)[2] <- "countryname"
#which capitals not included ?
#africountries$name_long[ -which(africountries$iso_a3 %in% africapitals$iso3c)]
#[1] "South Sudan" "Somaliland"
#TODO add capitals for "South Sudan" "Somaliland"
#https://geohack.toolforge.org/geohack.php?pagename=Juba¶ms=4_51_N_31_36_E_region:SS_type:city(525953)
dfss <- data.frame(capitalname="Juba",
countryname="South Sudan",
pop=NA,
lat=4.85,
long=31.6,
iso3c="SSD")
dfafricapitals <- rbind(dfafricapitals, dfss)
#Somaliland should probably be part of Somalia according to international recognition
#but given it is in africountries I should add the capital too
#https://geohack.toolforge.org/geohack.php?pagename=Somaliland¶ms=9_33_N_44_03_E_type:city
dfso <- data.frame(capitalname="Hargeysa",
countryname="Somaliland",
pop=NA,
lat=9.55,
long=44.05,
iso3c="Somaliland")
dfafricapitals <- rbind(dfafricapitals, dfso)
#?world.cities says pop is approximate population (as at January 2006)
#I could try to update or find better source
#convert to sf: 4326 is CRS code for most common lat lon WGS84
africapitals <- sf::st_as_sf(dfafricapitals, coords=c("long","lat"), crs=4326)
usethis::use_data(africapitals, overwrite = TRUE)
#save to extdata for reading demos - as geopackage for example and copes with longer column names
filename <- r"(inst/extdata/africapitals.gpkg)" #windows safe paths
sf::write_sf(africapitals, filename)
#mapview::mapview(africapitals, zcol="name")
#mapview(africountries, zcol="name") + mapview(africapitals, label="capitalname")
############################################################################
# POINTS CSV airports
# can read directly from the website
filename <- "https://ourairports.com/continents/AF/airports.csv"
dfairall <- readr::read_csv(filename)
nrow(dfairall)
#[1] 3526
names(dfairall)
# [1] "id" "ident" "type" "name" "latitude_deg"
# [6] "longitude_deg" "elevation_ft" "continent" "country_name" "iso_country"
# [11] "region_name" "iso_region" "local_region" "municipality" "scheduled_service"
# [16] "gps_code" "iata_code" "local_code" "home_link" "wikipedia_link"
# [21] "keywords" "score" "last_updated"
unique(dfairall$type)
#[1] "large_airport" "medium_airport" "small_airport" "closed" "heliport" "seaplane_base"
dfairall %>% group_by(type) %>% summarise(count = n())
# 1 closed 107
# 2 heliport 70
# 3 large_airport 48
# 4 medium_airport 448
# 5 seaplane_base 1
# 6 small_airport 2852
#496
#dfairports_ml <- dplyr::filter(dfairall, type=="large_airport" | type=="medium_airport" )
#3348
dfairports <- dplyr::filter(dfairall, grepl("airport",dfairall$type))
#having small, medium large will be nice !! e.g. for plotting by country with different symbols
#and 3k is not too many points I think
#also potential for challenges for learners - e.g. small airports obscure all at continental scale
# get into sf
afriairports <- sf::st_as_sf(dfairports, coords=c("longitude_deg", "latitude_deg"), crs=4326)
mapview(afriairports, zcol='type', label='name', cex=2)
# example filtering by type & country
afriair <- filter(afriairports, type=="large_airport" | type=="medium_airport" )
afriair <- filter(afriairports, country_name == "South Sudan" )
mapview(afriair, zcol='type', label='name')
#save sf object in package
usethis::use_data(afriairports, overwrite = TRUE)
# save as csv in the package
filename <- r"(inst/extdata/afriairports.csv)" #windows safe paths
# needed to specify utf encoding otherwise accents get messed up
write.csv(dfairports, filename, row.names=FALSE, fileEncoding="UTF-8")
##########################################################################
# RASTER
# aggregated worldpop data
#download 2020 global 30m (1km) data from here
#Unconstrained global mosaics
#2020
#https://www.worldpop.org/geodata/summary?id=24777
#2000
#https://www.worldpop.org/geodata/summary?id=24757
#Estimated total number of people per grid-cell.
#The dataset is available to download in Geotiff format at a resolution of 30 arc (approximately 1km at the equator).
#include 2 years to allow calculation of pop change
afripop2000 <- afripop2020 <- NULL
for( year in c(2020,2000))
{
cat(year,"\n")
if (year==2020)
filewpop <- r"(C:\Dropbox\_afrimapr\data\worldpop\ppp_2020_1km_Aggregated.tif)" #windows safe paths
else
filewpop <- r"(C:\Dropbox\_afrimapr\data\worldpop\ppp_2000_1km_Aggregated.tif)" #windows safe paths
rastwpop <- raster(filewpop)
#plot(rastwpop)
#crop to the bbox
cr <- crop(rastwpop, extent(africountries), snap="out")
#dim(cr) 8662 8252
#rsaterize the continent
fr <- rasterize(africontinent, cr, silent=FALSE) #rasterise takes >5 mins on 8k*8k grid
#mask by the continent
afripop <- mask(x=cr, mask=fr)
#plot(afripop)
#still 8k * 8k cells
#now want to aggregate(fact=[num cells in each direction])
#afripop_agg10 <- raster::aggregate(afripop, fun=mean, fact=10)
#still 800 * 800 cells that mapview doesn't like to display
afripop_agg20 <- raster::aggregate(afripop, fun=mean, fact=20)
#afripop_agg50 <- raster::aggregate(afripop, fun=mean, fact=50)
#afripop_agg100 <- raster::aggregate(afripop, fun=mean, fact=100)
dim(afripop_agg20) #434 413 1
#dim(afripop_agg50) #174 166 1
#mapview(afripop_agg20) #BEST? > mapview happy
#mapview(afripop_agg50) #highest density cell in lagos in sea
#why does 20km version cut off parts of W of continent ?
#it doesn't when displayed in tmap
#sometimes needed to make sure data are associated with object (rather than being in file)
afripop_agg20 <- readAll(afripop_agg20)
if (year==2020)
afripop2020 <- afripop_agg20
else
afripop2000 <- afripop_agg20
}
usethis::use_data(afripop2000, overwrite = TRUE)
usethis::use_data(afripop2020, overwrite = TRUE)
#save raster as a tif file so reading in can be demonstrated
# write to a new geotiff file (depends on rgdal)
if (require(rgdal)) {
filename <- r"(inst/extdata/afripop2020.tif)" #windows safe paths
writeRaster(afripop2020, filename=filename, format="GTiff", overwrite=TRUE)
filename <- r"(inst/extdata/afripop2000.tif)" #windows safe paths
writeRaster(afripop2000, filename=filename, format="GTiff", overwrite=TRUE)
}
#######################################################################
# csv of francophone country populations by name
# that can be used to demo joining
# to plot a map of Francophone countries to promote useR2021 tutorial
library(readr)
library(dplyr)
francophone_africa <- read_csv("inst/extdata/francophone-africa.csv",
locale = locale(encoding = "ISO-8859-1"))
#join
sf_franc <- dplyr::left_join(africountries, francophone_africa, "name_long" )
library(ggplot2)
library(ggrepel)
ggplot(sf_franc) +
geom_sf(aes(fill = popn)) +
scale_fill_viridis_c() +
theme_void() +
geom_text_repel(aes(label=name_fr, geometry=geometry),
stat="sf_coordinates",
point.padding = NA, #allows points to overlap centroid
colour='darkgrey', size=3
) +
labs(title = "", fill = "Population")
#######################################################################
#landcover raster submitted by Chris Littleboy
#https://github.com/chrislittleboy/publicdata/blob/main/afrimapr%20modis.R
# > dim(africalowres)
# [1] 2106 2373 1
# > africalowres_agg4 <- raster::aggregate(africalowres, fun=modal, fact=4)
# > dim(africalowres_agg4)
# [1] 527 594 1 1
# > africalowres_agg3 <- raster::aggregate(africalowres, fun=modal, fact=3)
# > dim(africalowres_agg3)
# [1] 702 791 1
library(MODIS)
library(raster)
##### Download data #####
# EarthdataLogin(usr = "usernamehere", pwd = "passwordhere")
# you need to create an account with EarthData to access products and use the above to set up a hidden file with the details
template_raster <- raster(choose.files())
# selects a template raster for the download
# mine uses afripop data from here (https://www.worldpop.org/doi/10.5258/SOTON/WP00004), but this could be anything
# The data downloaded will have the same resolution and extent as the template
#### WARNING, this takes a lot of time and a good internet connection...
# runGdal(product = "MCD12C1", # gets MODIS land cover data https://lpdaac.usgs.gov/products/mcd12c1v006/
# begin = "2019-01-01", # gets latest map from date range (it is a time series)
# extent = template_raster) # sets the extent, resolution and projection of template raster)
runGdal(product = "MCD12C1", # gets MODIS land cover data https://lpdaac.usgs.gov/products/mcd12c1v006/
begin = "2019-01-01", # gets latest map from date range (it is a time series)
extent = afripop2020) # sets the extent, resolution and projection of template raster)
# TODO : maybe I don't want to download at the low res, i.e. based on
# outProj = +proj=longlat +datum=WGS84 +no_defs (if applicable, derived from Raster*/Spatial*/sf* object)
# pixelSize = 0.1666667 0.1666667 (if applicable, derived from Raster* object)
# resamplingType = near
# Output directory = C:/Users/andy.south/AppData/Local/Temp/RtmpwLMEUp/MODIS_ARC/PROCESSED/MCD12C1.006_20210525103645 (no 'job' name specified, generated (date/time based))
# it did take > 1 hour probably < 3
# [1] "C:/Users/ANDY~1.SOU/AppData/Local/Temp/RtmpwLMEUp/MODIS_ARC/PROCESSED/MCD12C1.006_20210525103645/MCD12C1.A2019001.Majority_Land_Cover_Type_1.tif"
# [2] "C:/Users/ANDY~1.SOU/AppData/Local/Temp/RtmpwLMEUp/MODIS_ARC/PROCESSED/MCD12C1.006_20210525103645/MCD12C1.A2019001.Majority_Land_Cover_Type_1_Assessment.tif"
# [3] "C:/Users/ANDY~1.SOU/AppData/Local/Temp/RtmpwLMEUp/MODIS_ARC/PROCESSED/MCD12C1.006_20210525103645/MCD12C1.A2019001.Land_Cover_Type_1_Percent.tif"
# [4] "C:/Users/ANDY~1.SOU/AppData/Local/Temp/RtmpwLMEUp/MODIS_ARC/PROCESSED/MCD12C1.006_20210525103645/MCD12C1.A2019001.Majority_Land_Cover_Type_2.tif"
# [5] "C:/Users/ANDY~1.SOU/AppData/Local/Temp/RtmpwLMEUp/MODIS_ARC/PROCESSED/MCD12C1.006_20210525103645/MCD12C1.A2019001.Majority_Land_Cover_Type_2_Assessment.tif"
# [6] "C:/Users/ANDY~1.SOU/AppData/Local/Temp/RtmpwLMEUp/MODIS_ARC/PROCESSED/MCD12C1.006_20210525103645/MCD12C1.A2019001.Land_Cover_Type_2_Percent.tif"
# [7] "C:/Users/ANDY~1.SOU/AppData/Local/Temp/RtmpwLMEUp/MODIS_ARC/PROCESSED/MCD12C1.006_20210525103645/MCD12C1.A2019001.Majority_Land_Cover_Type_3.tif"
# [8] "C:/Users/ANDY~1.SOU/AppData/Local/Temp/RtmpwLMEUp/MODIS_ARC/PROCESSED/MCD12C1.006_20210525103645/MCD12C1.A2019001.Majority_Land_Cover_Type_3_Assessment.tif"
# [9] "C:/Users/ANDY~1.SOU/AppData/Local/Temp/RtmpwLMEUp/MODIS_ARC/PROCESSED/MCD12C1.006_20210525103645/MCD12C1.A2019001.Land_Cover_Type_3_Percent.tif"
##### Load and process the data #####
#filename <- "C:/Users/ANDY~1.SOU/AppData/Local/Temp/RtmpwLMEUp/MODIS_ARC/PROCESSED/MCD12C1.006_20210525103645/MCD12C1.A2019001.Majority_Land_Cover_Type_1.tif"
filename <- "C:\\Dropbox\\_afrimapr\\data\\landcover-modis\\MCD12C1.A2019001.Majority_Land_Cover_Type_1.tif"
# values=TRUE needed to make sure values are stored in the object
afrilandcover <- raster(filename, values=TRUE)
dim(afrilandcover)
# [1] 434 413 1 Cool this is the same as afripop2020
# rename the name for the layer stored in the object
names(afrilandcover) <- "landcover"
library(plotKML)
data(worldgrids_pal) # loads package with the colour palette for IGBP classification system
afrilandcover <- ratify(afrilandcover)
rat <- levels(afrilandcover)[[1]] # creates a raster attribute table using the classification system
igbp <- as.data.frame(as.list(worldgrids_pal)[7]) # extracts igbp classification info
rat$landcover <- rownames(igbp)[rat$ID+1]
rat$colour <- igbp$IGBP[rat$ID+1]
levels(afrilandcover) <- rat
#TODO crop to the continent boundary to remove seacells
#TODO is there a better way to get mapview to recognise the colours ?
mapview(afrilandcover, att="landcover", col.regions=levels(afrilandcover)[[1]]$colour)
# this is how rasterVis plots using the rat
# BUT this uses rat in separate file, also seems not to be able to use
# one stored in the raster object
library(rasterVis)
levelplot(afrilandcover,
col.regions = rat$colour,
main = "Land Cover in Africa (Source: MODIS MCD12C1)")
# using tmap
tm_shape(afrilandcover) + tm_raster("landcover")
#fails w or w/out quotes
#tm_shape(afrilandcover) + tm_raster("landcover", palette="colour")
tm_shape(afrilandcover) + tm_raster("landcover", palette=levels(afrilandcover)[[1]]$colour)
#can't quite get it to display both the colours & the labels
tm_shape(afrilandcover) + tm_raster("landcover", style="cat",palette=levels(afrilandcover)[[1]]$colour, labels=levels(afrilandcover)[[1]]$landcover)
# maybe I should try stars for afrilandcover instead ?
# can I get a stars object to save the rastr attribute table with th colours ?
# or terra ?
# terra can save raster attribute tables incl. colour palette as indicated here :
# https://geocompr.robinlovelace.net/attr.html
library(terra)
afrilandcoverterra <- terra::rast(filename)
# write file to package, as grd file to preserve raster attribute table
filename <- r"(inst/extdata/afrilandcover.grd)" #windows safe paths
writeRaster(afrilandcover, filename, overwrite=TRUE) # writes as grd to preserve rat
# save data object in package
# IMPORTANT this seems to have to go after writeRaster()
# otherwise raster::plot(afrilandcover) gives: Error in .local(.Object, ...)
usethis::use_data(afrilandcover, overwrite = TRUE)
# test reading in again
filename <- system.file("extdata","afrilandcover.grd", package="afrilearndata", mustWork=TRUE)
testlc <- raster::raster(filename)
mapview(testlc, att="landcover", col.regions=levels(testlc)[[1]]$colour)
#now I see that tmap has a global landcover as a stars object
#but doesn't have the colour palette saved in the object
data(land)
pal8 <- c("#33A02C", "#B2DF8A", "#FDBF6F", "#1F78B4", "#999999", "#E31A1C", "#E6E6E6", "#A6CEE3")
tm_shape(land, ylim = c(-88,88)) +
tm_raster("cover_cls", palette = pal8, title = "Global Land Cover")
# test reading in as a stars object
#proxy=FALSE ensures data are loaded but probably not necessary for this small grid
afrilandstars <- stars::read_stars(filename, proxy=FALSE)
# it gives Warning message: ignoring unrecognized unit: class number
# which is from here in stars :
# https://github.com/r-spatial/stars/blob/ed1e36ff9ea317fd9d9c2fc9d360c06cb7258555/R/dimensions.R
#using RAT should get it to create a categorical stars object but not working ??
afrilandstars <- stars::read_stars(filename, proxy=FALSE, RAT=rownames(igbp)[rat$ID+1])
#TODO can I get stars to store & plot the colours ?
# nearly working but not quite ...
#seems from here that a colour attribute can be set
#https://github.com/r-spatial/stars/issues/392#issuecomment-788812130
#attr(r$f, "colors") = c("#b41614", "#3cfa96")
afrilandstars$landcover <- rownames(igbp)[rat$ID+1]
attr(afrilandstars$landcover, "colors") = igbp$IGBP[rat$ID+1]
#stars plots the categories well, but does not seem to retain the colours ?
#and the labels get truncated
plot(afrilandstars)
#mapview likewise
mapview(afrilandstars)
#or just try converting the raster object
afrilandstars2 <- st_as_stars(afrilandcover)
tm_shape(afrilandstars2) + tm_raster("landcover")
tm_shape(afrilandstars2) + tm_raster("landcover", style="cat",palette=levels(afrilandcover)[[1]]$colour, labels=levels(afrilandcover)[[1]]$landcover)
#but how can it be read from the grd file ?
#or maybe I should save as a tiff like above too ?
# TODO I think stars is way to go - like in tmap
# but just need to work out how to get it to create the categorical raster
# how does tmap create land ?
# https://github.com/r-tmap/tmap/blob/bab938b2bffb040638b635ffd99e7bce8143e7f3/build/create_land.R
# potential different approach to get the same data
# https://rspatialdata.github.io/land_cover.html
# library(MODIStsp)
# MODIStsp(gui = FALSE,
# out_folder = "LandCoverData",
# out_folder_mod = "LandCoverData",
# selprod = "LandCover_Type_Yearly_500m (MCD12Q1)",
# bandsel = "LC1",
# user = "mstp_test" ,
# password = "MSTP_test_01",
# start_date = "2019.01.01",
# end_date = "2019.12.31",
# verbose = FALSE,
# spatmeth = "file",
# spafile = spatial_filepath,
# out_format = "GTiff")