##########################
# 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()
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.