Los Sistemas de Información Geográfica SIG han hecho que el uso de estas herramientas son cada vez más necesarios y también es posible generar mapas con información territorial general, lo cual facilita el análisis y cierta interpretación de ciertos de temas que así lo requieran.

Coordenadas geográficas de México

México se encuentra en la latitud 23.634501 y longitud -102.552784. Hace parte del continente de América y está ubicado en el hemisferio norte.

Coordenadas Geográficas de México
Coordenas decimales Coordenadas GD Coordenadas GMS
Formato Simple Grados decimales Grados, minutos y segundos
23.634501, -102.552784 23.6345° N 102.5528° O 23°38’4.2’’ N 102°33.167’ O

El Marco Geoestadístico es un sistema diseñado por Instituto Nacional de Estadística y Geografía (INEGI), que permite relacionar la información estadística con el espacio geográfico correspondiente, divide al territorio nacional en áreas de fácil identificación en campo y es adecuado para las actividades de captación de información.

Estas unidades se denominan Áreas Geoestadísticas y son:

  • Estatales (AGEE).
  • Municipales (AGEM).
  • Básicas (AGEB).

Desagregación espacial

Se descarga un archivo .shp del Marco Geoestadístico, 2018 INEGI, que se pueden descargar directamente o se puede correr el algoritmo de descarga.

Este tipo de conjuntos de datos vectoriales se encuentran en formato .shape, compuestos por entidades de tipo punto, línea y área, con proyección cartográfica Cónica Conforme de Lambert (CCL) y datum de referencia ITRF2008.

Estos se componen a su vez de tres archivos con extensión .SHX .SHP y .DBF, en los cuales se almacena información geométrica y alfanumérica; además, en estos conjuntos se incluye el archivo con extensión .PRJ, en el cual están especificados los parámetros del datum y de la proyección.

Los archivos pueden utilizarse con herramientas de software que manejen información vectorial para sistemas de información geográfica. Existe una gran variedad de programas comerciales que pueden gestionar este tipo de información; de igual manera, existen sistemas o programas gratuitos que permiten su visualización, u otro software libre con características avanzadas de SIG (con herramientas de análisis, edición y construcción de mapas).

Índice de marginación

El Índice de Marginación (IM) es una medida sintética de las carencias que padece la población que reside en un determinado territorio. Fue diseñado en la década de los noventa por el Consejo Nacional de Población (CONAPO) y calculado para las entidades federativas y municipios de México con datos del XI Censo General de Población y Vivienda de 1990.

En este contexto, el IM se actualiza con datos de los censos de 2000 y 2010, del conteo de 2005 y de la encuesta intercensal de 2015; se aplicó no sólo a las entidades federativas y municipios, sino también a las localidades y a las áreas geoestadísticas básicas urbanas del país.

Nivel estatal

Se utiliza la función readOGR del paquete rgdal, que extrae automáticamente la información de una fuente de datos OGR y la capa en un objeto vectorial espacial adecuado. Solo puede manejar capas con características de geometría conformables (no mezclas de puntos, líneas o polígonos en una sola capa). Establecerá si la capa de el sistema de referencia espacial tiene tales metadatos.

Se toma como referencia el Marco Geoestadístico, junio 2016, que es producto de la actualización de censos, conteos, encuestas y registros administrativos. Para el 2015, fue la Encuesta Intercensal.

Por otro lado, para hacer más representativo y visual los mapas a nivel estado, se aúna la base de datos del índice de marginación por entidad se encuentra disponible en la página de datos abiertos.

Para unir los datos del shape con el IM se utiliza la función inner_join que devuelve todas las filas de x donde hay valores coincidentes en y, y todas las columnas de x e y. Si hay varias coincidencias entre xe y, se devuelven todas las combinaciones de las coincidencias.

