Jelajahi Sumber

Lisatud 'maaamet_aadressandmed'.

Ardo Kubjas 5 tahun lalu
induk
melakukan
90d00b24fe
3 mengubah file dengan 142 tambahan dan 22 penghapusan
  1. 1 1
      DESCRIPTION
  2. 123 21
      R/maaamet_aadressandmed.R
  3. 18 0
      man/maaamet_aadressandmed.Rd

+ 1 - 1
DESCRIPTION

@@ -12,4 +12,4 @@ Encoding: UTF-8
 LazyData: true
 Roxygen: list(markdown = TRUE)
 RoxygenNote: 7.1.1.9000
-Imports: ruut, qgisprocess, DBI, pool, RPostgreSQL, sf, raster, stars, rgdal, tidyverse, inborutils, rvest, seleniumPipes, rjson, methods, utils, jsonlite, urltools, magrittr, stringr, xml2
+Imports: ruut, qgisprocess, DBI, pool, RPostgreSQL, sf, raster, stars, rgdal, tidyverse, inborutils, rvest, seleniumPipes, rjson, methods, utils, jsonlite, urltools, magrittr, stringr, xml2, purrr, readr

+ 123 - 21
R/maaamet_aadressandmed.R

@@ -1,6 +1,21 @@
 #' Maa-ameti aadressandmed
 #'
 #' 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.
+#'
+#' ADOB_LIIK:
+#' Aadressiobjekti liigid (Kood, Nimetus, UnikInit, taseOrig, register)
+#' - MK	maakond           1	maaregister
+#' - OV	omavalitsus   	  2	maaregister
+#' - AY	asustusüksus    	3	maaregister
+#' - LO	linnaosa    		  3	maaregister
+#' - VK	väikekoht   		  4	kohanimeregister
+#' - LP	liikluspind   	  5	kohanimeregister
+#' - CU	maaüksus		      6,7	maaregister
+#' - EE	elukondlik hoone	6,7	ehitisregister
+#' - ETAKME	mitteelukondlik hoone	6,7	ehitisregister
+#' - ETAKER	eluruum   		8	ehitisregister
+#' - ADSMR	mitteeluruum	8	ehitisregister
+#' - ADS
 #' @param conf A list() of configuration variables. Default values \code{\link[ruut]{get_config}}.
 #' @return No output.
 #' @seealso [ruut::get_config()], [ruut::copy_shp_to_db()]
