Selaa lähdekoodia

UUS ALGUS. GPKG piirkonna kohta käiva funktsiooni loomiine algab siit. 'sellest_alustame_gpkg_loomist'.

Ardo Kubjas 5 vuotta sitten
vanhempi
sitoutus
c472154c5f
1 muutettua tiedostoa jossa 103 lisäystä ja 0 poistoa
  1. 103 0
      gpkg/000_sellest_alustame_gpkg_loomist.R

+ 103 - 0
gpkg/000_sellest_alustame_gpkg_loomist.R

@@ -0,0 +1,103 @@
+#' Uue GPKG  loomine
+#'
+#' 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.
+#'
+#' @param pk Piirkonna geomeetriline joon.
+#' @param obj str Objekti nimi. Edaspidi on oluline ainult see nimi. Piirkonna geomeetrilist joont ei ole vaja lisada.
+#' @param gpkg_home path Salvestatavate GPKG faili asukoht.
+#' @return GPKG andmebaasi loomine koos kihtidega 'piir' ja 'bb' (boundary box, piirikast).
+#' @seealso [sf::st_read()], [sf::write_sf()],[sf::st_transform()]
+#' @keywords GPKG, boundary box, EPSG:3301
+#' @export
+#' @examples
+#' \dontrun{
+#'
+#' # read geojson from string:
+#' geojson_txt <- paste('{"type":"MultiPoint","coordinates":[[658300,6474800],[658300,6475000],[658400,6475100],[658600,6475000],[658600,6474800],[658300,6474800]]}')
+#' x <- sf::read_sf(geojson_txt) %>% sf::st_cast("POLYGON")
+#' sf::st_crs(x) <- 3301
+#' x
+#' sf::st_geometry(x) %>% plot()
+#'
+#' gpkg_home <- "/tmp"
+#' obj <- "marja"
+#'
+#' sp <- sellest_alustame_gpkg_loomist(pk = x, obj = obj, gpkg_home = gpkg_home)
+#' sf::st_geometry(sp) %>% plot()
+#'
+#' # Layers list.
+#' dsn <- sprintf("%s/%s.gpkg", gpkg_home, obj)
+#' sf::st_layers(dsn = dsn)
+#' }
+sellest_alustame_gpkg_loomist <- function(pk = NULL, obj = NULL, gpkg_home = "/tmp") {
+  ## ------------------ test -----------------
+  geojson_txt <- paste('{"type":"MultiPoint","coordinates":[[658300,6474800],[658300,6475000],[658400,6475100],[658600,6475000],[658600,6474800],[658300,6474800]]}')
+  x <- sf::read_sf(geojson_txt) %>% sf::st_cast("POLYGON")
+  sf::st_crs(x) <- 3301
+  sf::st_geometry(x) %>% plot()
+  gpkg_home <- "/home/ardo/aaa/data/gpkg/artiklid/artikkel_210127_valga_matsalu_lahemaa"
+  obj <- "marja"
+  pk <- x
+  ## Konfiguratsiooni muutujale väärtuste omistamine
+  conf <- ruut::get_config()
+  conf$gpkg_home <- gpkg_home
+  conf$gpkg_file <- obj
+
+  ## ----------- argumentide vastavuse kontroll -----------
+  if (is.null(pk) || !sf::st_is_valid(pk)) {
+    cat("\nPalun kontrolli geomeetrilise kujundi õigsust.\n")
+    return(NULL)
+  }
+  if (is.null(obj)) {
+    cat("\nPalun sisesta objekti nimi.\n")
+    return(NULL)
+  }
+  if (!dir.exists(gpkg_home)) {
+    dir.create(gpkg_home)
+    cat(sprintf("\nLoodi kataloog %s.\n", gpkg_home))
+  }
+  ## ------------- muutujad ja teisendused ---------------
+  obj <- gsub(" ", "_", tolower(obj))
+  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")
+
+  ## ------------------- programmi osa -----------------
+  ## 1. Piirjoone salvestamine
+  pk <- sf::st_transform(pk, 3301)
+  # write to gpkg
+  pk <- sf::st_collection_extract(pk, "POLYGON", warn =FALSE)
+  sf::write_sf(pk, dsn = dsn,layer = "piir", driver = "gpkg",fid_column_name = "id", delete_dsn = T) # append = FALSE, delete_layer = T
+  ## 2. Piirikasti salvestamine
+  ## konstrueerime EXTENT, HSPACING ja VSPACING väärtused piirikasti konstrueerimiseks.
+  pk_attributes <- attributes(pk$geometry)
+  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$gpkg_table <- 'bb'
+  output <- ruut::construct_to_gpkg_output_file_str(conf = conf)
+  # ruut::qgis_algorithm_search_by_word(str = "grid")
+  algorithm <- "native:creategrid"
+  # cat(qgisprocess::qgis_show_help(algorithm = algorithm))
+  result <- qgisprocess::qgis_run_algorithm(
+    algorithm = algorithm,
+    CRS = "EPSG:3301",
+    EXTENT = extent,
+    HOVERLAY = 0,
+    HSPACING = hspacing,
+    TYPE = 2,
+    VOVERLAY = 0,
+    VSPACING = vspacing,
+    # OUTPUT = qgisprocess::qgis_tmp_file(ext = ".gpkg")
+    OUTPUT = output
+    # .quiet = TRUE
+  )
+  result
+  bb <- sf::read_sf(dsn = dsn, layer = conf$table)
+  # Test plot.
+  sf::st_geometry(bb) %>% plot(border = 3, lwd = 0.3, col = "#d3fffb")
+  sf::st_geometry(x) %>% plot(add = T, border = 3, lwd = 0.3, col = "#a3fffb")
+  # Layers list
+  sf::st_layers(dsn = dsn)
+}