# FAZA 1B_OR (dla OR) - opis kodu (*program pierwszy - główne drogi*)
## wersja dla OR, która uwzględniająca nowopowstałe drogi główne
lokalizacja programu na klastrze:`/mnt/array0/lgawuc/struktura/emisje/obliczenia_e01/liniowka/yanosik/przetwarzanie/Yanosik_odnowa_lech_zima2020/runs/run_43_major_roads_gdal_grid`
skrypt: `rprog_SmartYan_faza_1b_major_roads_v1.R`
Jest to program, który jest wykonywany jako **pierwszy** w kolejności, działa on dla "dróg głównych", tj. tych o klasach OSM 1 i 2. Klasy 3 i niższe są przetwarzane przez inny program - [link](https://hackmd.io/@yanosik/H1EABxRU2).
poniżej opis komend w kodzie.
---
wczytanie bibliotek i czyszczenie obszaru roboczego:
```r
require(sf)
require(dplyr)
rm(list=ls())
#
# funkcja pomoznicza do zamiany NA na zera
fnoDATA <- function (x) {
x[is.na(x)] <- 0
return(x)}
```
wczytanie aktualnych danych OSM. Dane muszą zostać wcześniej pobrane z repozytorium. Dane musza pokrywac całą Polskę, więc trzeba ściągnąć wszystkie województwa i przetworzyć do postaci tożsamej z poniższym zbiorem `osm_m_v2_roads.shp`
```r
osm <- st_read('/mnt/array0/lgawuc/struktura/emisje/dane_e03/OSM_05sty2023/osm_m_v2_roads.shp')
```
Selekcja autostrad i drog ekspresowych klasy 1 i 2. Tylko te drogi podlegają przetwarzaniu w niniejszym programie. Zamiana nazw klas dróg ze stringów na cyfry i zapis jako `osm_major_roads_for_model_rcl1i2.shp`
```r
osm <- filter(osm,osm$fclass %in% c('motorway','motorway_link','trunk','trunk_link')) %>% select(fclass,maxspeed,tunnel)
osm$fclass <- gsub('motorway_link',1,osm$fclass)
osm$fclass <- gsub('motorway',1,osm$fclass)
osm$fclass <- gsub('trunk_link',2,osm$fclass)
osm$fclass <- gsub('trunk',2,osm$fclass)
st_write(osm,'osm_major_roads_for_model_rcl1i2',dsn='.',driver='ESRI Shapefile',append=F)
```
Wczytanie wszystkich istniejacych APRow w PL (w petli po wojewodztwach) i stworzenie jednolitej tablicy dla calego kraju:
```r
la <- Sys.glob('/home/lgawuc/yanosik/gooddata/Do_poprawy_geometrii_podzial_wojewodztwa_siatka_ZMAIK/aprs/*shp')
apr <- st_read(la[1])
for (i in 2:length(la)){
ab <- st_read(la[i])
apr <- rbind(apr,ab)
}
st_write(apr,layer='apry_all_w_PL',dsn='.',driver='ESRI Shapefile',append=F)
```
Tutaj trzeba wybrac podzbiór APRów - tylko takie punkty które leżą w małej odległości od osi dróg obiektu osm. (ale jest wykomentowane bo trwa zbyt długo)
```r
#apr_w_buf <- st_intersection(apr,obf) - to trwa okropnie dlugo wiec zrobione w Qgis - gdzie jest znacznie szybciej.
```
Tutaj można wczytać APRy na drogach głównych powstałych z selekcji w QGIS (odleglość od geometrii OSM: 0.0005 deg czyli ok 50 m) i obliczenie trf (rocznego sumarycznego natężenia ruchu w obie strony) oraz frakcji floty (so sc sd bus) jako sumy. Po przerzuceniu tych danych do geometrii OSM z aktualną siecią dróg będzie założenie ze ruch w obie strony jest taki sam. Flota w obu kierunkach też jest taka sama tak samo jak flota.
obf <- st_read('apry_all_w_buf_rclAiS_0.0005.shp')
... ostatecznie to powyższe nie jest zrobione. Prościej jest wczytać APRy z całej PL powstałe wcześniej i zrobić selekcję tylko po OSMclass (nie wykonuję buforowania w QGIs albo intersekcji w R):
```r
obf <- filter(apr,apr$OSMclass %in% c('1','2'))
```
Obliczenie usrednionych wartosci natezenia ruchu i floty (usrednionych dla dwoch kierunkow)
```r
obf$trf <- obf$Psumaro + obf$Rsumaro
obf$so <- (obf$Pso + obf$Rso)/2
obf$sd <- (obf$Psd + obf$Rsd)/2
obf$sc <- (obf$Psc + obf$Rsc)/2
obf$bus <- (obf$Pbus + obf$Rbus)/2
obf <- select(obf,c('geometry','nrpkt','trf','so','sd','sc','bus'))
```
Zapis punktów APR leżących przy drogach głównych wraz z obliczonymi `trf so sd sc bus`
```r
st_write( obf , dsn='.',layer='apry_rcl1i2_trf_so_sd_sc_bus',driver='ESRI Shapefile',append=F)
```
Stworzenie wektorów zawierających nazwy oraz indeksy dla floty.
`trf` - sumara pojazdow jakie przejechały dany punkt w ciągu roku (roczne natężenie ruchu)
`so` - samochody osobowe
`sd` - samochody dostawcze
`sc` - samochody ciężarowe
`bus` - autobusy dalekobieżne
Zmienne `so, sd, sc, bus` powinny się sumować do 1 gdyż oznaczają udział poszczególnych rodzajów pojazdów w sumarycznym natężeniu ruchu.
```r
rstNamVc <- c('trf','so','sd','sc','bus')
rstNamVcFull <- c('1','2','3','4','5')
```
Za pomoca zewnętrznego narzędzia `gdal_grid` stworzenie 5ciu rastrów z przeinterpolowanymi wartościami z APRów.
**UWAGA**: wynikowa rozdzielczość rastra jest tutaj ustawiona na 1000px. Wyniki modelu były zadowalające (w ocenie wizualnej oraz po obliczeniu sum emisji NOx dla całej Polski, które zostały porównane z sumami EMEP), więc nie widziałem potrzeby aby zwiększać rozdzielczość. Jej wpływ na dokładność wersji SmartYan w fazie 1B oraz 1C jest przedmiotem analizy w ewaluacji wyników modelu SmartYan, która jest przedmiotem powstającej publikacji naukowej. Ewaluacja jest oparta o referecyjne pomiary ZDM APR oraz GDDKiA SCPR. Ewaluacja jest przeprowadzona tylko dla woj. mazowieckiego.
Poniższa pętla jest realizowana po indeksie `g` dla pięciu elementów `trf so sd sc bus`:
```r
t <-Sys.time()
# for (g in 1:1){
for (g in 1:5){
# obiekt z wynikową nazwą zbioru
rstNam <- paste0('apry_rcl1i2_trf_so_sd_sc_bus__',rstNamVc[g],'.tif')
rstNamVcFull[g] <- rstNam
# stworzenie stringa z komendą dla zewnętrznej funkcji gdal_grid
cmd <- paste0('gdal_grid -zfield ',rstNamVc[g],' -a invdist:power=6.0:smoothing=0.0 -outsize 1000 1000 -a_srs EPSG:4326 -of GTiff -txe 13.5 24.5 -tye 48.5 55.5 apry_all_w_buf_rclAiS_0.0005_trf_so_sd_sc_bus.shp ',rstNam)
system( cmd, intern = FALSE,ignore.stdout = FALSE, ignore.stderr = TRUE,wait = T, input = NULL) #uruchomienie komendy zewnętrznej
}#{g}
print(Sys.time()-t)
```
Po stworzeniu rastrów należy przepisać ich wartości do geometrii obiektu osm.
```r
osm <- tibble::rowid_to_column(osm,'rowID')
osmCt <- st_centroid(osm) #stworzenie centroidów segmentów dróg
osmCt <- osmCt[!st_is_empty(osmCt),] # wyrzucenie nieprawidłowych obiektów
osmCt <- dplyr::select(osmCt,c('rowID','geometry'))
require(raster)
# for (r in 1:1){
for (r in 1:5){
rst <- raster(rstNamVcFull[r])
rst <- flip(rst, direction='y') # z jakiegoś powodu dane wychodzą obrucone
icrst <- fnoDATA(raster::extract(rst,osmCt)) # znalezienie wartości pikseli rastra odpowiadające
osmCt$icrst <- round(icrst,2) # zaokrąglenie
st_write(osmCt,layer=paste0('osmCt_',rstNamVcFull[r],'.shp'),dsn='.',driver='ESRI Shapefile',append=F)
# połączenie danych wyekstrahowanych z rastra z danymi przestrzennymi - obiekt "osm" gdzie wcześniej dopisana została kolumna "rowID"
df_osmCt <- osmCt %>% st_drop_geometry()
names(df_osmCt) <- c('rowID',rstNamVc[r])
osm <- st_as_sf(left_join(osm,df_osmCt,by='rowID'))
} #{r}
```
Przeliczenie natezenia ruchu na polowe (jeden segment Yanosik to ruch w jedna strone). W tej wersji programu liczone sa tylko drogi najwyzszego rzedu a one sa jednokierunkowe wiec trf musi byc podzielone przez 2
**UWAGA**: dane sciagniete wprost z repozytorium OSM sa jednokierunkowe, mimo ze rzeczywistosci ruch odbywa się w dwóch kierunkach. informacja o tym znajduje sie w kolumnie bodaj 'oneway' (w danych OSM ściągniętych z repozytorium, w danych Yanosik tej kolumny nie ma). Dane Yanosik dostarczone przez firme Neptis maja rowniez segmenty jednokierunkowe (tj. jeden segment drogi, stanowiący jeden wers w zbiorze danych jest zawsze jednokierunkowy). Jednakże segmenty dróg w danych Yanosik są zduplikowane jeżeli dana droga jest dwukierunkowa w rzeczywistosci.
Tj. jeden segment ma geometrie o punkt zalamania A B C D E F, a drugi kierunek ruchu ma punkty zamałania F E D C B A. Wyjaśnienie z ilustracjami tutaj [link](https://hackmd.io/@yanosik/HkVR9wmIn)
Kolejny krok to obliczenie skalibrowanego nateżenia ruchu. Wartość `300` jest typowo przyjmowaną wartością w inżynierii ruchu dla przeskalowania natężenia ruchu dobowego na sumę roczną. Jest to związane z faktem, iz wszystkie modele ruchu sumulują ruch dobowy na max 24 h do przodu i w inżynierii ruchu nie zajmują się ruchem rocznym. Wartość `300` zostala zasugerowana w drodze licznych konsulacji przez prof. Andrzeja Szaratę z Politechniki Krakowskiej.
```r
osm$trfBulk <- osm$trf
osm$trf24h <- osm$trf/300/2
osm$trf <- osm$trf/2
```
Zapis wynikowego zbioru danych, który jest potem brany do obliczeń w programie drugim [link](https://hackmd.io/@yanosik/H1EABxRU2).
```r
st_write(osm,layer='yanosik_by_SmartYan_faza_1b__major_roads_rcl1i2_interpolGGrid',dsn='.',driver='ESRI Shapefile',append=F)
```
---
koniec zbioru `rprog_SmartYan_faza_1b_major_roads_v1.R`