Skip to content
Snippets Groups Projects
export_gml.R 2.57 KiB
Newer Older
  • Learn to ignore specific revisions
  • 
    #===== 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)
        })
    
      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")