Dado que la estructura de un spdf es un objeto de datos de polígonos espaciales y no presenta la misma estructura que un data.frame, se utiliza la función fortify() del paquete ggfortify que permite convertir un objeto sp a un data.frame.

## [1] "long"  "lat"   "order" "hole"  "piece" "id"    "group" "GME"

La función geom_label_repel() o geom_text_repel del paquete ggrepel se usa en lugar de geom_text() y la extensión permite averiguar cómo etiquetar los puntos de manera que las etiquetas no solapen entre sí.

Para la obtención de los centroides se utiliza la función coordinates del paquete sp recupera las coordenadas espaciales de un objeto. Permitiendo de esta manera encontrar la localización para las etiquetas de cada municipio, utilizando la función geom_label_repel mediante los atributos mapping = aes(x = Longitude, y = Latitude).

Cambiando la estructura de las etiquetas

Nivel municipal

Para poder visualizar el mapa a nivel municipal dentro de conjunto de datos del Marco Geoestadístico Nacional [MGN], donde este conjunto abarca varias capas de datos vectoriales. En particular, para este tipo de ejemplo, se utiliza el de las áreas geoestadísticas municipales.

Se toma como referencia el Marco Geoestadístico, junio 2016, que es producto de la actualización de censos, conteos, encuestas y registros administrativos. Para el 2015, fue la Encuesta Intercensal.

Por otro lado, para hacer más representativo y visual los mapas a nivel municipio, se aúna la base de datos del índice de marginación por municipio se encuentra disponible en la página de datos abiertos. Principalmete se trabaja con el Indice de marginación a nivel munipal 2015.

Se elimina al municipio 23011 Puerto Morelos del estado de Quintana Roo, debido a que no tiene calculado el IM 2015.

##   CVE_MUN CVE_ENT.x        NOM_MUN CVE_ENT.y
## 1   23011        23 Puerto Morelos      <NA>

Un objeto SpatialPolygonsDataFrame tiene como coincidencia un ID predeterminado que comprueba los nombres de las filas del data.frame con los de ID’s de los polígonos. Estos deben de coincidir entre sí y ser únicos (ningún objeto Polygons puede compartir ID); las filas del data.frame se reordenarán si es necesario para que coincidan con los ID de los polígonos.

Para poder empatar las claves geoestadísticas con los ID’s del spdf, se crea la variable CVE_GEO como identificador único dentro del data.frame de shape@data. Se concatena la clave de la entidad CVE_ENT y la clave del municipio CVE_MUN, donde estas variables se encuentran dentro del data.frame del shape y esto permita generar un identificador para unir los datos con el índice de marginación.

spdplyr::filter()

Otra manera de filtrar y quitar los polígonos que no tienen datos, es utilizar las funciones que vienen en el paquete spdplyr::, ya que este tipo de paquete permite manipular los datos para clases ‘sp’ ‘Spatial’. Sin la necesidad de convertir un objeto a un data.frame.

Una vez que se tienen los ID o Claves Geoestadísticas se ligan las variables del IM al shape de municipios.

Casos

No se aprecia muy bien de manera conjunta la estructura de los municipios en la República Mexicana. Por lo que se analizara en 2 casos: un estado y la unión de varios municipios, para esta ocasión se trabajara con la Zona Metropolitana del Valle de México.

El objetivo de estos casos es meramente orientativo y así poder manejar los diferentes tipos de estructuras, funciones y manejo de datos.

centroids.df <- as.data.frame(coordinates(shape_municipios%>%
                                                spdplyr:::filter.Spatial(CVE_GEO != 23011))) %>%
                                                    rename("Longitude" = "V1","Latitude" = "V2")
IM_Municipio<-IM_Municipio %>%
    mutate(etiqueta = gsub("([^ ]+ [^ ]+) ", "\\1\n",.$MUN))
#gsub("( \\S+) ", "\\1\n", x)       # Jota's    
#gsub("([^ ]+ [^ ]+) ", "\\1\n", x) # my idea


