jueves, 8 de septiembre de 2016

Mapear archivo KML

Con datos de la Secretaría de Energía (SENER) se mapeará una capa de información en formato KML (del acrónimo en inglés Keyhole Markup Language). Los datos corresponden a las zonas en proceso de electrificación.

El código para extraer las coordenadas geográficas, la altitud así como el identificador (ID), es un aporte de Fabio Veronesi (https://www.r-bloggers.com/extract-coordinates-and-other-data-from-kml-in-r/), ligeras modificaciones fueron efectuadas. No obstante como veremos, los datos de la SENER sólo contienen latitud y longitud, la forma de hacerlo es la siguiente.

kml.text <- readLines('SENER.kml')
re <- "<coordinates> *([^<]+?) *<\\/coordinates>"  
coords <- grep(re,kml.text)  
   
re2 <- "src_id:"  
SCR.ID <- grep(re2,kml.text)  
   
re3 <- "<tr><td><b>Name:</b><td>"  
Name <- grep(re3,kml.text)  
   
kml.coordinates <- matrix(0,length(coords),4,dimnames=list(c(),c("ID","LON","LAT","ELEV")))  
kml.names <- matrix(0,length(coords),1)  
   
for(i in 1:length(coords)){  
    sub.coords <- coords[i]  
    temp1 <- gsub("<coordinates>"," ",kml.text[sub.coords])  
    temp2 <- gsub("</coordinates>"," ",temp1)  
    coordinates <- as.numeric(unlist(strsplit(temp2,",")))  
   
    sub.ID <- SCR.ID[i]  
    ID <- as.numeric(gsub("<tr><td><b>src_id:</b><td>"," ",kml.text[sub.ID]))  
   
    sub.Name <- Name[i]  
    NAME <- gsub(paste("<tr><td><b>Name:</b><td>"),"",kml.text[sub.Name])  
   
    kml.coordinates[i,] <- matrix(c(ID,coordinates),ncol=4)  
    kml.names[i,] <- matrix(c(NAME),ncol=1)  
}

Con esta parte del código extraemos la información del archivo KML.

> head(kml.coordinates)
     ID       LON      LAT ELEV
[1,] NA -92.13972 17.18167    0
[2,] NA -91.99667 17.18222    0
[3,] NA -91.20667 16.37694    0
[4,] NA -91.74639 17.03611    0
[5,] NA -92.11972 17.09611    0
[6,] NA -92.80972 17.40472    0

Como vemos, la información proporcionada por la dependencia se limita a las coordenadas geográficas. Por lo que, en este ejemplo, dejaremos la matriz sólo con las columnas que contienen información.

kml.coordinates <- kml.coordinates[,2:3]

El siguiente paso será plotear estas coordenadas, el código empleado es el siguiente:

library(RgoogleMaps)
z0 <- 5                     # zoom
y0 <- 21.525818             # Latitud zero
x0 <- -100.522399           # longitud zero


N <- length(kml.coordinates)
color <- c()                # Inicializo vector
color[1:N] <- 'gray20'

PuebMap  <- GetMap(center= c(y0,x0), zoom=z0, 
             GRAYSCALE = F, size=c(640,640),
             destfile = file.path(tempdir(),"sener.png"),
             maptype = 'terrain', SCALE = 2,)

PlotOnStaticMap(PuebMap)

{PlotOnStaticMap(PuebMap, lat = kml.coordinates[,2], 
                lon = kml.coordinates[,1], cex=1, pch=19,
                destfile = "sener.png", 
                col= color ,
                add=TRUE)};

Esto produce el siguiente mapa:


Esta representación nos permite observar que los procesos de electrificación se están llevando a cabo principalmente en las áreas montañosas.

No hay comentarios.:

Publicar un comentario