pk_sellest_alustame_db_loomist.R 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. #' Piirkonna postgis andmebaasi loomine
  2. #'
  3. #' Funktsioon loob piirkonna geojoonest ja nimest postgis andmebaasi. 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. #' @importFrom magrittr %>%
  6. #' @importFrom rlang .data
  7. #' @param pk Piirkonna geomeetriline joon.
  8. #' @param obj str Objekti nimi. Edaspidi on oluline ainult see nimi. Piirkonna geomeetrilist joont ei ole vaja edaspidi lisada.
  9. #' @param conf A list() of configuration variables. Default values \code{\link[ruut]{get_config}}.
  10. #' @return Andmebaasi loomine koos kihtidega 'piir' ja 'bb' (boundary box, piirikast).
  11. #' @seealso [sf::st_read()], [sf::write_sf()],[sf::st_transform()],[ruut::pk_sellest_alustame_db_loomist()],[ruut::pk_lisame_ruudustikud()] ,[ruut::pk_lisame_polygoonid()],[ruut::pk_lisame_jooned()],[ruut::pk_lisame_punktid()],[ruut::pk_teisendame_polygoone()],[ruut::pk_teisendame_jooni()],[ruut::pk_teisendame_punkte()]
  12. #' @keywords postgis, boundary box, EPSG:3301
  13. #' @export
  14. #' @examples
  15. #' \dontrun{
  16. #'
  17. #' # read geojson from string:
  18. #' geojson_txt <- paste('{"type":"MultiPoint","coordinates":[[658300,6474800],
  19. #' [658300,6475000],[658700,6476000],[659600,6475000],[659600,6474800],
  20. #' [658300,6474800]]}')
  21. #' x <- sf::read_sf(geojson_txt) %>% sf::st_cast("POLYGON")
  22. #' sf::st_crs(x) <- 3301
  23. #' x
  24. #' sf::st_geometry(x) %>% graphics::plot()
  25. #'
  26. #' obj <- "marja"
  27. #' pk_sellest_alustame_db_loomist(pk = x, obj = obj)
  28. #'
  29. #' # Layers list.
  30. #' ruut::db_schema_tablenames(conf = conf)
  31. #' }
  32. pk_sellest_alustame_db_loomist <-
  33. function(pk = NULL,
  34. obj = NULL,
  35. conf = NULL) {
  36. ## ----------- argumentide vastavuse kontroll -----------
  37. if (is.null(pk)) {
  38. cat("\nPalun kontrolli geomeetrilise kujundi \u00F%igsust.\n")
  39. # return(NULL)
  40. }
  41. if (is.null(obj)) {
  42. cat("\nPalun sisesta objekti nimi.\n")
  43. # return(NULL)
  44. }
  45. vars <- ajutised_muutujad(pk, obj, conf)
  46. obj <- vars$obj
  47. pk <- vars$pk
  48. conf <- vars$conf
  49. # attributes(pk)$names <- attributes(pk)$sf_column <- "geom"
  50. ## Tabelid mis on juba andmebaasis ja mida ümber ei kirjutata.
  51. olemasolevad_tabelid <- ruut::db_schema_tablenames(conf = conf)
  52. ## --------------------- programmi osa ------------------------
  53. ## 1. Piirjoone salvestamine
  54. ## Kui olemasolev tabel eksisteerib andmebaasis, siis jätame arvutused
  55. ## selle tabeliga vahele.
  56. uus_tabel <- "a00_piir"
  57. if (uus_tabel %in% olemasolevad_tabelid) {
  58. cat(sprintf("\nTabel %s on juba andmebaasis olemas.\n", uus_tabel))
  59. } else {
  60. pk <- sf::st_transform(pk, 3301)
  61. # Write to gpkg and check validity
  62. sf::write_sf(
  63. pk,
  64. dsn = vars$tmp_gpkg_file,
  65. layer = vars$conf$gpkg_table,
  66. driver = "gpkg",
  67. fid_column_name = "fid",
  68. delete_dsn = T
  69. )
  70. # Geomeetria parandamine
  71. # ruut::qgis_algorithm_search_by_word("fix")
  72. algorithm <- "native:fixgeometries"
  73. input <- vars$tmp_gpkg_file_input_1 # ajutine fail
  74. output <- vars$tmp_gpkg_file_output_2 # ajutine fail
  75. str <-
  76. sprintf("{ 'INPUT' : '%s', 'OUTPUT' : '%s' }", input, output)
  77. cmd <-
  78. ruut::construct_qgis_output_result_to_better_format(str = str, algorithm = algorithm)
  79. system(cmd)
  80. ## Multipart to singlepart
  81. # ruut::qgis_algorithm_search_by_word("singlepart")
  82. algorithm <- "native:multiparttosingleparts"
  83. input <- vars$tmp_gpkg_file_input_2 # ajutine fail
  84. output <- vars$tmp_gpkg_file_output_1 # ajutine fail
  85. str <- sprintf("{
  86. 'INPUT' : '%s',
  87. 'OUTPUT' : '%s'
  88. }", input, output)
  89. cmd <-
  90. ruut::construct_qgis_output_result_to_better_format(str = str, algorithm = algorithm)
  91. system(cmd)
  92. # Write to postgis
  93. ruut::db_create_new_schema(conf = conf)
  94. # conn <- ruut::db_connect(conf = conf)
  95. # DBI::dbDisconnect(conn)
  96. # Eemaldame üleliigsed veerud
  97. # ruut::qgis_algorithm_search_by_word("Drop")
  98. algorithm <- "native:deletecolumn"
  99. input <- vars$tmp_gpkg_file_input_1
  100. conf$table <- uus_tabel
  101. output <-
  102. ruut::construct_to_gpkg_output_postgres_str(
  103. conf = conf,
  104. geometry_field = "geom",
  105. geometry_type = "Polygon",
  106. srid = 3301,
  107. checkPrimaryKeyUnicity = FALSE,
  108. key = "id"
  109. )
  110. cmd <-
  111. sprintf(
  112. "qgis_process run %s --COLUMN='fid' --INPUT='%s' --OUTPUT='%s' ",
  113. algorithm,
  114. input,
  115. output
  116. )
  117. system(cmd)
  118. }
  119. ## 2. Piirikasti salvestamine
  120. ## Kui olemasolev tabel eksisteerib andmebaasis, siis jätame arvutused
  121. ## selle tabeliga vahele.
  122. uus_tabel <- "a00_piir_bb"
  123. if (uus_tabel %in% olemasolevad_tabelid) {
  124. cat(sprintf("\nTabel %s on juba andmebaasis olemas.\n", uus_tabel))
  125. } else {
  126. ## konstrueerime EXTENT, HSPACING ja VSPACING väärtused piirikasti konstrueerimiseks.
  127. pk_attributes <- attributes(pk$geom)
  128. extent <-
  129. sprintf(
  130. "%s,%s,%s,%s [EPSG:3301]",
  131. round((pk_attributes$bbox["xmin"] / 100), digits = 0) * 100,
  132. ceiling((pk_attributes$bbox["xmax"] / 100)) * 100,
  133. round((pk_attributes$bbox["ymin"] / 100), digits = 0) * 100,
  134. ceiling((pk_attributes$bbox["ymax"] / 100)) * 100
  135. )
  136. hspacing <-
  137. (ceiling((pk_attributes$bbox["xmax"] / 100)) * 100) - (round((pk_attributes$bbox["xmin"] / 100), digits = 0) * 100)
  138. vspacing <-
  139. (ceiling((pk_attributes$bbox["ymax"] / 100)) * 100) - (round((pk_attributes$bbox["ymin"] / 100), digits = 0) * 100)
  140. conf$table <- uus_tabel
  141. output <-
  142. ruut::construct_to_gpkg_output_postgres_str(
  143. conf = conf,
  144. geometry_field = "geom",
  145. geometry_type = NULL,
  146. srid = 3301,
  147. checkPrimaryKeyUnicity = FALSE,
  148. key = "id"
  149. )
  150. # ruut::qgis_algorithm_search_by_word(str = "grid")
  151. algorithm <- "native:creategrid"
  152. # cat(ruut::qgis_show_help(algorithm = algorithm))
  153. cmd <-
  154. sprintf(
  155. "qgis_process run %s --CRS=\"EPSG:3301\" --EXTENT=\"%s\" --HOVERLAY=0 --HSPACING=%s --TYPE=2 --VOVERLAY=0 --VSPACING=%s --OUTPUT=\"%s\"",
  156. algorithm,
  157. extent,
  158. hspacing,
  159. vspacing,
  160. output
  161. )
  162. cat(sprintf("\n%s\n", cmd))
  163. system(cmd)
  164. }
  165. ## 3. epk2t piirikasti konstrueerimine ja salvestamine s.t kuhu mahuvad sisse
  166. ## meie piirkonna epk2t (1x1km) ruudud.
  167. ## Kui olemasolev tabel eksisteerib andmebaasis, siis jätame arvutused
  168. ## selle tabeliga vahele.
  169. uus_tabel <- "a00_bb2"
  170. if (uus_tabel %in% olemasolevad_tabelid) {
  171. cat(sprintf("\nTabel %s on juba andmebaasis olemas.\n", uus_tabel))
  172. } else {
  173. ## 3.1 Leiame piirikastiga seotud epk2t ruudud
  174. # ruut::qgis_algorithm_search_by_word(str = "extract")
  175. algorithm <- "native:extractbylocation"
  176. # cat(ruut::qgis_show_help(algorithm = algorithm))
  177. conf$table <- "epk2t_grid"
  178. conf$schema <- "maaamet"
  179. input <- ruut::construct_to_gpkg_output_postgres_str(
  180. conf = conf,
  181. geometry_type = "Polygon",
  182. srid = 3301,
  183. checkPrimaryKeyUnicity = TRUE,
  184. key = "id",
  185. geometry_field = "geom"
  186. )
  187. conf$table <- "a00_piir_bb"
  188. conf$schema <- obj
  189. intersect <-
  190. ruut::construct_to_gpkg_output_postgres_str(
  191. conf = conf,
  192. geometry_type = "Polygon",
  193. srid = 3301,
  194. checkPrimaryKeyUnicity = TRUE,
  195. key = "id"
  196. )
  197. output <- vars$tmp_gpkg_file_output_1 # ajutine fail
  198. str <-
  199. sprintf(
  200. "{ 'INPUT' : '%s', 'INTERSECT' : '%s', 'OUTPUT' : '%s', 'PREDICATE' : [5,6] }",
  201. input,
  202. intersect,
  203. output
  204. )
  205. cmd <-
  206. ruut::construct_qgis_output_result_to_better_format(str, algorithm)
  207. system(cmd)
  208. ## 3.2 Ajutise faili abil epk2t piirikasti konstrueerimine
  209. test_layer_obj <-
  210. sf::read_sf(dsn = vars$tmp_gpkg_file, layer = "test_layer_1")
  211. pk_attributes <- attributes(test_layer_obj$geom)
  212. extent <-
  213. sprintf(
  214. "%s,%s,%s,%s [EPSG:3301]",
  215. round((pk_attributes$bbox["xmin"] / 100), digits = 0) * 100,
  216. ceiling((pk_attributes$bbox["xmax"] / 100)) * 100,
  217. round((pk_attributes$bbox["ymin"] / 100), digits = 0) * 100,
  218. ceiling((pk_attributes$bbox["ymax"] / 100)) * 100
  219. )
  220. hspacing <-
  221. (ceiling((pk_attributes$bbox["xmax"] / 100)) * 100) - (round((pk_attributes$bbox["xmin"] / 100), digits = 0) * 100)
  222. vspacing <-
  223. (ceiling((pk_attributes$bbox["ymax"] / 100)) * 100) - (round((pk_attributes$bbox["ymin"] / 100), digits = 0) * 100)
  224. conf$table <- uus_tabel
  225. output <-
  226. ruut::construct_to_gpkg_output_postgres_str(
  227. conf = conf,
  228. geometry_field = "geom",
  229. geometry_type = NULL,
  230. srid = 3301,
  231. checkPrimaryKeyUnicity = FALSE,
  232. key = "id"
  233. )
  234. # ruut::qgis_algorithm_search_by_word(str = "grid")
  235. algorithm <- "native:creategrid"
  236. # cat(ruut::qgis_show_help(algorithm = algorithm))
  237. cmd <-
  238. sprintf(
  239. "qgis_process run %s --CRS=\"EPSG:3301\" --EXTENT=\"%s\" --HOVERLAY=0 --HSPACING=%s --TYPE=2 --VOVERLAY=0 --VSPACING=%s --OUTPUT=\"%s\"",
  240. algorithm,
  241. extent,
  242. hspacing,
  243. vspacing,
  244. output
  245. )
  246. cat(sprintf("\n%s\n", cmd))
  247. system(cmd)
  248. }
  249. ## Layers list
  250. conf$schema <- obj
  251. ruut::db_schema_tablenames(conf = conf)
  252. sf::st_layers(dsn = vars$tmp_gpkg_file)
  253. }