q<-fortify(data.frame(IM_Municipio,centroids.df)) %>%
            filter(CVE_ENT == tabla_estados[10]) %>%
  ggplot() + 
    geom_polygon(capas_municipios %>%
                       filter(CVE_ENT == tabla_estados[10]),
                  mapping = aes(x = long, y = lat, group = group,
                                fill = fct_relevel(GM,"Muy alto","Alto","Medio","Bajo","Muy bajo")),
                    color="#625F5E", 
                     size = .15,
                      alpha=0.9) +
       geom_polygon(capas_estados %>% 
                          filter(CVE_ENT == tabla_estados[10]),
                      mapping = aes(x = long, y = lat, group = group),
                        color = "dark grey",
                          fill ="transparent",
                            size = 0.8) +
          geom_label_repel(aes(x = Longitude, y = Latitude, label = etiqueta),
                            force = 0.2,
                              box.padding = 0.2,
                                size = 2.1, 
                                  color = "#000036",
                                    fill = "#EAEAEA", #"transparent",
                                      alpha = 0.7) +
              expand_limits(x = capas_municipios %>%
                                      filter(CVE_ENT == tabla_estados[10]) %>%
                                        select(long), 
                            y = capas_municipios %>%
                                     filter(CVE_ENT == tabla_estados[10]) %>%
                                        select(lat)) + 
                coord_equal() +
                  theme_void() + 
                    theme(plot.margin = unit(c(0, 0, 0 ,0), "cm"),
                          plot.title = element_text(hjust = 0.0, size = 22),
                          plot.subtitle = element_text(size = 12, hjust = 0),
                          plot.caption = element_text(hjust = 0),
                          legend.text = element_text(),      
                          legend.key.size = unit(0.5, "cm"),
                          legend.position = c(1.2, 0.7)) + 
                       scale_fill_brewer(palette = "Blues") + 
                          guides(color = FALSE) 

q + labs(title = "Índice de marginación a nivel municipal, 2015",
          subtitle = paste0(estados[10]),
          fill = "GM",
          caption = "Fuente: Encuesta Intercensal 2015 (INEGI), Índice de marginación por municipio 2015 (CONAPO).")  

Se utiliza la función coordinates del paquete sp que permite localizar los centroides de cada municipio. Permitiendo de esta manera encontrar la localización para las etiquetas de cada municipio y utilizando la función geom_label_repel mediante los atributos mapping = aes(x = Longitude, y = Latitude).

La Zona Metropolitana del Valle de México (por sus siglas, ZMVM), es el área metropolitana formada por la Ciudad de México y por 76 municipios conurbados o aglomerados, uno de ellos en el estado de Hidalgo, los restantes en el estado de México.

La descarga la base de datos con la información de los indicadores de la delimitación de las zonas metropolitanas de México 2015, se encuentra disponible en línea ZMVM_CONAPO.

centroids.df <- as.data.frame(coordinates(shape_estados)) %>%
                      rename("Longitude" = "V1","Latitude" = "V2")
#capas_zmvm<-capas_municipios %>%
             #filter(CVE_MUN %in% ZMVM$CVE_MUN)
capas_zmvm <- left_join(capas_municipios,ZMVM, by = "CVE_MUN") %>%
                 filter(CVE_ENT == c("09","13","15")) %>%
                   mutate(Condicion = ifelse(`ORDEN ZM`== 19,.$GM,""))

tabla<-data.frame(IM_Estado,centroids.df)

