data-raw/21-leggi_confini.R

##########################
# LEGGI CONFINI ZONE OMI #
##########################

masteRfun::load_pkgs('data.table', 'sf')

storico = FALSE
fns <- sort(list.files(file.path(ext_path, 'OMI', 'zone'), 'zip$', full.names = TRUE))
if(!storico) fns <- fns[length(fns)]

leggi_kml <- function(x, xt){
    xc <- gsub('.*/(.*)\\.kml', '\\1', x)
    system(paste0('iconv -f Latin1 -t utf-8 ', x, ' > ', x, 't'))
    system(paste0('mv ', x, 't ', x))
    y <- tryCatch( 
            st_read(x, quiet = TRUE),
            error = \(e){ 
                message('   >>> File kml non leggibile per il Comune: ', xc)
                dbm_do('omi', 'w', 'errori', data.table(periodo = fnt, catasto = xc, errore = 0), trunc = FALSE)
                NULL
            }
    )
    if(is.null(y)) return(st_polygon())
    y <- y |> subset(select = Name) |> st_transform(32632)
    y$OMI <- paste0(xc, aggiungi_caratteri(gsub('.* (.*$)', '\\1', y$Name), 4))
    y <- y |> subset(select = OMI)
    if(sum(is.na(st_is_valid(y))) > 0){
        ynv <- y[which(is.na(y |> st_is_valid())),] |> st_drop_geometry()
        for(z in 1:nrow(ynv)){
            message('   >>> Poligono OMI ', ynv[z, 'OMI'], ' `Nullo` per il Comune: ', xc, ' (Insanabile)')
            y <- y |> subset(OMI != ynv[z, 'OMI'])
            dbm_do('omi', 'w', 'errori', data.table(periodo = fnt, catasto = xc, OMI = ynv[z, 'OMI'], errore = 8), trunc = FALSE)
        }
        if(nrow(y) == 0) return(NULL)
    }
    if(sum(st_is_empty(y)) > 0){
        ynv <- y[which(y |> st_is_empty()),] |> st_drop_geometry()
        for(z in 1:nrow(ynv)){
            message('   >>> Poligono OMI ', ynv[z, 'OMI'], ' `Vuoto` per il Comune: ', xc, ' (Insanabile)')
            y <- y |> subset(OMI != ynv[z, 'OMI'])
            dbm_do('omi', 'w', 'errori', data.table(periodo = fnt, catasto = xc, OMI = ynv[z, 'OMI'], errore = 1), trunc = FALSE)
        }
        if(nrow(y) == 0) return(NULL)
    }
    if(sum(!st_is_valid(y)) > 0){
        ynv <- y[which(!y |> st_is_valid()),]
        for(z in 1:nrow(ynv)){
            message('   >>> Poligono OMI ', ynv[z,]$OMI, ' `Invalido` per il Comune: ', xc)
            yx <- switch(tolower(substr(ynv[z,] |> st_is_valid(reason = TRUE), 1, 4)),
                   'self' = 2,
                   'nest' = 3,
                   'ring' = 4,
                   'hole' = 5,
                   'too ' = 6,
                   9
            )
            ynv[z,] <- ynv[z,] |> st_buffer(0) |> st_make_valid()
            dbm_do('omi', 'w', 'errori', data.table(periodo = fnt, catasto = xc, OMI = ynv[z,]$OMI, errore = yx, sanato = 1), trunc = FALSE)
        }
        y <- rbind(y[which(y |> st_is_valid()),], ynv)
    }
    y |> st_zm(nbnd) |> st_cast('MULTIPOLYGON') |> st_make_valid()
}

for(fn in fns){

    fnt <- gsub('[^0-9]', '', fn)
    
    message('\nElaborazione semestre ', fnt)
    dbm_do('omi', 's', strSQL = paste('DELETE FROM errori WHERE periodo =', fnt))
        
    message(' - decompressione...')
    opath <- file.path(ext_path, 'OMI', 'zone', fnt)
    system(paste('rm -rf', opath))
    unzip(fn, exdir = opath)
    
    message(' - lettura ed unione...')
    y <- list.files(opath, '\\.kml$', full.names = TRUE) |> sort() |> lapply(leggi_kml, fnt) |> masteRgis::st_unisci_poli()
    y <- y[order(y$OMI), 'OMI']
    
    message(' - salvo in formato shapefile...')
    st_write(y, file.path(ext_path, 'OMI', 'zone', paste0(fnt, '.shp')), append = FALSE, quiet = TRUE)
    
    message(' - convalido i poligoni...')
    y <- y |> st_make_valid()

    message(' - salvo in formato geopackage e serializzato...')
    qs::qsave(y, file.path(bnd_path, 'OMI', fnt))
    st_write(y, file.path(bnd_path, 'OMI.gpkg'), fnt, append = FALSE, quiet = TRUE)

}

message('\nSalvataggio tabella `errori` come dato nel pacchetto')
salva_dts_pkg(dbm_do('omi', 'r', 'errori') |> _[order(periodo, catasto)], 'errori', as_db = FALSE)

message('\nSalvataggio ultimo periodo in formato geopackage...')
message(' - proiezione')
st_write(y, file.path(bnd_path, '0p.gpkg'), 'OMI', append = FALSE, quiet = TRUE)
message(' - geodetico')
y <- y |> st_transform(4326)
st_write(y, file.path(bnd_path, '0.gpkg'), 'OMI', append = FALSE, quiet = TRUE)

message('\nElaborazioni Terminate. Pulizia Ambiente ed Uscita')
rm(list = ls())
gc()
master-info/masteRomi documentation built on Oct. 25, 2023, 5:18 p.m.