statistika_rahvaarv.R 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #' Statistikaameti REL andmed
  2. #'
  3. #' Source: \url{https://estat.stat.ee/StatistikaKaart/VKR}. Lae sealt käsitsi alla 1x1 km andmestiku shp fail. Andmed salvestatakse postgisi andmebaasi. Schema = 'statistikaamet'. Koniguratsiooni muutmiseks muuda konfiguratsiooni. Muutujate vaikeväärtused on sellised, et ei ole vaja midagi muuta.
  4. #' @param conf A list() of configuration variables. Default values \code{\link[ruut]{get_config}}.
  5. #' @return No output.
  6. #' @seealso [ruut::get_config()], [ruut::copy_shp_to_db()]
  7. #' @keywords postgis, maps, ESRI Shpfile, OSM
  8. #' @export
  9. #' @examples
  10. #' \dontrun{
  11. #'
  12. #' conf <- ruut::get_config()
  13. #' statistika_rahvaarv(conf = conf)
  14. #' }
  15. statistika_rahvaarv <- function(conf = NULL) {
  16. ans <- utils::askYesNo("Do you want to import maps into database?", default = F)
  17. if (!ans | is.na(ans)) {
  18. cat("\n------------------------\n")
  19. cat("Kaardikihte ei lisatud.")
  20. cat("\n------------------------\n")
  21. return()
  22. }
  23. if (ans) {
  24. ## --------------------- muutujad ja teisendused -----------------------------
  25. vars <- ajutised_muutujad(conf = conf)
  26. conf <- vars$conf
  27. # Directory for zip files.
  28. tmp_dir <- sprintf("%s/tmp/%s", system.file(package = "estmap"), "statistika_rahvaarv")
  29. if (!dir.exists(tmp_dir)) {
  30. dir.create(tmp_dir)
  31. }
  32. # Params
  33. # Shp faili nimi kus paikneb rahvaloenduse andmed 1x1 km ruudustike kohta.
  34. params <- "Mehed_ja_naised__Vanuseruhmad_kokku_(Ruudustik_1_x_1_km_2011)"
  35. # Export to postgis
  36. if (is.null(conf)) {
  37. conf <- ruut::get_config()
  38. conf$schema <- "statistikaamet"
  39. }
  40. # New schema
  41. ruut::db_create_new_schema(conf = conf)
  42. # Shapefile (ZIP archive)
  43. map_shapefile <- sprintf("%s.zip", params)
  44. # Download and save
  45. saveTo <- sprintf("%s/%s", tmp_dir, map_shapefile)
  46. # Unzip
  47. utils::unzip(saveTo, overwrite = T, exdir = tmp_dir)
  48. # List of files
  49. ls <- list.files(path = tmp_dir, pattern = ".dbf")
  50. ls_long <- list.files(path = tmp_dir, pattern = ".dbf", full.names = T)
  51. tbl_names <- unlist(strsplit(x = ls, split = ".dbf"))
  52. i <- 1
  53. conf$table <- "rel_1x1km"
  54. source <- sprintf('"%s" "%s"', tmp_dir, tbl_names[i])
  55. ## --------------------- 1.1 Copy shp file to gpkg -------------------------
  56. cmd <- sprintf("ogr2ogr -progress -f GPKG '%s' %s %s -overwrite -nlt %s -lco GEOMETRY_NAME=geom -lco FID=id -nln %s -nlt PROMOTE_TO_MULTI", vars$tmp_gpkg_file, tmp_dir, tbl_names[i], "POLYGON", vars$layer_1)
  57. system(cmd)
  58. cat(sprintf("\n-------------\nLoodi andmebaas '%s' layername=%s.\n", vars$tmp_gpkg_file, vars$layer_1))
  59. ## --------- 1.2 Rahvaarvu väärtuse '<4' asendamine väärtusega 3 -----------
  60. # ruut::qgis_algorithm_search_by_word("calculator")
  61. algorithm <- "native:fieldcalculator"
  62. # ruut::qgis_show_help(algorithm = algorithm)
  63. input <- vars$tmp_gpkg_file_input_1
  64. output <- vars$tmp_gpkg_file_output_2
  65. cmd <- sprintf("qgis_process run %s --FIELD_NAME='rahvaarv' --FIELD_TYPE=1 --FIELD_LENGTH=0 --FIELD_PRECISION=0 --GLOBAL=\"\" --FORMULA='if ( \"VAARTUS\" >= 1000000, 3, \"VAARTUS\")' --INPUT='%s' --OUTPUT='%s' ", algorithm, input, output) # Ma ei tea miks nii töötab, aga muud moodi ei saanud ühe teisendusega tööle. Veider.
  66. system(cmd)
  67. cat(sprintf("\n-------------\nLoodi andmebaas '%s'.\n", output))
  68. ## ------------------- 1.3 Jätame alles vajalikud veerud ---------------------
  69. # ruut::qgis_algorithm_search_by_word("retain")
  70. algorithm <- "native:retainfields"
  71. # ruut::qgis_show_help(algorithm = algorithm)
  72. input <- vars$tmp_gpkg_file_input_2
  73. output <- vars$tmp_gpkg_file_output_3
  74. cmd <- sprintf("qgis_process run %s --FIELDS='VID' --FIELDS='KOOD' --FIELDS='rahvaarv' --INPUT='%s' --OUTPUT='%s' ", algorithm, input, output)
  75. system(cmd)
  76. cat(sprintf("\n-------------\nLoodi andmebaas '%s'.\n", output))
  77. ## ----------- 1.4 Ühendame statistika ruudud oma ruudustikuga -------------
  78. # ruut::qgis_algorithm_search_by_word("Union")
  79. algorithm <- "native:union"
  80. # ruut::qgis_show_help(algorithm = algorithm)
  81. input <- vars$tmp_gpkg_file_input_3
  82. conf$schema <- "maaamet"
  83. conf$table <- "epk2t_grid"
  84. overlay <- ruut::construct_to_gpkg_output_postgres_str(
  85. conf = conf, geometry_type = "Polygon", srid = 3301,
  86. checkPrimaryKeyUnicity = TRUE, key = "id", geometry_field = "geom"
  87. )
  88. output <- vars$tmp_gpkg_file_output_4
  89. str <- sprintf("{ 'INPUT' : '%s', 'OUTPUT' : '%s', 'OVERLAY' : '%s', 'OVERLAY_FIELDS_PREFIX' : '' }", input, output, overlay)
  90. cmd <- ruut::construct_qgis_output_result_to_better_format(str = str, algorithm = algorithm)
  91. system(cmd)
  92. cat(sprintf("\n-------------\nLoodi andmebaas '%s'.\n", output))
  93. ## ------- 1.5 Rahvaarvu väärtuse 'NULL' asendamine väärtusega 0 -----------
  94. # ruut::qgis_algorithm_search_by_word("calculator")
  95. algorithm <- "native:fieldcalculator"
  96. # ruut::qgis_show_help(algorithm = algorithm)
  97. input <- vars$tmp_gpkg_file_input_4
  98. output <- vars$tmp_gpkg_file_output_5
  99. cmd <- sprintf("qgis_process run %s --FIELD_NAME='rahvaarv' --FIELD_TYPE=1 --FIELD_LENGTH=0 --FIELD_PRECISION=0 --GLOBAL=\"\" --FORMULA='if(\"rahvaarv\" , \"rahvaarv\" ,0)' --INPUT='%s' --OUTPUT='%s' ", algorithm, input, output) # Ma ei tea miks nii töötab, aga muud moodi ei saanud ühe teisendusega tööle. Veider.
  100. system(cmd)
  101. cat(sprintf("\n-------------\nLoodi andmebaas '%s'.\n", output))
  102. ## ------------------ 1.6 Copy temp gpkg file to postgis ---------------------
  103. conf$schema <- "statistikaamet"
  104. conf$table <- "rel_1x1km"
  105. PG <- ruut::construct_ogr2ogr_PG_connect_str(conf = conf)
  106. ## Copy shp directly to postgis
  107. # cmd <- sprintf("ogr2ogr -progress --config PG_USE_COPY YES -f PostgreSQL %s -lco DIM=2 %s %s -overwrite -nlt %s -lco GEOMETRY_NAME=geom -lco FID=id -nln %s.%s -nlt PROMOTE_TO_MULTI", PG, tmp_dir, tbl_names[i], "POLYGON", conf$schema, conf$table)
  108. cmd <- sprintf("ogr2ogr -progress --config PG_USE_COPY YES -f PostgreSQL %s -lco DIM=2 %s %s -overwrite -nlt %s -lco GEOMETRY_NAME=geom -lco FID=id -nln %s.%s -nlt PROMOTE_TO_MULTI", PG, vars$tmp_gpkg_file, vars$layer_5, "POLYGON", conf$schema, conf$table)
  109. system(cmd)
  110. cat(sprintf("\n-------------\nLoodi andmebaas '%s'.\n", conf$table))
  111. # Delete unnecessary files.
  112. system(sprintf("find %s -type f -not -name '*.zip' -print0 | xargs -0 rm --", tmp_dir))
  113. }
  114. }