maaamet_aadressandmed.R 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. #' Maa-ameti aadressandmed
  2. #'
  3. #' Source: \url{https://xgis.maaamet.ee/adsavalik/valjav6te/}. Andmed salvestatakse postgisi andmebaasi. Schema = 'maamet'. Koniguratsiooni muutmiseks muuda konfiguratsiooni. Muutujate vaikeväärtused on sellised, et ei ole vaja midagi muuta. Kehtivad ja ootel olekus aadressiobjektid ning nendega seotud aadressid. Kui objektil on enam kui 1 aadress, siis esineb ta väljavõttes enam kui 1 kord. Samuti esinevad aadressid väljavõttes mitu korda, kui nad on seotud mitme objektiga.
  4. #'
  5. #' ADOB_LIIK:
  6. #' Aadressiobjekti liigid (Kood, Nimetus, UnikInit, taseOrig, register)
  7. #' - MK maakond 1 maaregister
  8. #' - OV omavalitsus 2 maaregister
  9. #' - AY asustusüksus 3 maaregister
  10. #' - LO linnaosa 3 maaregister
  11. #' - VK väikekoht 4 kohanimeregister
  12. #' - LP liikluspind 5 kohanimeregister
  13. #' - CU maaüksus 6,7 maaregister
  14. #' - EE elukondlik hoone 6,7 ehitisregister
  15. #' - ETAKME mitteelukondlik hoone 6,7 ehitisregister
  16. #' - ETAKER eluruum 8 ehitisregister
  17. #' - ADSMR mitteeluruum 8 ehitisregister
  18. #' - ADS
  19. #' @importFrom magrittr %>%
  20. #' @param conf A list() of configuration variables. Default values \code{\link[ruut]{get_config}}.
  21. #' @return No output.
  22. #' @seealso [ruut::get_config()], [ruut::copy_shp_to_db()]
  23. #' @keywords postgis, maps, ESRI Shpfile, OSM
  24. #' @export
  25. #' @examples
  26. #' \dontrun{
  27. #'
  28. #' conf <- ruut::get_config()
  29. #' maaamet_aadressandmed(conf = conf)
  30. #' }
  31. maaamet_aadressandmed <- function(conf = NULL) {
  32. ans <- utils::askYesNo("Do you want to import aadressandmed into database?", default = F)
  33. if (!ans | is.na(ans)) {
  34. cat("\n------------------------\n")
  35. cat("Kaardikihte ei lisatud.")
  36. cat("\n------------------------\n")
  37. return()
  38. }
  39. if (ans) {
  40. # Temp directory
  41. tmp_dir <- sprintf("%s/tmp/%s", system.file(package = "estmap"), "maaamet_aadressandmed")
  42. if (!dir.exists(tmp_dir)) {
  43. dir.create(tmp_dir)
  44. }
  45. # Download link
  46. url <- "https://xgis.maaamet.ee/adsavalik/valjav6te/"
  47. # Estonia shapefile (ZIP archive)
  48. map_shapefile <- "aadressandmed.zip"
  49. # Download and save
  50. # Aadressandmete õige lingi tuvastamine
  51. adsavalik <- jsonlite::fromJSON(url)
  52. url_download <- sprintf("%s%s", url, adsavalik$fail[which(adsavalik$vvnr == 1 & is.na(adsavalik$kov))])
  53. saveTo <- sprintf("%s/%s", tmp_dir, map_shapefile)
  54. if (!file.exists(saveTo)) {
  55. utils::download.file(
  56. url = url_download,
  57. destfile = saveTo, method = "curl", extra = "-L"
  58. )
  59. }
  60. # Unzip
  61. utils::unzip(saveTo, overwrite = T, exdir = tmp_dir)
  62. # List of files
  63. ls <- list.files(path = tmp_dir, pattern = ".csv")
  64. ls_long <- list.files(path = tmp_dir, pattern = ".csv", full.names = T)
  65. tbl_names <- unlist(strsplit(x = ls, split = ".csv"))
  66. # Export to postgis
  67. if (is.null(conf)) {
  68. conf <- ruut::get_config()
  69. conf$schema <- "maaamet"
  70. conf$table <- "aadressandmed"
  71. }
  72. # Multi layer: paneme kõik csv failid üheks failiks.
  73. # test <- read.csv(file = "/tmp/maaamet_aadressandmed/1_4022021_01505_3.csv",
  74. # nrows = 10, sep = ";", dec = ",", stringsAsFactors = F)
  75. # test$ADS_KEHTIV <- as.POSIXct(strptime(test$ADS_KEHTIV, "%d.%m.%Y %H:%M:%S"))
  76. #
  77. # write.csv(x = test, file = "/tmp/maaamet_aadressandmed/xxxx.csv", row.names = F)
  78. # testx <- read.csv(file = "/tmp/maaamet_aadressandmed/xxxx.csv", nrows = 10,sep = ",")
  79. # Versioon 1 kokkupakkimisest
  80. # vignette("readr")
  81. # vignette("locales")
  82. dataset <- list.files(
  83. path = tmp_dir,
  84. pattern = "*.csv",
  85. # pattern = "*505*",
  86. full.names = T
  87. ) %>%
  88. purrr::map_df(~ readr::read_csv2(.,
  89. col_types = readr::cols(
  90. TASE3_KOOD = readr::col_character(),
  91. TASE4_KOOD = readr::col_skip(),
  92. TASE4_NIMETUS = readr::col_skip(),
  93. TASE4_NIMETUS_LIIGIGA = readr::col_skip(),
  94. TASE5_KOOD = readr::col_skip(),
  95. TASE5_NIMETUS = readr::col_skip(),
  96. TASE5_NIMETUS_LIIGIGA = readr::col_skip(),
  97. TASE6_KOOD = readr::col_skip(),
  98. TASE6_NIMETUS = readr::col_skip(),
  99. TASE6_NIMETUS_LIIGIGA = readr::col_skip(),
  100. TASE7_KOOD = readr::col_skip(),
  101. TASE7_NIMETUS = readr::col_skip(),
  102. TASE7_NIMETUS_LIIGIGA = readr::col_skip(),
  103. TASE8_KOOD = readr::col_skip(),
  104. TASE8_NIMETUS = readr::col_skip(),
  105. TASE8_NIMETUS_LIIGIGA = readr::col_skip(),
  106. HOONE_OID = readr::col_skip()
  107. ),
  108. skip = 0,
  109. col_names = T,
  110. na = character(),
  111. quote = "\"",
  112. # trim_ws = TRUE,
  113. # n_max = 20,
  114. locale = readr::locale(
  115. date_names = "et", # date_names_langs()
  116. date_format = "%d.%m.%Y %H:%M:%S",
  117. time_format = "%H:%M:%S",
  118. decimal_mark = ",",
  119. grouping_mark = "",
  120. tz = "UTC",
  121. encoding = "ISO-8859-4",
  122. asciify = FALSE
  123. ) # readr::default_locale()
  124. ))
  125. saveTo <- sprintf("%s/%s", tmp_dir, "aadressandmed.csv")
  126. utils::write.csv(dataset, file = saveTo, row.names = F, na = "")
  127. if (file.exists(saveTo)) {
  128. # New schema
  129. ruut::db_create_new_schema(conf = conf)
  130. ## Export to postgis database.
  131. conf$table <- "aadressandmed"
  132. pg <- ruut::construct_ogr2ogr_PG_connect_str()
  133. cmd <- sprintf(
  134. paste0(
  135. "ogr2ogr -f PostgreSQL ",
  136. "%s -lco SCHEMA=%s -lco OVERWRITE=yes -nln \"%s\" \"%s/%s\""
  137. ), pg, conf$schema, conf$table, tmp_dir, "aadressandmed.csv"
  138. )
  139. # cmd <- sprintf(
  140. # paste0(
  141. # "export PGCLIENTENCODING=ISO-8859-4; ",
  142. # "ogr2ogr -overwrite --config PG_USE_COPY YES --config PGCLIENTENCODING ISO-8859-4 -f PostgreSQL ",
  143. # "%s -lco SCHEMA=%s -lco OVERWRITE=yes -skipfailures -nln %s \"%s/%s\""
  144. # ), pg, conf$schema, conf$table, tmp_dir, "aadressandmed.csv"
  145. # )
  146. cat(cmd)
  147. cat("\n")
  148. # -overwrite vs. -append -progress
  149. # -sql ST_Transform(ST_SetSRID(ST_MakePoint(viitepunkt_x::double precision, viitepunkt_y::double precision),3301),4326) as geom
  150. system(cmd)
  151. # Add geometry column
  152. Sys.sleep(2)
  153. conn <- ruut::db_connect()
  154. # Import source CSV
  155. # q <- sprintf("
  156. # COPY %s.%s FROM '%s/%s' DELIMITER ';' CSV header ENCODING 'utf8';",
  157. # conf$schema, conf$table, tmp_dir, "aadressandmed.csv")
  158. # DBI::dbExecute(conn, q)
  159. q <- sprintf(
  160. "
  161. -- ALTER TABLE %s.%s DROP COLUMN geom; \
  162. ALTER TABLE %s.%s ADD geom geometry DEFAULT NULL; \
  163. UPDATE %s.%s SET viitepunkt_x=NULL where viitepunkt_x=''; \
  164. UPDATE %s.%s SET viitepunkt_y=NULL where viitepunkt_y=''; \
  165. ALTER TABLE %s.%s ALTER COLUMN viitepunkt_x TYPE double precision USING viitepunkt_x::double precision; \
  166. ALTER TABLE %s.%s ALTER COLUMN viitepunkt_y TYPE double precision USING viitepunkt_y::double precision; \
  167. ALTER TABLE %s.%s ALTER COLUMN ads_kehtiv TYPE date USING ads_kehtiv::date;",
  168. conf$schema, conf$table, conf$schema, conf$table,
  169. conf$schema, conf$table, conf$schema, conf$table,
  170. conf$schema, conf$table, conf$schema, conf$table,
  171. conf$schema, conf$table
  172. )
  173. cat(q)
  174. cat("\n")
  175. DBI::dbExecute(conn, q)
  176. # Insert data into geometry
  177. q <- sprintf(
  178. "
  179. UPDATE %s.%s as a SET geom =subquery.geom \
  180. FROM (\
  181. SELECT adob_id, \
  182. ST_Transform(ST_SetSRID(ST_MakePoint(viitepunkt_x::double precision, \
  183. viitepunkt_y::double precision),3301),3301) as geom \
  184. FROM %s.%s a \
  185. ) AS subquery \
  186. WHERE a.adob_id=subquery.adob_id;",
  187. conf$schema, conf$table, conf$schema, conf$table
  188. )
  189. cat(q)
  190. cat("\n")
  191. DBI::dbExecute(conn, q)
  192. # ogr2ogr help.
  193. # system("ogr2ogr --long-usage")
  194. }
  195. # Delete unnecessary files.
  196. system(sprintf("rm -rf %s/*.csv", tmp_dir))
  197. }
  198. }