maaamet_aadressandmed.R 7.0 KB

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