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. #' }
  32. maaamet_aadressandmed <- function(conf = NULL) {
  33. ans <- utils::askYesNo("Do you want to import aadressandmed into database?", default = F)
  34. if (!ans | is.na(ans)) {
  35. cat("\n------------------------\n")
  36. cat("Kaardikihte ei lisatud.")
  37. cat("\n------------------------\n")
  38. return()
  39. }
  40. if (ans) {
  41. # Temp directory
  42. tmp_dir <- sprintf("%s/tmp/%s", system.file(package = "estmap"), "maaamet_aadressandmed")
  43. if (!dir.exists(tmp_dir)) {
  44. dir.create(tmp_dir)
  45. }
  46. # Download link
  47. url <- "https://xgis.maaamet.ee/adsavalik/valjav6te/"
  48. # Estonia shapefile (ZIP archive)
  49. map_shapefile <- "aadressandmed.zip"
  50. # Download and save
  51. # Aadressandmete õige lingi tuvastamine
  52. adsavalik <- jsonlite::fromJSON(url)
  53. url_download <- sprintf("%s%s", url, adsavalik$fail[which(adsavalik$vvnr == 1 & is.na(adsavalik$kov))])
  54. saveTo <- sprintf("%s/%s", tmp_dir, map_shapefile)
  55. if (!file.exists(saveTo)) {
  56. utils::download.file(
  57. url = url_download,
  58. destfile = saveTo, method = "curl", extra = "-L"
  59. )
  60. }
  61. # Unzip
  62. utils::unzip(saveTo, overwrite = T, exdir = tmp_dir)
  63. # List of files
  64. ls <- list.files(path = tmp_dir, pattern = ".csv")
  65. ls_long <- list.files(path = tmp_dir, pattern = ".csv", full.names = T)
  66. tbl_names <- unlist(strsplit(x = ls, split = ".csv"))
  67. # Export to postgis
  68. if (is.null(conf)) {
  69. conf <- ruut::get_config()
  70. conf$schema <- "maaamet"
  71. conf$table <- "aadressandmed"
  72. }
  73. # Multi layer: paneme kõik csv failid üheks failiks.
  74. # test <- read.csv(file = "/tmp/maaamet_aadressandmed/1_4022021_01505_3.csv",
  75. # nrows = 10, sep = ";", dec = ",", stringsAsFactors = F)
  76. # test$ADS_KEHTIV <- as.POSIXct(strptime(test$ADS_KEHTIV, "%d.%m.%Y %H:%M:%S"))
  77. #
  78. # write.csv(x = test, file = "/tmp/maaamet_aadressandmed/xxxx.csv", row.names = F)
  79. # testx <- read.csv(file = "/tmp/maaamet_aadressandmed/xxxx.csv", nrows = 10,sep = ",")
  80. # Versioon 1 kokkupakkimisest
  81. # vignette("readr")
  82. # vignette("locales")
  83. dataset <- list.files(
  84. path = tmp_dir,
  85. pattern = "*.csv",
  86. # pattern = "*505*",
  87. full.names = T
  88. ) %>%
  89. purrr::map_df(~ readr::read_csv2(.,
  90. col_types = readr::cols(
  91. TASE3_KOOD = readr::col_character(),
  92. TASE4_KOOD = readr::col_skip(),
  93. TASE4_NIMETUS = readr::col_skip(),
  94. TASE4_NIMETUS_LIIGIGA = readr::col_skip(),
  95. TASE5_KOOD = readr::col_skip(),
  96. TASE5_NIMETUS = readr::col_skip(),
  97. TASE5_NIMETUS_LIIGIGA = readr::col_skip(),
  98. TASE6_KOOD = readr::col_skip(),
  99. TASE6_NIMETUS = readr::col_skip(),
  100. TASE6_NIMETUS_LIIGIGA = readr::col_skip(),
  101. TASE7_KOOD = readr::col_skip(),
  102. TASE7_NIMETUS = readr::col_skip(),
  103. TASE7_NIMETUS_LIIGIGA = readr::col_skip(),
  104. TASE8_KOOD = readr::col_skip(),
  105. TASE8_NIMETUS = readr::col_skip(),
  106. TASE8_NIMETUS_LIIGIGA = readr::col_skip(),
  107. HOONE_OID = readr::col_skip()
  108. ),
  109. skip = 0,
  110. col_names = T,
  111. na = character(),
  112. quote = "\"",
  113. # trim_ws = TRUE,
  114. # n_max = 20,
  115. locale = readr::locale(
  116. date_names = "et", # date_names_langs()
  117. date_format = "%d.%m.%Y %H:%M:%S",
  118. time_format = "%H:%M:%S",
  119. decimal_mark = ",",
  120. grouping_mark = "",
  121. tz = "UTC",
  122. encoding = "ISO-8859-4",
  123. asciify = FALSE
  124. ) # readr::default_locale()
  125. ))
  126. saveTo <- sprintf("%s/%s", tmp_dir, "aadressandmed.csv")
  127. utils::write.csv(dataset, file = saveTo, row.names = F, na = "")
  128. if (file.exists(saveTo)) {
  129. # New schema
  130. ruut::db_create_new_schema(conf = conf)
  131. ## Export to postgis database.
  132. conf$table <- "aadressandmed"
  133. pg <- ruut::construct_ogr2ogr_PG_connect_str()
  134. cmd <- sprintf(
  135. paste0(
  136. "ogr2ogr -f PostgreSQL ",
  137. "%s -lco SCHEMA=%s -lco OVERWRITE=yes -nln \"%s\" \"%s/%s\""
  138. ), pg, conf$schema, conf$table, tmp_dir, "aadressandmed.csv"
  139. )
  140. # cmd <- sprintf(
  141. # paste0(
  142. # "export PGCLIENTENCODING=ISO-8859-4; ",
  143. # "ogr2ogr -overwrite --config PG_USE_COPY YES --config PGCLIENTENCODING ISO-8859-4 -f PostgreSQL ",
  144. # "%s -lco SCHEMA=%s -lco OVERWRITE=yes -skipfailures -nln %s \"%s/%s\""
  145. # ), pg, conf$schema, conf$table, tmp_dir, "aadressandmed.csv"
  146. # )
  147. cat(cmd)
  148. cat("\n")
  149. # -overwrite vs. -append -progress
  150. # -sql ST_Transform(ST_SetSRID(ST_MakePoint(viitepunkt_x::double precision, viitepunkt_y::double precision),3301),4326) as geometry
  151. system(cmd)
  152. # Add geometry column
  153. Sys.sleep(2)
  154. conn <- ruut::db_connect()
  155. # Import source CSV
  156. # q <- sprintf("
  157. # COPY %s.%s FROM '%s/%s' DELIMITER ';' CSV header ENCODING 'utf8';",
  158. # conf$schema, conf$table, tmp_dir, "aadressandmed.csv")
  159. # DBI::dbExecute(conn, q)
  160. q <- sprintf("
  161. -- ALTER TABLE %s.%s DROP COLUMN geometry; \
  162. ALTER TABLE %s.%s ADD geometry 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 geometry =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),4326) 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. }