Skip to content
Snippets Groups Projects
export_gml.R 2.83 KiB
Newer Older

#===== export_gml =====
#'@description Creates a .gml XML document based on  user input data
#'@param gml OGS6_gml:
export_gml <- function(gml, path) {
  gml_xml <- xml2::xml_new_root(
    .value = "OpenGeoSysGLI",
    "xmlns:xsi" = "http://www.w3.org/2001/XMLSchema-instance",
    "xmlns:ogs" = "http://www.opengeosys.org"
    )
  xml2::xml_add_child(gml_xml,
                      xml2::as_xml_document(
                      .copy = FALSE)
  # If the points are in a tibble, coerce it to list for exporting
  points_list <- gml$points
  if(tibble::is_tibble(gml$points)){
    points_list <- setNames(split(gml$points,
                                  seq(nrow(gml$points))),
                            rep("point", nrow(gml$points)))
    points_list <- lapply(points_list, function(x){
      as.list(x)
    })
  # The points need an extra 'id' attribute
  for(i in seq_len(length(points_list))){
    points_list[[i]] <- c(points_list[[i]], id = (i - 1))

    # Remove empty names
    if(points_list[[i]][["name"]] == ""){
      points_list[[i]][["name"]] <- NULL
    }
  }

  xml2::xml_add_child(gml_xml,
                      xml2::as_xml_document(
                        to_node(points_list,
                                "points", c("point"))),
                      .copy = FALSE)
  if(!is.null(gml$polylines)){
    # The polylines need an extra 'id' attribute
    polylines_with_ids <- list()
    for(i in seq_len(length(gml$polylines))){
      polyline <- list(name = gml$polylines[[i]][[1]], id = (i - 1))
      for(j in seq_len(length(gml$polylines[[i]][[2]]))){
        polyline <- c(polyline, list(pnt = gml$polylines[[i]][[2]][[j]]))
      }
      polylines_with_ids <- c(polylines_with_ids, list(polyline = polyline))
    xml2::xml_add_child(gml_xml,
                        xml2::as_xml_document(
                          to_node(polylines_with_ids,
                                  "polylines", c("name",
                                                 "id"))),
                        .copy = FALSE)
  if(!is.null(gml$surfaces)){
    # The surfaces need an extra 'id' attribute
    surfaces_with_ids <- list()
    for(i in seq_len(length(gml$surfaces))){
      surface <- c(gml$surfaces[[i]], list(id = (i - 1)))
      surfaces_with_ids <- c(surfaces_with_ids, list(surface = surface))
    xml2::xml_add_child(gml_xml,
                        xml2::as_xml_document(
                          to_node(surfaces_with_ids,
                                  "surfaces", c("name",
                                                "id",
                                                "element"))),
                        .copy = FALSE)
  file <- paste0(path, gml$name, ".gml")
  xml2::write_xml(gml_xml, file, options = "format", encoding="ISO-8859-1")