ggplot() + 
  geom_polygon(capas_zmvm,
                 mapping = aes(x = long, y = lat, group = group,
                               fill = fct_relevel(Condicion,"Muy alto","Alto","Medio","Bajo","Muy bajo")),
                   color = "dark grey", 
                     size = .15,
                       alpha = 0.9) +
     geom_polygon(capas_estados %>%
                        filter(CVE_ENT == c("09","13","15")),
                    mapping=aes(x = long, y = lat, group = group),
                     color = "black",
                      fill ="transparent",
                        size = 0.6) +
        geom_label_repel(data = data.frame(IM_Estado,centroids.df) %>%
                                  filter(CVE_ENT %in% c("09","13","15")),
                            mapping = aes(label = NOM_ENT , x = Longitude ,y = Latitude),
                             force = 1,
                              box.padding = 0.5,
                               size = 4, 
                                color = "#000036",
                                 fill = "#EAEAEA", #"transparent",
                                  alpha = 0.7) +
             coord_equal() +
               theme_void() + 
                theme(plot.margin = unit(c(0, 0, 0 ,0), "cm"),
                      plot.title = element_text(hjust = 0,size = 18),
                      plot.subtitle = element_text(hjust = 0, size = 12),
                      plot.caption = element_text(hjust = 0),
                      legend.text = element_text(),      
                      legend.key.size = unit(0.5, "cm"),
                      legend.position = c(1.2, 0.7)) +
                  scale_fill_manual(labels = c("Medio","Bajo","Muy bajo"),
                                    breaks = c("Medio","Bajo","Muy bajo"),
                                    values = c("Medio" = brewer.pal(9,'Blues')[5],
                                               "Bajo"= brewer.pal(9,'Blues')[6],
                                               "Muy bajo" = brewer.pal(9,'Blues')[7]),
                                    na.translate = F) +
                    guides(color = FALSE) +
  labs(title = "Índice de marginación a nivel municipal, 2015",
       subtitle = "Zona Metropolitana del Valle de México",
       fill = "GM",
       caption = "Fuente: Encuesta Intercensal 2015 (INEGI), Índice de marginación por municipio 2015 (CONAPO).") 

Nivel localidad

Se toma como referencia el Marco Geoestadístico 2010, Versión 4.3, que contiene la información que se utilizó para las etapas de planeación y levantamiento del Censo de Población y Vivienda 2010.

Otro aspecto que hay que tomar en cuenta es que MGN 2010 Versión 4.3 se integra de archivos digitales en formato shape que representan:

  • 32 Áreas Geoestadísticas Estatales,
  • 2 456 Áreas Geoestadísticas Municipales,
  • 4 201 Polígonos de Localidades Urbanas y
  • 289 235 Localidades Rurales ubicadas de manera puntual (SpatialPoints), con nombres y claves geoestadísticas asociados como atributos y
  • 17 442 Áreas Geoestadísticas Básicas con atributos asociados.

Localidades Urbanas

Las localidades urbanas corresponden a cada una de las localidades que, conforme al último Conteo o Censo de Población y Vivienda, tienen una población igual o mayor a 2 500 habitantes o es cabecera municipal.

En este contexto, el IM se calcula con datos de los censos de 2000 y 2010, del conteo de 2005 y de la encuesta intercensal de 2015; este último se aplicó solamente a las entidades federativas y municipios, por lo que para localidades y a las áreas geoestadísticas básicas urbanas del país, se toma como referencia los levantamientos censales 2000 y 2010.

El índice de marginación 2010

El Índice de marginación a nivel localidad 2010, se encuentra disponibile en línea IML_2010 y el cual está conformado de 107 548 localidades.

Como ya se mencionó anteriormente el MGN 2010, presenta 4 201 Polígonos de Localidades Urbanas y las restantes son Puntos de Localidades Rurales.

Es importante aclarar que las Claves Geoestadísticas [CVE_GEO] son únicas, irrepetibles e intransferibles; cuando se presente alguna actualización que implique su baja, ya no se podrá utilizar y se conservará como un registro histórico. En caso de que se creara una nueva, esta adoptará la clave consecutiva inmediata siguiente, respetando la secuencia que corresponda a la clave de la AGEE, AGEM o Localidad, según el nivel de la información.

