pk_sellest_alustame_db_loomist.R 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #' Piirkonna postgis andmebaasi loomine
  2. #'
  3. #' 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.
  4. #'
  5. #' @importFrom magrittr %>%
  6. #' @importFrom rlang .data
  7. #' @param pk Piirkonna geomeetriline joon.
  8. #' @param obj str Objekti nimi. Edaspidi on oluline ainult see nimi. Piirkonna geomeetrilist joont ei ole vaja edaspidi lisada.
  9. #' @param conf A list() of configuration variables. Default values \code{\link[ruut]{get_config}}.
  10. #' @return Andmebaasi loomine koos kihtidega 'piir' ja 'bb' (boundary box, piirikast).
  11. #' @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()]
  12. #' @keywords postgis, boundary box, EPSG:3301
  13. #' @export
  14. #' @examples
  15. #' \dontrun{
  16. #'
  17. #' # read geojson from string:
  18. #' geojson_txt <- paste('{"type":"MultiPoint","coordinates":[[658300,6474800],
  19. #' [658300,6475000],[658700,6476000],[659600,6475000],[659600,6474800],
  20. #' [658300,6474800]]}')
  21. #' x <- sf::read_sf(geojson_txt) %>% sf::st_cast("POLYGON")
  22. #' sf::st_crs(x) <- 3301
  23. #' x
  24. #' sf::st_geometry(x) %>% graphics::plot()
  25. #'
  26. #' obj <- "marja"
  27. #' pk_sellest_alustame_db_loomist(pk = x, obj = obj)
  28. #'
  29. #' # Layers list.
  30. #' ruut::db_schema_tablenames(conf = conf)
  31. #' }
  32. pk_sellest_alustame_db_loomist <- function(pk = NULL, obj = NULL, conf = NULL) {
  33. ## ----------- argumentide vastavuse kontroll -----------
  34. if (is.null(pk) || !sf::st_is_valid(pk)) {
  35. cat("\nPalun kontrolli geomeetrilise kujundi \u00F%igsust.\n")
  36. return(NULL)
  37. }
  38. attributes(pk)$names <- attributes(pk)$sf_column <- "geom"
  39. if (is.null(obj)) {
  40. cat("\nPalun sisesta objekti nimi.\n")
  41. return(NULL)
  42. }
  43. obj <- gsub(" ", "_", tolower(obj))
  44. ## Konfiguratsiooni muutujale väärtuste omistamine, kui seda pole antud.
  45. if (is.null(conf)) {
  46. conf <- ruut::get_config()
  47. conf$table <- obj
  48. }
  49. ## ------------- muutujad ja teisendused ---------------
  50. tmp_dir <- tempdir()
  51. tmp_gpkg_file <- sprintf("%s/%s.gpkg", tmp_dir, obj)
  52. system(sprintf("touch %s", tmp_gpkg_file))
  53. conf$gpkg_home <- tmp_dir
  54. conf$gpkg_file <- obj
  55. conf$gpkg_table <- "test_layer"
  56. tmp_gpkg_file_output <- ruut::construct_to_gpkg_output_file_str(conf = conf, is_input_str = F)
  57. tmp_gpkg_file_input <- ruut::construct_to_gpkg_output_file_str(conf = conf, is_input_str = T)
  58. # write to gpkg
  59. sf::write_sf(pk, dsn = tmp_gpkg_file, layer = "piir", driver = "gpkg", fid_column_name = "id", delete_dsn = T)
  60. # unlink(tmp_gpkg_file)
  61. ## ------------------- programmi osa -----------------
  62. ## 1. Piirjoone salvestamine
  63. pk <- sf::st_transform(pk, 3301)
  64. # write to postgis
  65. conf$schema <- conf$gpkg_file
  66. ruut::db_create_new_schema(conf = conf)
  67. conn <- ruut::db_connect(conf = conf)
  68. sf::write_sf(pk, dsn = conn, layer = c(conf$schema, "piir"), driver = "PostgreSQL", fid_column_name = "id", delete_dsn = F)
  69. ## 2. Piirikasti salvestamine
  70. ## konstrueerime EXTENT, HSPACING ja VSPACING väärtused piirikasti konstrueerimiseks.
  71. pk_attributes <- attributes(pk$geometry)
  72. 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)
  73. hspacing <- (ceiling((pk_attributes$bbox["xmax"] / 100)) * 100) - (round((pk_attributes$bbox["xmin"] / 100), digits = 0) * 100)
  74. vspacing <- (ceiling((pk_attributes$bbox["ymax"] / 100)) * 100) - (round((pk_attributes$bbox["ymin"] / 100), digits = 0) * 100)
  75. conf$table <- "bb"
  76. output <- ruut::construct_to_gpkg_output_postgres_str(conf = conf, geometry_field = "geom", geometry_type = NULL, srid = 3301, checkPrimaryKeyUnicity = FALSE, key = "id")
  77. # ruut::qgis_algorithm_search_by_word(str = "grid")
  78. algorithm <- "native:creategrid"
  79. # cat(ruut::qgis_show_help(algorithm = algorithm))
  80. 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)
  81. cat(sprintf("\n%s\n", cmd))
  82. system(cmd)
  83. ## 3. epk2t piirikasti konstrueerimine ja salvestamine s.t kuhu mahuvad sisse
  84. ## meie piirkonna epk2t (1x1km) ruudud.
  85. ## 3.1 Leiame piirikastiga seotud epk2t ruudud
  86. # str <- "{ 'INPUT' : 'postgres://dbname=\'data\' host=localhost port=6432 user=\'osm\' sslmode=disable password=\'osm\' key=\'id\' srid=3301 type=MultiPolygon checkPrimaryKeyUnicity=\'1\' table=\"maaamet\".\"epk2t_grid\" (geom)', 'INTERSECT' : '/data/gpkg/artiklid/artikkel_210127_valga_matsalu_lahemaa/marja.gpkg|layername=bb', 'OUTPUT' : 'TEMPORARY_OUTPUT', 'PREDICATE' : [5,6] }"
  87. # ruut::qgis_algorithm_search_by_word(str = "extract")
  88. algorithm <- "native:extractbylocation"
  89. # cat(ruut::qgis_show_help(algorithm = algorithm))
  90. conf$table <- "epk2t_grid"
  91. conf$schema <- "maaamet"
  92. input <- ruut::construct_to_gpkg_output_postgres_str(
  93. conf = conf, geometry_type = "Polygon", srid = 3301,
  94. checkPrimaryKeyUnicity = TRUE, key = "id", geometry_field = "geom"
  95. )
  96. conf$table <- "bb"
  97. conf$schema <- obj
  98. intersect <- ruut::construct_to_gpkg_output_postgres_str(conf = conf, geometry_type = "Polygon", srid = 3301, checkPrimaryKeyUnicity = TRUE, key = "id")
  99. output <- tmp_gpkg_file_output # ajutine fail
  100. str <- sprintf("{ 'INPUT' : '%s', 'INTERSECT' : '%s', 'OUTPUT' : '%s', 'PREDICATE' : [5,6] }", input, intersect, output)
  101. cmd <- ruut::construct_qgis_output_result_to_better_format(str, algorithm)
  102. system(cmd)
  103. ## Ajutise faili abil piirikasti konstrueerimine
  104. test_layer_obj <- sf::read_sf(dsn = tmp_gpkg_file, layer = conf$gpkg_table)
  105. pk_attributes <- attributes(test_layer_obj$geom)
  106. 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)
  107. hspacing <- (ceiling((pk_attributes$bbox["xmax"] / 100)) * 100) - (round((pk_attributes$bbox["xmin"] / 100), digits = 0) * 100)
  108. vspacing <- (ceiling((pk_attributes$bbox["ymax"] / 100)) * 100) - (round((pk_attributes$bbox["ymin"] / 100), digits = 0) * 100)
  109. conf$table <- "bb2"
  110. output <- ruut::construct_to_gpkg_output_postgres_str(conf = conf, geometry_field = "geom", geometry_type = NULL, srid = 3301, checkPrimaryKeyUnicity = FALSE, key = "id")
  111. # ruut::qgis_algorithm_search_by_word(str = "grid")
  112. algorithm <- "native:creategrid"
  113. # cat(ruut::qgis_show_help(algorithm = algorithm))
  114. 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)
  115. cat(sprintf("\n%s\n", cmd))
  116. system(cmd)
  117. # Layers list
  118. conf$schema <- obj
  119. ruut::db_schema_tablenames(conf = conf)
  120. sf::st_layers(dsn = tmp_gpkg_file)
  121. }