#' Piirkonna postgis andmebaasi loomine #' #' Funktsioon loob piirkonna geojoonest ja nimest postgis andmebaasi. Samas lisatakse faili piir ja piiri piirkast. Ülejäänud funktsioonid kasutavad selle funktsiooni poolt loodud objekti nime ja piiri ega piirikasti pole vaja enam teiste funktsioonide rakendamisel lisada. #' #' @importFrom magrittr %>% #' @importFrom rlang .data #' @param pk Piirkonna geomeetriline joon. #' @param obj str Objekti nimi. Edaspidi on oluline ainult see nimi. Piirkonna geomeetrilist joont ei ole vaja edaspidi lisada. #' @param conf A list() of configuration variables. Default values \code{\link[ruut]{get_config}}. #' @return Andmebaasi loomine koos kihtidega 'piir' ja 'bb' (boundary box, piirikast). #' @seealso [sf::st_read()], [sf::write_sf()],[sf::st_transform()],[ruut::pk_sellest_alustame_db_loomist()],[ruut::pk_lisame_ruudustikud()] ,[ruut::pk_lisame_polygoonid()],[ruut::pk_lisame_jooned()],[ruut::pk_lisame_punktid()],[ruut::pk_teisendame_polygoone()],[ruut::pk_teisendame_jooni()],[ruut::pk_teisendame_punkte()] #' @keywords postgis, boundary box, EPSG:3301 #' @export #' @examples #' \dontrun{ #' #' # read geojson from string: #' geojson_txt <- paste('{"type":"MultiPoint","coordinates":[[658300,6474800], #' [658300,6475000],[658700,6476000],[659600,6475000],[659600,6474800], #' [658300,6474800]]}') #' x <- sf::read_sf(geojson_txt) %>% sf::st_cast("POLYGON") #' sf::st_crs(x) <- 3301 #' x #' sf::st_geometry(x) %>% graphics::plot() #' #' obj <- "marja" #' pk_sellest_alustame_db_loomist(pk = x, obj = obj) #' #' # Layers list. #' ruut::db_schema_tablenames(conf = conf) #' } pk_sellest_alustame_db_loomist <- function(pk = NULL, obj = NULL, conf = NULL) { ## ----------- argumentide vastavuse kontroll ----------- if (is.null(pk)) { cat("\nPalun kontrolli geomeetrilise kujundi \u00F%igsust.\n") # return(NULL) } if (is.null(obj)) { cat("\nPalun sisesta objekti nimi.\n") # return(NULL) } vars <- ajutised_muutujad(pk, obj, conf) obj <- vars$obj pk <- vars$pk conf <- vars$conf # attributes(pk)$names <- attributes(pk)$sf_column <- "geom" ## Tabelid mis on juba andmebaasis ja mida ümber ei kirjutata. olemasolevad_tabelid <- ruut::db_schema_tablenames(conf = conf) ## --------------------- programmi osa ------------------------ ## 1. Piirjoone salvestamine ## Kui olemasolev tabel eksisteerib andmebaasis, siis jätame arvutused ## selle tabeliga vahele. uus_tabel <- "a00_piir" if (uus_tabel %in% olemasolevad_tabelid) { cat(sprintf("\nTabel %s on juba andmebaasis olemas.\n", uus_tabel)) } else { pk <- sf::st_transform(pk, 3301) # Write to gpkg and check validity sf::write_sf( pk, dsn = vars$tmp_gpkg_file, layer = vars$conf$gpkg_table, driver = "gpkg", fid_column_name = "fid", delete_dsn = T ) # Geomeetria parandamine # ruut::qgis_algorithm_search_by_word("fix") algorithm <- "native:fixgeometries" input <- vars$tmp_gpkg_file_input_1 # ajutine fail output <- vars$tmp_gpkg_file_output_2 # ajutine fail str <- sprintf("{ 'INPUT' : '%s', 'OUTPUT' : '%s' }", input, output) cmd <- ruut::construct_qgis_output_result_to_better_format(str = str, algorithm = algorithm) system(cmd) ## Multipart to singlepart # ruut::qgis_algorithm_search_by_word("singlepart") algorithm <- "native:multiparttosingleparts" input <- vars$tmp_gpkg_file_input_2 # ajutine fail output <- vars$tmp_gpkg_file_output_1 # ajutine fail str <- sprintf("{ 'INPUT' : '%s', 'OUTPUT' : '%s' }", input, output) cmd <- ruut::construct_qgis_output_result_to_better_format(str = str, algorithm = algorithm) system(cmd) # Write to postgis ruut::db_create_new_schema(conf = conf) # conn <- ruut::db_connect(conf = conf) # DBI::dbDisconnect(conn) # Eemaldame üleliigsed veerud # ruut::qgis_algorithm_search_by_word("Drop") algorithm <- "native:deletecolumn" input <- vars$tmp_gpkg_file_input_1 conf$table <- uus_tabel output <- ruut::construct_to_gpkg_output_postgres_str( conf = conf, geometry_field = "geom", geometry_type = "Polygon", srid = 3301, checkPrimaryKeyUnicity = FALSE, key = "id" ) cmd <- sprintf( "qgis_process run %s --COLUMN='fid' --INPUT='%s' --OUTPUT='%s' ", algorithm, input, output ) system(cmd) } ## 2. Piirikasti salvestamine ## Kui olemasolev tabel eksisteerib andmebaasis, siis jätame arvutused ## selle tabeliga vahele. uus_tabel <- "a00_piir_bb" if (uus_tabel %in% olemasolevad_tabelid) { cat(sprintf("\nTabel %s on juba andmebaasis olemas.\n", uus_tabel)) } else { ## konstrueerime EXTENT, HSPACING ja VSPACING väärtused piirikasti konstrueerimiseks. pk_attributes <- attributes(pk$geom) extent <- sprintf( "%s,%s,%s,%s [EPSG:3301]", round((pk_attributes$bbox["xmin"] / 100), digits = 0) * 100, ceiling((pk_attributes$bbox["xmax"] / 100)) * 100, round((pk_attributes$bbox["ymin"] / 100), digits = 0) * 100, ceiling((pk_attributes$bbox["ymax"] / 100)) * 100 ) hspacing <- (ceiling((pk_attributes$bbox["xmax"] / 100)) * 100) - (round((pk_attributes$bbox["xmin"] / 100), digits = 0) * 100) vspacing <- (ceiling((pk_attributes$bbox["ymax"] / 100)) * 100) - (round((pk_attributes$bbox["ymin"] / 100), digits = 0) * 100) conf$table <- uus_tabel output <- ruut::construct_to_gpkg_output_postgres_str( conf = conf, geometry_field = "geom", geometry_type = NULL, srid = 3301, checkPrimaryKeyUnicity = FALSE, key = "id" ) # ruut::qgis_algorithm_search_by_word(str = "grid") algorithm <- "native:creategrid" # cat(ruut::qgis_show_help(algorithm = algorithm)) cmd <- sprintf( "qgis_process run %s --CRS=\"EPSG:3301\" --EXTENT=\"%s\" --HOVERLAY=0 --HSPACING=%s --TYPE=2 --VOVERLAY=0 --VSPACING=%s --OUTPUT=\"%s\"", algorithm, extent, hspacing, vspacing, output ) cat(sprintf("\n%s\n", cmd)) system(cmd) } ## 3. epk2t piirikasti konstrueerimine ja salvestamine s.t kuhu mahuvad sisse ## meie piirkonna epk2t (1x1km) ruudud. ## Kui olemasolev tabel eksisteerib andmebaasis, siis jätame arvutused ## selle tabeliga vahele. uus_tabel <- "a00_bb2" if (uus_tabel %in% olemasolevad_tabelid) { cat(sprintf("\nTabel %s on juba andmebaasis olemas.\n", uus_tabel)) } else { ## 3.1 Leiame piirikastiga seotud epk2t ruudud # ruut::qgis_algorithm_search_by_word(str = "extract") algorithm <- "native:extractbylocation" # cat(ruut::qgis_show_help(algorithm = algorithm)) conf$table <- "epk2t_grid" conf$schema <- "maaamet" input <- ruut::construct_to_gpkg_output_postgres_str( conf = conf, geometry_type = "Polygon", srid = 3301, checkPrimaryKeyUnicity = TRUE, key = "id", geometry_field = "geom" ) conf$table <- "a00_piir_bb" conf$schema <- obj intersect <- ruut::construct_to_gpkg_output_postgres_str( conf = conf, geometry_type = "Polygon", srid = 3301, checkPrimaryKeyUnicity = TRUE, key = "id" ) output <- vars$tmp_gpkg_file_output_1 # ajutine fail str <- sprintf( "{ 'INPUT' : '%s', 'INTERSECT' : '%s', 'OUTPUT' : '%s', 'PREDICATE' : [5,6] }", input, intersect, output ) cmd <- ruut::construct_qgis_output_result_to_better_format(str, algorithm) system(cmd) ## 3.2 Ajutise faili abil epk2t piirikasti konstrueerimine test_layer_obj <- sf::read_sf(dsn = vars$tmp_gpkg_file, layer = "test_layer_1") pk_attributes <- attributes(test_layer_obj$geom) extent <- sprintf( "%s,%s,%s,%s [EPSG:3301]", round((pk_attributes$bbox["xmin"] / 100), digits = 0) * 100, ceiling((pk_attributes$bbox["xmax"] / 100)) * 100, round((pk_attributes$bbox["ymin"] / 100), digits = 0) * 100, ceiling((pk_attributes$bbox["ymax"] / 100)) * 100 ) hspacing <- (ceiling((pk_attributes$bbox["xmax"] / 100)) * 100) - (round((pk_attributes$bbox["xmin"] / 100), digits = 0) * 100) vspacing <- (ceiling((pk_attributes$bbox["ymax"] / 100)) * 100) - (round((pk_attributes$bbox["ymin"] / 100), digits = 0) * 100) conf$table <- uus_tabel output <- ruut::construct_to_gpkg_output_postgres_str( conf = conf, geometry_field = "geom", geometry_type = NULL, srid = 3301, checkPrimaryKeyUnicity = FALSE, key = "id" ) # ruut::qgis_algorithm_search_by_word(str = "grid") algorithm <- "native:creategrid" # cat(ruut::qgis_show_help(algorithm = algorithm)) cmd <- sprintf( "qgis_process run %s --CRS=\"EPSG:3301\" --EXTENT=\"%s\" --HOVERLAY=0 --HSPACING=%s --TYPE=2 --VOVERLAY=0 --VSPACING=%s --OUTPUT=\"%s\"", algorithm, extent, hspacing, vspacing, output ) cat(sprintf("\n%s\n", cmd)) system(cmd) } ## Layers list conf$schema <- obj ruut::db_schema_tablenames(conf = conf) sf::st_layers(dsn = vars$tmp_gpkg_file) }