@@ -13,7 +28,7 @@
 #' ##
 #' ## End(**Not run**)
 maaamet_aadressandmed <- function(conf = NULL) {
-  ans <- utils::askYesNo("Do you want to import maps into database?")
+  ans <- utils::askYesNo("Do you want to import aadressandmed into database? It takes 2 hours!")
   if (!ans) {
     cat("\n------------------------\n")
     cat("Kaardikihte ei lisatud.")
@@ -32,7 +47,7 @@ maaamet_aadressandmed <- function(conf = NULL) {
     # Download and save
     # Aadressandmete õige lingi tuvastamine
     adsavalik <- jsonlite::fromJSON(url)
-    url_download <- sprintf("%s%s",url, adsavalik$fail[which(adsavalik$vvnr==1 & is.na(adsavalik$kov))])
+    url_download <- sprintf("%s%s", url, adsavalik$fail[which(adsavalik$vvnr == 1 & is.na(adsavalik$kov))])
     saveTo <- sprintf("%s/%s", tmp_dir, map_shapefile)
     if (!file.exists(saveTo)) {
       utils::download.file(
@@ -43,33 +58,120 @@ maaamet_aadressandmed <- function(conf = NULL) {
     # Unzip
     utils::unzip(saveTo, overwrite = T, exdir = tmp_dir)
     # List of files
-    ls <- list.files(path = tmp_dir, pattern = ".dbf")
-    ls_long <- list.files(path = tmp_dir, pattern = ".dbf", full.names = T)
-    tbl_names <- unlist(strsplit(x = ls, split = ".dbf"))
+    ls <- list.files(path = tmp_dir, pattern = ".csv")
+    ls_long <- list.files(path = tmp_dir, pattern = ".csv", full.names = T)
+    tbl_names <- unlist(strsplit(x = ls, split = ".csv"))
     # Export to postgis
     if (is.null(conf)) {
       conf <- ruut::get_config()
       conf$schema <- "maaamet"
+      conf$table <- "aadressandmed"
     }
-    # New schema
-    ruut::db_create_new_schema(conf = conf)
-    # Multi layer
-    for (i in 1:length(tbl_names)) {
-      print(tbl_names[i])
-      conf$table <- tbl_names[i]
-      source <- sprintf('"%s" "%s"', tmp_dir, tbl_names[i])
+    # Multi layer: paneme kõik csv failid üheks failiks.
+    # test <- read.csv(file = "/tmp/maaamet_aadressandmed/1_4022021_01505_3.csv",
+    #                  nrows = 10, sep = ";", dec = ",", stringsAsFactors = F)
+    # test$ADS_KEHTIV <- as.POSIXct(strptime(test$ADS_KEHTIV, "%d.%m.%Y %H:%M:%S"))
+    #
+    # write.csv(x = test, file = "/tmp/maaamet_aadressandmed/xxxx.csv", row.names = F)
+    # testx <- read.csv(file = "/tmp/maaamet_aadressandmed/xxxx.csv", nrows = 10,sep = ",")
+
+    # Versioon 1 kokkupakkimisest
+    dataset <- list.files(
+      path = "/tmp/maaamet_aadressandmed",
+      pattern = "*.csv",
+      full.names = T
+    ) %>%
+      purrr::map_df(~ readr::read_csv2(.,
+        skip = 0,
+        col_names = T,
+        na = character(),
+        quote = "\"",
+        # n_max = 100,
+        locale = locale(
+          date_names = "et", # date_names_langs()
+          date_format = "%d.%m.%Y %H:%M:%S",
+          time_format = "%H:%M:%S",
+          decimal_mark = ",",
+          grouping_mark = "",
+          tz = "Europe/Tallinn",
+          encoding = "ISO-8859-4",
+          asciify = FALSE
+        ) # default_locale()
+      ))
+
+    # Versioon 2 kokkupakkimisest
+    # dataset <- do.call("rbind", lapply(ls_long[1:5], FUN = function(files) {
+    #   read.csv(files, sep = ";", dec = ",", stringsAsFactors = F, nrows = 2)
+    # }))
+    saveTo <- sprintf("%s/%s", tmp_dir, "aadressandmed.csv")
+    utils::write.csv(dataset, file = saveTo, row.names = F, na = "")
+
+    if (file.exists(saveTo)) {
+      # New schema
+      ruut::db_create_new_schema(conf = conf)
       ## Export to postgis database.
-      ruut::copy_shp_to_db(
-        dir = tmp_dir, layer = tbl_names[i], conf = conf,
-        id = "fid", crs_source = "EPSG:3301", crs_target = "EPSG:4326",
-        geometry_type = "POINT"
+      conf$table <- "aadressandmed"
+      pg <- ruut::construct_ogr2ogr_PG_connect_str()
+      cmd <- sprintf(
+        paste0(
+          "ogr2ogr -overwrite --config PG_USE_COPY YES -f PostgreSQL ",
+          "%s -lco SCHEMA=%s -lco OVERWRITE=yes -skipfailures -nln %s \"%s/%s\""
+        ), pg, conf$schema, conf$table, tmp_dir, "aadressandmed.csv"
       )
-      cat(sprintf(
-        "\nShp fail %s kopeeriti POSTGIS andmebaasi %s.%s\n\n",
-        ls[i], conf$schema, conf$table
-      ))
+      # cmd <- sprintf(
+      #   paste0(
+      #     "export PGCLIENTENCODING=ISO-8859-4; ",
+      #     "ogr2ogr -overwrite --config PG_USE_COPY YES --config  PGCLIENTENCODING ISO-8859-4 -f PostgreSQL ",
+      #     "%s -lco SCHEMA=%s -lco OVERWRITE=yes -skipfailures -nln %s \"%s/%s\""
+      #   ), pg, conf$schema, conf$table, tmp_dir, "aadressandmed.csv"
+      # )
+      cat(cmd)
+      # -overwrite vs. -append  -progress
+      # -sql ST_Transform(ST_SetSRID(ST_MakePoint(viitepunkt_x::double precision, viitepunkt_y::double precision),3301),4326) as geometry
+      system(cmd)
+      # Add geometry column
+      conn <- ruut::db_connect()
+      # Import source CSV
+      # q <- sprintf("
+      # COPY %s.%s FROM '%s/%s' DELIMITER ';' CSV header ENCODING 'utf8';",
+      #              conf$schema, conf$table, tmp_dir, "aadressandmed.csv")
+      # DBI::dbExecute(conn, q)
+      q <- sprintf(
+        "
+      -- ALTER TABLE %s.%s DROP COLUMN geometry; \
+      ALTER TABLE %s.%s ADD geometry geometry DEFAULT NULL; \
+      UPDATE %s.%s SET viitepunkt_x=NULL where viitepunkt_x=''; \
+      UPDATE %s.%s SET viitepunkt_y=NULL where viitepunkt_y=''; \
+      ALTER TABLE %s.%s ALTER COLUMN viitepunkt_x TYPE double precision USING viitepunkt_x::double precision; \
+      ALTER TABLE %s.%s ALTER COLUMN viitepunkt_y TYPE double precision USING viitepunkt_y::double precision; \
+      ALTER TABLE %s.%s ALTER COLUMN ads_kehtiv TYPE date USING ads_kehtiv::date;",
+        conf$schema, conf$table, conf$schema, conf$table,
+        conf$schema, conf$table, conf$schema, conf$table,
+        conf$schema, conf$table, conf$schema, conf$table,
+        conf$schema, conf$table
+      )
+      cat(q)
+      DBI::dbExecute(conn, q)
+      # Insert data into geometry
+      q <- sprintf(
+        "
+      UPDATE %s.%s as a SET geometry =subquery.geom \
+      FROM (\
+        SELECT adob_id, \
+        ST_Transform(ST_SetSRID(ST_MakePoint(viitepunkt_x::double precision, \
+        viitepunkt_y::double precision),3301),4326) as geom \
+        FROM %s.%s a \
+      ) AS subquery \
+      WHERE a.adob_id=subquery.adob_id;",
+        conf$schema, conf$table, conf$schema, conf$table
+      )
+      cat(q)
+      DBI::dbExecute(conn, q)
+
+      # ogr2ogr help.
+      # system("ogr2ogr --long-usage")
     }
     # Delete temp directory
-    # system(sprintf("rm -rf %s/*", tmp_dir))
+    system(sprintf("rm -rf %s/*.csv", tmp_dir))
   }
 }

+ 18 - 0
man/maaamet_aadressandmed.Rd

@@ -15,6 +15,24 @@ No output.
 \description{
 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.
 }
+\details{
+ADOB_LIIK:
+Aadressiobjekti liigid (Kood, Nimetus, UnikInit, taseOrig, register)
+\itemize{
+\item MK	maakond           1	maaregister
+\item OV	omavalitsus   	  2	maaregister
+\item AY	asustusüksus    	3	maaregister
+\item LO	linnaosa    		  3	maaregister
+\item VK	väikekoht   		  4	kohanimeregister
+\item LP	liikluspind   	  5	kohanimeregister
+\item CU	maaüksus		      6,7	maaregister
+\item EE	elukondlik hoone	6,7	ehitisregister
+\item ETAKME	mitteelukondlik hoone	6,7	ehitisregister
+\item ETAKER	eluruum   		8	ehitisregister
+\item ADSMR	mitteeluruum	8	ehitisregister
+\item ADS
+}
+}
 \examples{
 ## Not run:
 ##