ソースを参照

Alustatud piirkonnale geomeetriliste andmekihtide lisamist. Failig salvestatakse GPKG forminus. Lisatud 'gpkg_sellest_alustame_gpkg_loomist' ja 'gpkg_piirkonnale_ruudustike_lisamine'.

Ardo Kubjas 5 年 前
コミット
6a7314edae

+ 1 - 1
DESCRIPTION

@@ -12,4 +12,4 @@ Encoding: UTF-8
 LazyData: true
 Roxygen: list(markdown = TRUE)
 RoxygenNote: 7.1.1.9000
-Imports: qgisprocess, DBI, pool, RPostgreSQL, sf, raster, stars, rgdal, tidyverse, inborutils, rvest, seleniumPipes, rjson, methods,jsonlite
+Imports: qgisprocess, DBI, pool, RPostgreSQL, sf, raster, stars, rgdal, tidyverse, inborutils, rvest, seleniumPipes, rjson, methods,jsonlite,magrittr,rlang

+ 4 - 0
NAMESPACE

@@ -16,5 +16,9 @@ export(db_is_shema_exist)
 export(db_schema_tablenames)
 export(db_table_colnames)
 export(get_config)
+export(gpkg_piirkonnale_ruudustike_lisamine)
+export(gpkg_sellest_alustame_gpkg_loomist)
 export(pk_bbox)
 export(qgis_algorithm_search_by_word)
+importFrom(magrittr,"%>%")
+importFrom(rlang,.data)

+ 71 - 0
R/gpkg_piirkonnale_ruudustike_lisamine.R

@@ -0,0 +1,71 @@
+#' Piirkonna ruudustike leidmine
+#'
+#' Etteantud piirkonna geomeetrilise piirjoone ('piir') ja selle joone piirikasti ('bb') järele leitakse nende aladega kaetud 5x5 km ('epk10t_grid'), 1x1 km ('epk2t_grid') ja 100x100 meetrit ('epk02t_grid') ruudustikud. Andmed salvestatakse GPKG faili kihtidena.
+#'
+#' @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 Uute GPKG andmebaasi kihtide 'piir_...' ja 'bb_...' loomine.
+#' @seealso [sf::st_read()], [sf::write_sf()],[sf::st_transform()]
+#' @keywords GPKG, boundary box, EPSG:3301
+#' @export
+#' @examples
+#' \dontrun{
+#'
+#' gpkg_home <- "/tmp"
+#' obj <- "marja"
+#' gpkg_piirkonnale_ruudustike_lisamine(obj = obj, gpkg_home = gpkg_home)
+#'
+#' # Layers list.
+#' dsn <- sprintf("%s/%s.gpkg", gpkg_home, obj)
+#' sf::st_layers(dsn = dsn)
+#' }
+gpkg_piirkonnale_ruudustike_lisamine <- function(obj = NULL, gpkg_home = "/tmp") {
+  dsn <- sprintf("%s/%s.gpkg", gpkg_home, obj)
+  if (!file.exists(dsn)) {
+    cat(sprintf("\nSellist faili \"%s\" ei leitud.\n", dsn))
+    return(NULL)
+  }
+  ## Loeme andmebaasist piiri ja piirikasti.
+  pk <- sf::read_sf(dsn = dsn, layer = "piir")
+  bb <- sf::read_sf(dsn = dsn, layer = "bb")
+  cc <- sf::read_sf(sprintf("%s|layername=%s", dsn, "bb"))
+  ## Konfiguratsiooni muutujale väärtuste omistamine
+  conf <- ruut::get_config()
+  conf$gpkg_home <- gpkg_home
+  conf$gpkg_file <- obj
+  ## epk02t_grid (100x100 meetrit ruudustik)
+  conf$schema <- "maaamet"
+  conf$table <- "epk2t_grid"
+  input <- ruut::construct_to_gpkg_output_postgres_str(conf = conf)
+  # ruut::qgis_algorithm_search_by_word(str = "extract")
+  postgres <- sprintf(
+    "postgres://dbname=\'%s\' host=%s port=%s user=\'%s\' sslmode=%s password=\'%s\' key=\'id\' srid=3301 type=Polygon checkPrimaryKeyUnicity=\'1\' ",
+    conf$dbname, conf$host, conf$port, conf$user, conf$sslmode, conf$password
+  )
+  ## Algorithm
+  algorithm <- "native:extractbylocation"
+  # cat(qgisprocess::qgis_show_help(algorithm = algorithm))
+
+  ## Loop
+  intersect_layers <- c("piir", "bb")
+  ruudud <- c("epk10t_grid", "epk2t_grid", "epk02t_grid", "epk10t", "epk2t")
+  ruudud <- c("epk02t_grid")
+  for (intersect in intersect_layers) {
+    for (ruut in ruudud) {
+      conf$gpkg_table <- sprintf("%s_%s", intersect, ruut)
+      output <- ruut::construct_to_gpkg_output_file_str(conf = conf)
+      result <- qgisprocess::qgis_run_algorithm(
+        algorithm = algorithm,
+        INPUT = sprintf(
+          '%s table=\"%s\".\"%s\" (geom)',
+          postgres, "maaamet", ruut
+        ),
+        INTERSECT = sprintf("/data/gpkg/artiklid/artikkel_210127_valga_matsalu_lahemaa/marja.gpkg|layername=%s", intersect),
+        OUTPUT = output,
+        PREDICATE = c(0)
+      )
+    }
+  }
+  ## Layers list
+  sf::st_layers(dsn = dsn)
+}

+ 106 - 0
R/gpkg_sellest_alustame_gpkg_loomist.R

