000_sellest_alustame_gpkg_loomist.R 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #' Uue GPKG loomine
  2. #'
  3. #' Funktsioon loob geopaketi GPKG faili. Tegemist on sqlite andmebaasiga. 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. #' @param pk Piirkonna geomeetriline joon.
  6. #' @param obj str Objekti nimi. Edaspidi on oluline ainult see nimi. Piirkonna geomeetrilist joont ei ole vaja lisada.
  7. #' @param gpkg_home path Salvestatavate GPKG faili asukoht.
  8. #' @return GPKG andmebaasi loomine koos kihtidega 'piir' ja 'bb' (boundary box, piirikast).
  9. #' @seealso [sf::st_read()], [sf::write_sf()],[sf::st_transform()]
  10. #' @keywords GPKG, boundary box, EPSG:3301
  11. #' @export
  12. #' @examples
  13. #' \dontrun{
  14. #'
  15. #' # read geojson from string:
  16. #' geojson_txt <- paste('{"type":"MultiPoint","coordinates":[[658300,6474800],[658300,6475000],[658400,6475100],[658600,6475000],[658600,6474800],[658300,6474800]]}')
  17. #' x <- sf::read_sf(geojson_txt) %>% sf::st_cast("POLYGON")
  18. #' sf::st_crs(x) <- 3301
  19. #' x
  20. #' sf::st_geometry(x) %>% plot()
  21. #'
  22. #' gpkg_home <- "/tmp"
  23. #' obj <- "marja"
  24. #'
  25. #' sp <- sellest_alustame_gpkg_loomist(pk = x, obj = obj, gpkg_home = gpkg_home)
  26. #' sf::st_geometry(sp) %>% plot()
  27. #'
  28. #' # Layers list.
  29. #' dsn <- sprintf("%s/%s.gpkg", gpkg_home, obj)
  30. #' sf::st_layers(dsn = dsn)
  31. #' }
  32. sellest_alustame_gpkg_loomist <- function(pk = NULL, obj = NULL, gpkg_home = "/tmp") {
  33. ## ------------------ test -----------------
  34. geojson_txt <- paste('{"type":"MultiPoint","coordinates":[[658300,6474800],[658300,6475000],[658400,6475100],[658600,6475000],[658600,6474800],[658300,6474800]]}')
  35. x <- sf::read_sf(geojson_txt) %>% sf::st_cast("POLYGON")
  36. sf::st_crs(x) <- 3301
  37. sf::st_geometry(x) %>% plot()
  38. gpkg_home <- "/home/ardo/aaa/data/gpkg/artiklid/artikkel_210127_valga_matsalu_lahemaa"
  39. obj <- "marja"
  40. pk <- x
  41. ## Konfiguratsiooni muutujale väärtuste omistamine
  42. conf <- ruut::get_config()
  43. conf$gpkg_home <- gpkg_home
  44. conf$gpkg_file <- obj
  45. ## ----------- argumentide vastavuse kontroll -----------
  46. if (is.null(pk) || !sf::st_is_valid(pk)) {
  47. cat("\nPalun kontrolli geomeetrilise kujundi õigsust.\n")
  48. return(NULL)
  49. }
  50. if (is.null(obj)) {
  51. cat("\nPalun sisesta objekti nimi.\n")
  52. return(NULL)
  53. }
  54. if (!dir.exists(gpkg_home)) {
  55. dir.create(gpkg_home)
  56. cat(sprintf("\nLoodi kataloog %s.\n", gpkg_home))
  57. }
  58. ## ------------- muutujad ja teisendused ---------------
  59. obj <- gsub(" ", "_", tolower(obj))
  60. dsn <- sprintf("%s/%s.gpkg", gpkg_home, obj)
  61. input_layer_name <- "piir"
  62. input_layer <- sprintf("%s|layername=%s", dsn, input_layer_name)
  63. tmp_gpkg_file <- tempfile(fileext = ".gpkg")
  64. ## ------------------- programmi osa -----------------
  65. ## 1. Piirjoone salvestamine
  66. pk <- sf::st_transform(pk, 3301)
  67. # write to gpkg
  68. pk <- sf::st_collection_extract(pk, "POLYGON", warn =FALSE)
  69. sf::write_sf(pk, dsn = dsn,layer = "piir", driver = "gpkg",fid_column_name = "id", delete_dsn = T) # append = FALSE, delete_layer = T
  70. ## 2. Piirikasti salvestamine
  71. ## konstrueerime EXTENT, HSPACING ja VSPACING väärtused piirikasti konstrueerimiseks.
  72. pk_attributes <- attributes(pk$geometry)
  73. 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)
  74. hspacing <- (ceiling((pk_attributes$bbox["xmax"] / 100)) * 100) - (round((pk_attributes$bbox["xmin"] / 100), digits = 0) * 100)
  75. vspacing <- (ceiling((pk_attributes$bbox["ymax"] / 100)) * 100) - (round((pk_attributes$bbox["ymin"] / 100), digits = 0) * 100)
  76. conf$gpkg_table <- 'bb'
  77. output <- ruut::construct_to_gpkg_output_file_str(conf = conf)
  78. # ruut::qgis_algorithm_search_by_word(str = "grid")
  79. algorithm <- "native:creategrid"
  80. # cat(qgisprocess::qgis_show_help(algorithm = algorithm))
  81. result <- qgisprocess::qgis_run_algorithm(
  82. algorithm = algorithm,
  83. CRS = "EPSG:3301",
  84. EXTENT = extent,
  85. HOVERLAY = 0,
  86. HSPACING = hspacing,
  87. TYPE = 2,
  88. VOVERLAY = 0,
  89. VSPACING = vspacing,
  90. # OUTPUT = qgisprocess::qgis_tmp_file(ext = ".gpkg")
  91. OUTPUT = output
  92. # .quiet = TRUE
  93. )
  94. result
  95. bb <- sf::read_sf(dsn = dsn, layer = conf$table)
  96. # Test plot.
  97. sf::st_geometry(bb) %>% plot(border = 3, lwd = 0.3, col = "#d3fffb")
  98. sf::st_geometry(x) %>% plot(add = T, border = 3, lwd = 0.3, col = "#a3fffb")
  99. # Layers list
  100. sf::st_layers(dsn = dsn)
  101. }