2017-01-27 2 views
4

Exportation d'un fichier KML à utiliser dans Google Maps. Voici le code à l'exportation (adapté de here):Exportation d'un tableau de données vers Google Maps KML dans R

t_expkml_c <- function(obj, archivo, 
        col_nombre, col_desc, col_color, 
        mapa_colores = "mapa_colores_topaz", 
        mapa_nombre = "Mapa_TSE", mapa_desc = "Mapa Creado por PE de TSE") { 

    # - changes projection 
    if (proj4string(obj)!="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0") { 
    cat("Input SpatialPolygonsDataFrame ",obj," re-projected from ", 
     proj4string(obj)," to WGS84 longlat\n",sep="") 
    assign(obj,spTransform(obj,CRS(" +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"))) 
    } # check projection 

    # opens file 
    kmlFile <- file(archivo, 
        open = "w") 

    # goes through each polygon 
    # usa maptools::kmlPolygon 
    Xout <- sapply(slot(obj, 
         "polygons"), 
       function(x) { 
        maptools::kmlPolygon(x, # Object 
             name = as(obj, "data.frame")[slot(x, "ID"), col_nombre], 
             # name column 
             col = mapa_colores[as.numeric(as(obj, "data.frame")[slot(x, "ID"), col_color])], 
             # color column 
             lwd = 0.5, # stroke 
             border = NA, # borders 
             visibility = TRUE, 
             description = as(obj,"data.frame")[slot(x, "ID"), col_desc], #description (what I need to change) 
        ) 
       } 
) 

    # export polyon out 
    cat(kmlPolygon(kmlname=mapa_nombre, 
       kmldescription=mapa_desc)$header, 
     file = kmlFile, sep="\n") 
    # estilos 
    cat(unlist(Xout["style",]), 
     file = kmlFile, sep="\n") 
    # contenidos 
    cat(unlist(Xout["content",]), 
     file = kmlFile, sep="\n") 
    # footers 
    cat(kmlPolygon()$footer, 
     file = kmlFile, sep="\n") 
    close(kmlFile) # end 
} 

Cela fonctionne bien quand je une seule colonne de la [email protected] data.frame (l'objet est classe SpatialPolygonsDataFrame). Cependant, je veux exporter une table de données plus grande, afin qu'elle puisse apparaître dans la description de la forme de Google Maps.

Par exemple ceci est avec une colonne (l'exportation d'origine); enter image description here

Si je veux ajouter d'autres descripteurs, je modifier le tableau de données dans Google Maps comme ceci:

enter image description here

Mais je veux reproduire ce comportement de l'exportation d'origine dans R. Je essayé de modifier le description paramètre pour ajouter un vecteur un nom de colonne ou même et l'index des noms de colonnes (c("Column2", "Column3") ou 1:2) et j'ai essayé d'ajouter du HTML à la colonne de description (qui ne fonctionne pas lors de la visualisation dans le tableau de données Google Maps dans différentes colonnes évidemment).

Comment puis-je y parvenir?

+0

Légère digression: Comment utilisez-vous la table sur la carte pour remplir la fenêtre d'information? (Je viens de pousser une fonction 'add_kml()' vers la [dev version] (https://github.com/SymbolixAU/googleway) de mon paquet qui va vous permettre de tracer le KML sur une carte depuis R) – SymbolixAU

+0

Et votre lien est brisé – SymbolixAU

Répondre

1

Vous devrez utiliser HTML et concaténer les colonnes ensemble.

sc<- c(103.8259077,1.320045,103.8265944,1.3143817,103.829813,1.3132662, 103.8346624,1.3173421,103.8259077,1.320045) 
polys_coords<-list() 
polys_coords[[1]]<-matrix(sc, byrow=TRUE, ncol=2) 
polys_coords[[2]]<-polys_coords[[1]]+0.05 
polys_coords[[3]]<-polys_coords[[1]]-0.05 
polys_spatial<-SpatialPolygons(
    Srl= list (Polygons(srl=lapply(polys_coords, function(x) Polygon(x)), ID="1"), 
       Polygons(srl=lapply(polys_coords, function(x) Polygon(x-0.01)), ID="2"), 
       Polygons(srl=lapply(polys_coords, function(x) Polygon(x+0.01)), ID="3")) 
) 
proj4string(polys_spatial)<-CRS(" +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0") 
df<-SpatialPolygonsDataFrame(polys_spatial, data.frame(NAME=paste0("Name",1:3), DESCA=paste0("Poly",1:3), DESCB=paste0("Gon",1:3))) 
# NAME DESCA DESCB 
# 1 Name1 Poly1 Gon1 
# 2 Name2 Poly2 Gon2 
# 3 Name3 Poly3 Gon3 

xOut<-sapply([email protected], function(x) kmlPolygon(x, name=as.data.frame(df)[[email protected],"NAME"], 
               description=paste( 
                   sapply(2:3, function(i) { 
                   y<-as.data.frame(df) 
                   paste0("<p><strong>",colnames(y)[i], "</strong>: ", y[[email protected],i],"</p>") }) , 
                   collapse="")) 
) 

xOut[["content",1]][1:5] 
# [1] ""                             
# [2] "<Placemark>"                          
# [3] "<name>Name1</name>"                        
# [4] "<description><![CDATA[<p><strong>DESCA</strong>: Poly1</p><p><strong>DESCB</strong>: Gon1</p>]]></description>" 
# [5] "<styleUrl>#1</styleUrl>" 
xOut[["content",2]][1:5] 
# [1] ""                             
# [2] "<Placemark>"                          
# [3] "<name>Name2</name>"                        
# [4] "<description><![CDATA[<p><strong>DESCA</strong>: Poly2</p><p><strong>DESCB</strong>: Gon2</p>]]></description>" 
# [5] "<styleUrl>#2</styleUrl>"