01_piirkonnale_ruudustike_lisamine.R 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #' Piirkonna ruudustike leidmine
  2. #'
  3. #' Etteantud piirkonna geomeetrilise piirjoone ('piir') järele leitakse selle piirkonna EPSG:3301 projektsioonile vastav piirikast ('boundarybox_3301'). Piirikasti järele leitakse selle kastiga kaetud 5x5 km ('epk10t_grid'), 1x1 km ('epk2t_grid') ja 100x100 meetrit ('epk02t_grid') ruudustikud. Samuti leitakse piirkonna piiri sees olevad ja statistilist ning muud infot sisaldavad 5x5 km ('epk10t') ja 1x1 km ('epk2t') sisaldavad ruudu. Andmed salvestatakse GPKG faili kihtidena. Faili nimeks on objekti nimi.
  4. #'
  5. #' @param obj str Objekti nimi.
  6. #' @param pk Piirkonna geomeetriline joon.
  7. #' @param gpkg_home path Salvestatavate GPKG faili asukoht.
  8. #' @param obj_only TRUE/FALSE Kas geomeetriad leitakse ainult objekti või kogu piirikastiga määratud ala jaoks.
  9. #'
  10. #'
  11. piirkonnale_ruudustike_lisamine <- function(obj = NULL, pk = NULL, gpkg_home = "/tmp", obj_only = TRUE) {
  12. if (is.null(pk) || !sf::st_is_valid(pk)) {
  13. cat("\nPalun kontrolli geomeetrilise kujundi õigsust.\n")
  14. return()
  15. }
  16. if (is.null(obj)) {
  17. cat("\nPuudu on objekti nimi.\n")
  18. return()
  19. }
  20. cat(sprintf("\nAlgparameetrid: objekti nimi %s ja GPKG faili kataloog %s\n", obj, gpkg_home))
  21. postgres <- sprintf(
  22. "postgres://dbname=\'%s\' host=%s port=%s user=\'%s\' sslmode=%s password=\'%s\' key=\'fid\' srid=4326 type=Polygon checkPrimaryKeyUnicity=\'1\'",
  23. conf$dbname, conf$host, conf$port, conf$user, conf$sslmode, conf$password
  24. )
  25. dsn <- sprintf("%s/%s.gpkg", gpkg_home, obj)
  26. input_layer_name <- "piir"
  27. input_layer <- sprintf("%s|layername=%s", dsn, input_layer_name)
  28. output_layer_name <- "boundarybox_3301"
  29. tmp_gpkg_file <- tempfile(fileext = ".gpkg")
  30. # write to gpkg
  31. sf::write_sf(pk,
  32. dsn = dsn,
  33. layer = "piir", driver = "gpkg", append = FALSE
  34. )
  35. ## ------------ 2. piirkonna 3301 projektsiooniga piirikast --------------
  36. ## 2.1 Esmalt leiame milliset 500x500 meetri ruutudega on objekt kaetud.
  37. # ruut::qgis_algorithm_search_by_word(str = "grid")
  38. algorithm <- "native:creategrid"
  39. # cat(qgisprocess::qgis_show_help(algorithm = algorithm))
  40. result <- qgisprocess::qgis_run_algorithm(
  41. algorithm = algorithm,
  42. CRS = "EPSG:3301",
  43. # EXTENT = '25.454305528,26.259893095,59.454118579,59.714621582 [EPSG:4326]',
  44. EXTENT = input_layer,
  45. HOVERLAY = 0,
  46. HSPACING = 500,
  47. TYPE = 2,
  48. VOVERLAY = 0,
  49. VSPACING = 500,
  50. OUTPUT = qgisprocess::qgis_tmp_file(ext = ".gpkg")
  51. # .quiet = TRUE
  52. )
  53. result
  54. pk_grid <- sf::read_sf(qgisprocess::qgis_output(result, "OUTPUT"))
  55. # sf::st_geometry(pk_grid) %>% plot()
  56. ## 2.2 Leitud ruutudele leiame piirikasti.
  57. algorithm <- "qgis:minimumboundinggeometry"
  58. # cat(qgisprocess::qgis_show_help(algorithm = algorithm))
  59. result <- qgisprocess::qgis_run_algorithm(
  60. algorithm = algorithm,
  61. FIELD = "",
  62. INPUT = pk_grid,
  63. TYPE = 3,
  64. OUTPUT = tmp_gpkg_file
  65. # .quiet = TRUE
  66. )
  67. result
  68. # pk_grid_bb <- sf::read_sf(qgisprocess::qgis_output(result, "OUTPUT"))
  69. # sf::st_geometry(pk_grid_bb) %>% plot()
  70. # sf::st_geometry(pk) %>% plot(add = T)
  71. system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s -t_srs \"EPSG:3301\"", dsn, tmp_gpkg_file, output_layer_name))
  72. ## ------------- 3. piirkonna epk10t (5x5 km) ruudud --------------------
  73. # 3.1 kogu ruutvõrgustik
  74. ruudud <- c("epk10t_grid", "epk2t_grid", "epk02t_grid")
  75. j <- 4
  76. for (j in 1:length(ruudud)) {
  77. ruut <- ruudud[j]
  78. output_layer_name <- ruut
  79. conf <- ruut::get_config()
  80. pg <- ruut::construct_ogr2ogr_PG_connect_str(conf = conf)
  81. input <- sprintf(
  82. '%s table=\"%s\".\"%s\" (geometry)',
  83. postgres, "maaamet", ruut
  84. )
  85. # ruut::qgis_algorithm_search_by_word(str = "extract")
  86. algorithm <- "native:extractbylocation"
  87. # cat(qgisprocess::qgis_show_help(algorithm = algorithm))
  88. result <- qgisprocess::qgis_run_algorithm(
  89. algorithm = algorithm,
  90. INPUT = input,
  91. INTERSECT = sprintf("%s|layername=%s", dsn, "boundarybox_3301"),
  92. OUTPUT = tmp_gpkg_file,
  93. PREDICATE = c(0, 1)
  94. # .quiet = TRUE
  95. )
  96. result
  97. # assign(ruut, sf::read_sf(qgisprocess::qgis_output(result, "OUTPUT")))
  98. system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s -t_srs \"EPSG:3301\"", dsn, tmp_gpkg_file, output_layer_name))
  99. }
  100. # sf::st_geometry(epk10t_grid) %>% plot(add = T)
  101. # 3.2 ainult piirkonnaga seotud ning informatsiooni sisaldav ruutvõrgustik
  102. ruudud <- c("epk10t", "epk2t")
  103. j <- 4
  104. for (j in 1:length(ruudud)) {
  105. ruut <- ruudud[j]
  106. output_layer_name <- ruut
  107. conf <- ruut::get_config()
  108. # pg <- ruut::construct_ogr2ogr_PG_connect_str(conf = conf)
  109. input <- sprintf(
  110. '%s table=\"%s\".\"%s\" (geometry)',
  111. postgres, "maaamet", ruut
  112. )
  113. # ruut::qgis_algorithm_search_by_word(str = "extract")
  114. algorithm <- "native:extractbylocation"
  115. # cat(qgisprocess::qgis_show_help(algorithm = algorithm))
  116. result <- qgisprocess::qgis_run_algorithm(
  117. algorithm = algorithm,
  118. INPUT = input,
  119. INTERSECT = input_layer,
  120. OUTPUT = tmp_gpkg_file,
  121. PREDICATE = c(0, 1)
  122. # .quiet = TRUE
  123. )
  124. result
  125. # assign(ruut, sf::read_sf(qgisprocess::qgis_output(result, "OUTPUT")))
  126. system(sprintf("ogr2ogr -f GPKG -overwrite %s %s -nln %s -s_srs \"EPSG:4326\" -t_srs \"EPSG:3301\"", dsn, tmp_gpkg_file, output_layer_name))
  127. }
  128. # sf::st_geometry(epk10t) %>% plot(add = T)
  129. ## ---------------------- vaata layer'id ----------------------
  130. # Vaata layer'eid
  131. sf::st_layers(dsn = dsn)
  132. }
  133. # piirkonnale_ruudustike_lisamine(obj = NULL, pk = NULL, gpkg_home = "/tmp")