瀏覽代碼

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

Ardo Kubjas 5 年之前
父節點
當前提交
c472154c5f
共有 1 個文件被更改,包括 103 次插入0 次删除
  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)
+}