Se crea un ID único que se llama CVE_LOC y de esta manera poder unir los datos del shape con el índice de marginación.

Se toma como referencia a el estado de “Aguascalientes”, ya que, si se analizan todas las localidades urbanas dentro del territorio nacional, simplemente se distingue una sucesión de puntos; lo cual no lo hace muy interpretable.

## Clave de la entidad 
ent<-"01" ## Entidad que se quiere analizar
  
limites<-capas_estados%>%
          filter(CVE_ENT == ent) %>%
            summarise(min.x = min(.$long),
                      max.x = max(.$long),
                      min.y = min(.$lat),
                      max.y = max(.$lat))

centroids.df<-as.data.frame(coordinates(shape_localidades)) %>%
                rename("Longitude" = "V1","Latitude" = "V2") %>%
                  mutate(CVE_LOC = shape_localidades@data$CVE_LOC,
                         CVE_ENT = shape_localidades@data$CVE_ENT,
                         CVE_MUN = shape_localidades@data$CVE_MUN,
                         GML = shape_localidades@data$GML)

ggplot() +
  geom_polygon(capas_localidades %>% filter(CVE_ENT == ent),
                mapping = aes(x = long, y = lat, group = group,
                              fill = fct_relevel(GML,"Muy alto","Alto","Medio","Bajo","Muy bajo"))) +
    geom_polygon(capas_municipios %>% filter(CVE_ENT == ent), 
                    mapping = aes(x = long, y = lat, group = group),
                     color = "#858585",
                      fill = "#F7F7F7",
                        size = 0.6) +
      geom_polygon(capas_estados %>% filter(CVE_ENT == ent), 
                     mapping = aes(x = long, y = lat, group = group),
                       color = "black",
                        fill = "transparent",
                          size = 1.5) +
        geom_label_repel(data = centroids.df %>% filter(CVE_ENT == ent),
                            mapping = aes(label = CVE_LOC , x = Longitude ,y = Latitude,
                                          color = fct_relevel(GML,"Muy alto","Alto","Medio","Bajo","Muy bajo")),
                             force = 0.7,
                              box.padding = 0.4,
                               size = 2.5, 
                                 fill = "white",# "transparent",
                                  alpha = 1) +
            coord_cartesian(xlim = c(limites$min.x,limites$max.x),
                            ylim = c(limites$min.y,limites$max.y)) +
              theme_void() + 
                theme(plot.margin = unit(c(0, 0, 0 ,0), "cm"),
                      plot.title = element_text(hjust = 0.2,size = 22),
                      plot.subtitle = element_text(hjust = 0.1,size = 12),
                      plot.caption = element_text(hjust = 0.2),
                      legend.key.size = unit(0.4, "cm"),
                      legend.position = c(0.9, 0.15),
                      legend.background = element_blank()) + 
                   scale_fill_viridis_d() + 
                     scale_color_viridis_d() +
                        guides(color = FALSE) +
  labs(title = "Índice de marginación a nivel localidad, 2010",
       subtitle = "Aguascalientes",
       fill = "GM",
       caption = "Fuente: Censo de Población y Vivienda, 2010 (INEGI), Índice de marginación por localidad, 2010 (CONAPO).")

Localidades Rurales

Las localidades rurales corresponden a cada una de las localidades que, conforme a el último Conteo o Censo de Población y Vivienda, tienen una población menor a 2 500 habitantes y no son cabeceras municipales.

Anteriormente se utilizó la capa POLIGONOS URBANOS; que está conformado por 2 401 polígonos de localidades urbanas. Para este caso se trabaja con puntos de ubicación de localidades rurales.

## Clave de la entidad 
ent<-"01" ## Entidad que se quiere analizar
  
limites<-capas_estados%>%
          filter(CVE_ENT == ent) %>%
            summarise(min.x = min(.$long),
                      max.x = max(.$long),
                      min.y = min(.$lat),
                      max.y = max(.$lat))