@@ -0,0 +1,106 @@
+#' 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.
+#'
+#' @importFrom magrittr %>%
+#' @importFrom rlang .data
+#' @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) %>% graphics::plot()
+#'
+#' gpkg_home <- "/tmp"
+#' obj <- "marja"
+#'
+#' sp <- gpkg_sellest_alustame_gpkg_loomist(pk = x, obj = obj, gpkg_home = gpkg_home)
+#' sf::st_geometry(sp) %>% graphics::plot()
+#'
+#' # Layers list.
+#' dsn <- sprintf("%s/%s.gpkg", gpkg_home, obj)
+#' sf::st_layers(dsn = dsn)
+#' }
+gpkg_sellest_alustame_gpkg_loomist <- function(pk = NULL, obj = NULL, gpkg_home = "/tmp") {
+  # ## ------------------ test -----------------
+  # geojson_txt <- paste('{"type":"MultiPoint","coordinates":[[658300,6474800],[658300,6475000],[658700,6476000],[659600,6475000],[659600,6474800],[658300,6474800]]}')
+  # x <- sf::read_sf(geojson_txt) %>% sf::st_cast("POLYGON")
+  # sf::st_crs(x) <- 3301
+  # sf::st_geometry(x) %>% graphics::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 \u00F%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 = output
+    # .quiet = TRUE
+  )
+  result
+  bb <- sf::read_sf(dsn = dsn, layer = conf$table)
+  # Test plot.
+  sf::st_geometry(bb) %>% graphics::plot(border = 3, lwd = 0.3, col = "#d3fffb")
+  sf::st_geometry(pk) %>% graphics::plot(add = T, border = 3, lwd = 0.3, col = "#a3fffb")
+  # Layers list
+  sf::st_layers(dsn = dsn)
+}

+ 38 - 0
man/gpkg_piirkonnale_ruudustike_lisamine.Rd

@@ -0,0 +1,38 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/gpkg_piirkonnale_ruudustike_lisamine.R
+\name{gpkg_piirkonnale_ruudustike_lisamine}
+\alias{gpkg_piirkonnale_ruudustike_lisamine}
+\title{Piirkonna ruudustike leidmine}
+\usage{
+gpkg_piirkonnale_ruudustike_lisamine(obj = NULL, gpkg_home = "/tmp")
+}
+\arguments{
+\item{obj}{str Objekti nimi. Edaspidi on oluline ainult see nimi. Piirkonna geomeetrilist joont ei ole vaja lisada.}
+
+\item{gpkg_home}{path Salvestatavate GPKG faili asukoht.}
+}
+\value{
+Uute GPKG andmebaasi kihtide 'piir_...' ja 'bb_...' loomine.
+}
+\description{
+Etteantud piirkonna geomeetrilise piirjoone ('piir') ja selle joone piirikasti ('bb') järele leitakse nende aladega kaetud 5x5 km ('epk10t_grid'), 1x1 km ('epk2t_grid') ja 100x100 meetrit ('epk02t_grid') ruudustikud. Andmed salvestatakse GPKG faili kihtidena.
+}
+\examples{
+\dontrun{
+
+gpkg_home <- "/tmp"
+obj <- "marja"
+gpkg_piirkonnale_ruudustike_lisamine(obj = obj, gpkg_home = gpkg_home)
+
+# Layers list.
+dsn <- sprintf("\%s/\%s.gpkg", gpkg_home, obj)
+sf::st_layers(dsn = dsn)
+}
+}
+\seealso{
+\code{\link[sf:st_read]{sf::st_read()}}, \code{\link[sf:st_write]{sf::write_sf()}},\code{\link[sf:st_transform]{sf::st_transform()}}
+}
+\keyword{EPSG:3301}
+\keyword{GPKG,}
+\keyword{boundary}
+\keyword{box,}

+ 51 - 0
man/gpkg_sellest_alustame_gpkg_loomist.Rd

@@ -0,0 +1,51 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/gpkg_sellest_alustame_gpkg_loomist.R
+\name{gpkg_sellest_alustame_gpkg_loomist}
+\alias{gpkg_sellest_alustame_gpkg_loomist}
+\title{Uue GPKG  loomine}
+\usage{
+gpkg_sellest_alustame_gpkg_loomist(pk = NULL, obj = NULL, gpkg_home = "/tmp")
+}
+\arguments{
+\item{pk}{Piirkonna geomeetriline joon.}
+
+\item{obj}{str Objekti nimi. Edaspidi on oluline ainult see nimi. Piirkonna geomeetrilist joont ei ole vaja lisada.}
+
+\item{gpkg_home}{path Salvestatavate GPKG faili asukoht.}
+}
+\value{
+GPKG andmebaasi loomine koos kihtidega 'piir' ja 'bb' (boundary box, piirikast).
+}
+\description{
+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.
+}
+\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) \%>\% graphics::plot()
+
+gpkg_home <- "/tmp"
+obj <- "marja"
+
+sp <- gpkg_sellest_alustame_gpkg_loomist(pk = x, obj = obj, gpkg_home = gpkg_home)
+sf::st_geometry(sp) \%>\% graphics::plot()
+
+# Layers list.
+dsn <- sprintf("\%s/\%s.gpkg", gpkg_home, obj)
+sf::st_layers(dsn = dsn)
+}
+}
+\seealso{
+\code{\link[sf:st_read]{sf::st_read()}}, \code{\link[sf:st_write]{sf::write_sf()}},\code{\link[sf:st_transform]{sf::st_transform()}}
+}
+\keyword{EPSG:3301}
+\keyword{GPKG,}
+\keyword{boundary}
+\keyword{box,}