#' Piirkonna polügoonide lisamine #' #' Etteantud piirkonna geomeetrilise piirjoone ('piir') järele leitakse selles piirkonnas ja piirkonna piiriga piirnevad polügoonid (). Osasid polügoone on lõigatud piiriga. #' #' @param obj str Objekti nimi. #' @param pk Piirkonna geomeetriline joon. #' @param gpkg_home path Salvestatavate GPKG faili asukoht. #' @param obj_only TRUE/FALSE Kas geomeetriad leitakse ainult objekti või kogu piirikastiga määratud ala jaoks. #' #' @examples #' \dontrun{ #' #' } piirkonnale_polygoonide_lisamine <- function(obj = NULL, pk = NULL, gpkg_home = "/tmp", obj_only = TRUE) { if (is.null(pk) || !sf::st_is_valid(pk)) { cat("\nPalun kontrolli geomeetrilise kujundi õigsust.\n") return() } if (is.null(obj)) { cat("\nPuudu on objekti nimi.\n") return() } cat(sprintf("\nAlgparameetrid: objekti nimi %s ja GPKG faili kataloog %s\n", obj, gpkg_home)) postgres <- sprintf( "postgres://dbname=\'%s\' host=%s port=%s user=\'%s\' sslmode=%s password=\'%s\' key=\'fid\' srid=4326 type=Polygon checkPrimaryKeyUnicity=\'1\'", conf$dbname, conf$host, conf$port, conf$user, conf$sslmode, conf$password ) dsn <- sprintf("%s/%s.gpkg", gpkg_home, obj) input_layer_name <- "piir" input_layer <- sprintf("%s|layername=%s", dsn, input_layer_name) tmp_gpkg_file <- tempfile(fileext = ".gpkg") ## ----------------- piiri sisse jäävad polügoonid ------------------- ## --------------------------- algandmed ----------------------------- andmed.df <- data.frame("schema" = character(0), "table" = character(0)) andmed.df <- rbind(andmed.df, data.frame("schema" = "osm_shp", "table" = "buildings_a")) # andmed.df <- rbind(andmed.df, data.frame("schema" = "maaamet", "table" = "aadressandmed")) # POINT j <- 1 for (j in 1:nrow(andmed.df)) { output_layer_name <- as.character(andmed.df$table[j]) # ruut::qgis_algorithm_search_by_word(str = "extract") algorithm <- "native:extractbylocation" # cat(qgisprocess::qgis_show_help(algorithm = algorithm)) result <- qgisprocess::qgis_run_algorithm( algorithm = algorithm, INPUT = sprintf( '%s table=\"%s\".\"%s\" (geometry)', postgres, andmed.df$schema[j], andmed.df$table[j] ), INTERSECT = input_layer, OUTPUT = tmp_gpkg_file, PREDICATE = c(0) # c(0, 1) # .quiet = TRUE ) result # assign(as.character(andmed.df$table[j]), sf::read_sf(qgisprocess::qgis_output(result, "OUTPUT"))) system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s -t_srs \"EPSG:3301\"", dsn, tmp_gpkg_file, output_layer_name)) } ## -------------- piiri -30 meetrise puhvri sisse jäävad polügoonid ------------- ## --------------------------------- algandmed --------------------------------- andmed.df <- data.frame("schema" = character(0), "table" = character(0)) # andmed.df <- rbind(andmed.df, data.frame("schema" = "maaamet", "table" = "aadressandmed")) # POINT andmed.df <- rbind(andmed.df, data.frame("schema" = "maaamet", "table" = "asustusyksus")) andmed.df <- rbind(andmed.df, data.frame("schema" = "maaamet", "table" = "shp_katastriyksus")) ## Esmalt leiame piirile uhverjoone. # ruut::qgis_algorithm_search_by_word(str = "buffer") algorithm <- "native:buffer" # cat(qgisprocess::qgis_show_help(algorithm = algorithm)) result <- qgisprocess::qgis_run_algorithm( algorithm = algorithm, DISSOLVE = 0, DISTANCE = -30, END_CAP_STYLE = 2, INPUT = sprintf( "%s|layername=piir", dsn ), JOIN_STYLE = 2, MITER_LIMIT = 2, OUTPUT = tmp_gpkg_file, SEGMENTS = 5 # .quiet = TRUE ) result piir_buffer <- sf::read_sf(qgisprocess::qgis_output(result, "OUTPUT")) # st_geometry(pk) %>% plot() # st_geometry(piir_buffer) %>% plot(add=T, col = 'red') j <- 1 for (j in 1:nrow(andmed.df)) { output_layer_name <- as.character(andmed.df$table[j]) input <- sprintf( '%s table=\"%s\".\"%s\" (geometry)', postgres, andmed.df$schema[j], andmed.df$table[j] ) # ruut::qgis_algorithm_search_by_word(str = "extract") algorithm <- "native:extractbylocation" # cat(qgisprocess::qgis_show_help(algorithm = algorithm)) result <- qgisprocess::qgis_run_algorithm( algorithm = algorithm, INPUT = input, INTERSECT = piir_buffer, OUTPUT = tmp_gpkg_file, PREDICATE = c(0, 1) # .quiet = TRUE ) result # assign(as.character(andmed.df$table[j]), sf::read_sf(qgisprocess::qgis_output(result, "OUTPUT"))) system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s -t_srs \"EPSG:3301\"", dsn, tmp_gpkg_file, output_layer_name)) } ## ----------------- piiriga lõigatud polügoonid ------------------- ## --------------------------- algandmed --------------------------- andmed.df <- data.frame("schema" = character(0), "table" = character(0)) andmed.df <- rbind(andmed.df, data.frame("schema" = "osm_shp", "table" = "landuse_a")) andmed.df <- rbind(andmed.df, data.frame("schema" = "osm_shp", "table" = "water_a")) andmed.df <- rbind(andmed.df, data.frame("schema" = "osm_shp", "table" = "pofw_a")) andmed.df <- rbind(andmed.df, data.frame("schema" = "osm_shp", "table" = "pois_a")) andmed.df <- rbind(andmed.df, data.frame("schema" = "osm_shp", "table" = "natural_a")) j <- 1 for (j in 1:nrow(andmed.df)) { output_layer_name <- as.character(andmed.df$table[j]) input <- sprintf( '%s table=\"%s\".\"%s\" (geometry)', postgres, andmed.df$schema[j], andmed.df$table[j] ) # ruut::qgis_algorithm_search_by_word(str = "intersect") algorithm <- "native:intersection" # cat(qgisprocess::qgis_show_help(algorithm = algorithm)) result <- qgisprocess::qgis_run_algorithm( algorithm = algorithm, INPUT = input, INPUT_FIELDS = "", OVERLAY = sprintf( "%s|layername=piir", dsn ), OVERLAY_FIELDS = "", OVERLAY_FIELDS_PREFIX = "", OUTPUT = tmp_gpkg_file # .quiet = TRUE ) result # assign(as.character(andmed.df$table[j]), sf::read_sf(qgisprocess::qgis_output(result, "OUTPUT"))) system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s -t_srs \"EPSG:3301\"", dsn, tmp_gpkg_file, output_layer_name)) # -------------------- alamkihtide filtreerimine ----------------- ## Maakasutus lahti kirjutada!! if (output_layer_name == "landuse_a") { system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s_forest -t_srs \"EPSG:3301\" -where \"code = '7201'\" ", dsn, tmp_gpkg_file, output_layer_name)) system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s_residential -t_srs \"EPSG:3301\" -where \"code = '7203'\" ", dsn, tmp_gpkg_file, output_layer_name)) system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s_grass -t_srs \"EPSG:3301\" -where \"code = '7218'\" ", dsn, tmp_gpkg_file, output_layer_name)) system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s_park -t_srs \"EPSG:3301\" -where \"code = '7202'\" ", dsn, tmp_gpkg_file, output_layer_name)) system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s_farmland -t_srs \"EPSG:3301\" -where \"code = '7229'\" ", dsn, tmp_gpkg_file, output_layer_name)) system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s_scrub -t_srs \"EPSG:3301\" -where \"code = '7217'\" ", dsn, tmp_gpkg_file, output_layer_name)) system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s_meadow -t_srs \"EPSG:3301\" -where \"code = '7208'\" ", dsn, tmp_gpkg_file, output_layer_name)) system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s_cemetery -t_srs \"EPSG:3301\" -where \"code = '7206'\" ", dsn, tmp_gpkg_file, output_layer_name)) system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s_military -t_srs \"EPSG:3301\" -where \"code = '7213'\" ", dsn, tmp_gpkg_file, output_layer_name)) } } ## ---------------------- vaata layer'id ---------------------- # Vaata layer'eid sf::st_layers(dsn = dsn) } # piirkonnale_polygoonide_lisamine(obj = NULL, pk = NULL, gpkg_home = "/tmp")