centroids.df<-as.data.frame(coordinates(shape_localidades)) %>%
                rename("Longitude" = "V1","Latitude" = "V2") %>%
                  mutate(CVE_LOC = shape_localidades@data$CVE_LOC,
                         CVE_ENT = shape_localidades@data$CVE_ENT,
                         CVE_MUN = shape_localidades@data$CVE_MUN,
                         GML = shape_localidades@data$GML)

ggplot() +
  geom_polygon(capas_localidades %>% filter(CVE_ENT == ent),
                mapping = aes(x = long, y = lat, group = group,
                              fill = fct_relevel(GML,"Muy alto","Alto","Medio","Bajo","Muy bajo"))) +
    geom_polygon(capas_municipios %>% filter(CVE_ENT == ent), 
                    mapping = aes(x = long, y = lat, group = group),
                     color = "#858585",
                      fill = "#F7F7F7",
                        size = 0.6) +
      geom_polygon(capas_estados %>% filter(CVE_ENT == ent), 
                     mapping = aes(x = long, y = lat, group = group),
                       color = "black",
                        fill = "transparent",
                          size = 1.5) +
         geom_point(capas_loc_rurales %>% filter(CVE_ENT == ent),
                     mapping = aes(x = long,y = lat),
                      color = "#8C8C8C",
                        fill = "#BCBCBC",
                         size = 1.2,
                          alpha = 0.8) +
            geom_label_repel(data = centroids.df %>% filter(CVE_ENT == ent),
                              mapping = aes(label = CVE_LOC , x = Longitude ,y = Latitude,
                                            color = fct_relevel(GML,"Muy alto","Alto","Medio","Bajo","Muy bajo")),  
                               force = 0.7,
                                box.padding = 0.4,
                                 size = 2.5, 
                                   fill = "white",# "transparent",
                                    alpha = 1) +
                coord_cartesian(xlim = c(limites$min.x,limites$max.x),
                                ylim = c(limites$min.y,limites$max.y)) +
                  theme_void() + 
                    theme(plot.margin = unit(c(0, 0, 0 ,0), "cm"),
                          plot.title = element_text(hjust=0.2,size = 18),
                          plot.subtitle = element_text(hjust=0.1,size = 12),
                          plot.caption = element_text(hjust = 0.2),
                          legend.key.size = unit(0.4, "cm"),
                          legend.position = c(0.9, 0.16),
                          legend.background = element_blank()) + 
                      scale_fill_viridis_d() + 
                        scale_color_viridis_d() +
                          guides(color = FALSE) +
  labs(title = "Índice de marginación a nivel localidad urbana y rural, 2010",
       subtitle = "Aguascalientes",
       fill = "GM",
       caption = "Fuente: Censo de Población y Vivienda, 2010 (INEGI), Índice de marginación por localidad, 2010 (CONAPO).")

Librerías

Librerías que se usaron en el trabajo

##  [1] "ggfortify"    "ggpubr"       "knitr"        "kableExtra"   "ggrepel"     
##  [6] "RColorBrewer" "readr"        "stringr"      "forcats"      "ggplot2"     
## [11] "rgdal"        "sp"           "foreign"      "dplyr"

Referencias

Delimitación de las zonas metropolitanas de México 2015 | Consejo Nacional de Población | Gobierno | gob.mx. (2016). Retrieved November 8, 2020, from https://www.gob.mx/conapo/documentos/delimitacion-de-las-zonas-metropolitanas-de-mexico-2015

Marco Geoestadístico. (2020). Retrieved November 7, 2020, from https://www.inegi.org.mx/temas/mg/#Descargas

Coordenadas geográficas de México - Latitud y longitud. (2020). Retrieved November 7, 2020, from https://www.geodatos.net/coordenadas/mexico

Creative Commons Licence
This work by Diana Villasana Ocampo is licensed under a Creative Commons Attribution 4.0 International License.