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