Creación Mapas Buenos Aires


Input inicial - Mapas vectoriales de provincia de Buenos Aires y AMBA

Objetivo - Generar mapas de menor tamaño para que la aplicacion no tenga problemas de eficiencia. - Producir un mapa de Buenos Aires dónde no se diferencien las comunas de CABA. - Obtener los centroides de los departamentos de provincia de Buenos Aires


library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.4.4     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.0
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(stringr)
library(sf)
Warning: package 'sf' was built under R version 4.2.3
Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
# El amba consta de 40 municipios mas ciudad de buenos aires
# fuente: https://www.argentina.gob.ar/dami/centro/amba
# Vamos a hacer una seleccion de amba con menos partidos

# Lista de los partidos que vamos a considerar AMBA incluyendo comunas CABA
amba_reducido_names <- c('Almirante Brown',
                         'Avellaneda',
                         'Berazategui',
                         paste('Comuna', 1:15), # CABA
                         'Esteban Echeverría', 'Escobar', 'Ezeiza',
                         'Florencio Varela',
                         'General San Martín',
                         'Hurlingham',
                         'Ituzaingó',
                         'José C. Paz',
                         'La Matanza',  'Lanús', 'Lomas de Zamora',
                         'Malvinas Argentinas', 'Merlo', 'Moreno', 'Morón',
                         'Quilmes', 'Pilar', 'Presidente Perón',
                         'San Fernando', 'San Isidro', 'San Miguel',
                         'Tigre', 'Tres de Febrero',
                         'Vicente López')

Area Metropolitana de Buenos Aires (AMBA) y Ciudad Autonoma de Buenos Aires (CABA)

# Estos shapefiles fueron extraidos del Instituto Geografico Nacional (IGN)

amba <- st_read("data/inicial/departamentos.shp") |>
  st_zm() |>
  filter(str_detect(NAM, paste(amba_reducido_names, collapse = "|")),
         SAG %in% c('ARBA - Gerencia de Servicios Catastrales',
                    'Direc. de Catastro'))
Reading layer `departamentos' from data source 
  `/Users/florenciadandrea/geocovid_bsas/data/inicial/departamentos.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 529 features and 10 fields
Geometry type: MULTIPOLYGON
Dimension:     XY, XYZ
Bounding box:  xmin: -74 ymin: -90 xmax: -25 ymax: -21.78113
z_range:       zmin: 0 zmax: 0
Geodetic CRS:  WGS 84
# Chequeo el resultado visualmente
amba_reducido <- amba |>
  dplyr::select('partido' = NAM , geometry) |>
  dplyr::filter(partido %in% amba_reducido_names)

ggplot() +
  geom_sf(data = amba_reducido)+
  theme_minimal()

Remuevo poligonos duplicados

# Vemos que San Fernando esta compuesto por dos poligonos,
# Uno es el delta, y deberiamos eliminarlo

ggplot() +
  geom_sf(data = subset(amba_reducido,
                        partido == 'San Fernando'))+
  theme_minimal()

# Lo paso a poligono para eliminar el extra
amba_reducido = st_cast(amba_reducido,"POLYGON")
Warning in st_cast.sf(amba_reducido, "POLYGON"): repeating attributes for all
sub-geometries for which they may not be constant
# Chequeo que se cual quiero eliminar
ggplot() +
  geom_sf(data = amba_reducido$geom[30])+
  theme_minimal()

# Elimino el poligono extra
amba_reducido <- amba_reducido[-30,]

# Archivo vectorial final de AMBA
ggplot() +
  geom_sf(data = amba_reducido)+
  theme_minimal()

Este es el archivo con los poligonos finales seleccionados para AMBA

## guardo el archivo

st_write(amba_reducido, "data/procesada/amba_reducido.gpkg", append = FALSE)
Deleting layer `amba_reducido' using driver `GPKG'
Writing layer `amba_reducido' to data source 
  `data/procesada/amba_reducido.gpkg' using driver `GPKG'
Writing 42 features with 1 fields and geometry type Polygon.

Provincia de Buenos Aires

# Obtengo los poligonos desde el IGN
bsas <- sf::st_read('data/inicial/departamentos.shp') |>
  dplyr::filter(SAG %in% c('Direc. de Catastro', # comunas
                           'ARBA - Gerencia de Servicios Catastrales'), # partidos de baires
                GNA %in% c('Partido', 'Comuna')) |> # elimino prov de san juan
  dplyr::select('partido' = NAM, geometry) |>
  sf::st_zm()
Reading layer `departamentos' from data source 
  `/Users/florenciadandrea/geocovid_bsas/data/inicial/departamentos.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 529 features and 10 fields
Geometry type: MULTIPOLYGON
Dimension:     XY, XYZ
Bounding box:  xmin: -74 ymin: -90 xmax: -25 ymax: -21.78113
z_range:       zmin: 0 zmax: 0
Geodetic CRS:  WGS 84
# Lo paso a poligono para eliminar el extra en San Fernando
bsas = st_cast(bsas,"POLYGON")
Warning in st_cast.sf(bsas, "POLYGON"): repeating attributes for all
sub-geometries for which they may not be constant
# Chequeo el numero de poligono que quiero eliminar
ggplot() +
  geom_sf(data = bsas$geometry[126])+
  theme_minimal()

# Elimino el poligono extra
bsas <- bsas[-126,]

# Mapa final
ggplot() +
  geom_sf(data = bsas)+
  theme_minimal()

# Llamo al archivo bsas_comunas ya que presenta las comunas de CABA
write_sf(bsas, 'data/procesada/bsas_comunas.gpkg')

Unifico las comunas

  # uno las comunas
  caba <-  bsas[grep("Comuna", bsas$partido), ] |>
           st_union()

  # aca podria agregar algun tipo de control de calidad para asegurarme que
  # tengo la cantidad de comunas que son
  # chequear que tenga proyeccion


  # las reemplazo en el dataset por caba
 bsas_caba <-  bsas |>
    slice(-grep("Comuna", bsas$partido)) |>
    rbind(st_sf(
                geometry = caba,
                partido = 'Capital Federal'
    ))



 ggplot() +
        geom_sf(data = subset(bsas_caba,
                              partido == 'Capital Federal')) + 
        theme_minimal()

# Llamo a este archivo bsas ya que no presenta la division interna de CABA
# en comunas
 
write_sf(bsas_caba, 'data/procesada/bsas.gpkg')

Simplifico los poligonos para agilizar la app

bsas_caba <- st_read('data/procesada/bsas.gpkg')
Reading layer `bsas' from data source 
  `/Users/florenciadandrea/geocovid_bsas/data/procesada/bsas.gpkg' 
  using driver `GPKG'
Simple feature collection with 136 features and 1 field
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -63.38597 ymin: -41.03791 xmax: -56.66499 ymax: -33.26185
Geodetic CRS:  WGS 84
# Es posible emplear la funcion st_simplify para esto mismo, pero no conserva
# tan bien la topografia entre los poligonos, es por ello que uso este paquete
# donde se aplica el algoritmo de Visvalingam

library(rmapshaper)
bsas_caba_simple <- rmapshaper::ms_simplify(bsas_caba)

Incluyo coordenadas de la bounding box

Realizo este paso para que sea más sencillo hacer el zoom en el mapa.

# Agrego coordenadas al mapa de BsAs que voy a necesitar
# para hacer zoom en la app


for(i in seq_along(1:nrow(bsas_caba_simple))){
  
  bsas_caba_simple[i, "lat1"] <- sf::st_bbox(bsas_caba_simple[i,])$ymin
  bsas_caba_simple[i,"lat2"] <- sf::st_bbox(bsas_caba_simple[i,])$ymax
  bsas_caba_simple[i, "lng1"] <- sf::st_bbox(bsas_caba_simple[i,])$xmin
  bsas_caba_simple[i, "lng2"] <- sf::st_bbox(bsas_caba_simple[i,])$xmax
  
}

st_write(bsas_caba_simple, "data/procesada/bsas_final.gpkg", append=FALSE)
Deleting layer `bsas_final' using driver `GPKG'
Writing layer `bsas_final' to data source 
  `data/procesada/bsas_final.gpkg' using driver `GPKG'
Writing 136 features with 5 fields and geometry type Polygon.

Calculo de centroides

cent <- bsas_caba_simple |> 
  st_point_on_surface()
Warning: st_point_on_surface assumes attributes are constant over geometries
Warning in st_point_on_surface.sfc(st_geometry(x)): st_point_on_surface may not
give correct results for longitude/latitude data
# guardo el archivo con los vectores de partidos de provincia de Buenos Aires

ggplot() +
  geom_sf(data = bsas_caba)+
  geom_sf(data = cent) +
  theme_minimal()

# Cambio nombres de partidos para evitar problemas al momento de hacer joins
cent[78,'partido'] <- 'Lomas De Zamora'
cent[132,'partido'] <- 'Tres De Febrero'


cent <- cent |>
         # salgo del formato sf: calculo lat y long como variables separadas
          cbind(sf::st_coordinates(cent)) |>
          dplyr::arrange(partido) |> 
          select(-lat1, -lat2, -lng1, -lng2)

# elimino el formato sf
sf::st_geometry(cent) <-  NULL

cent
                               partido         X         Y
1                           25 de Mayo -60.28153 -35.55392
2                           9 de Julio -60.92597 -35.53430
3                        Adolfo Alsina -62.95972 -37.16983
4               Adolfo Gonzales Chaves -60.28791 -37.94044
5                              Alberti -60.28311 -35.02820
6                      Almirante Brown -58.37581 -34.83383
7                            Arrecifes -60.01660 -34.00289
8                           Avellaneda -58.33643 -34.67923
9                             Ayacucho -58.59323 -36.97672
10                                Azul -59.68005 -36.83704
11                        Bahía Blanca -62.18668 -38.59020
12                            Balcarce -58.18939 -37.75310
13                            Baradero -59.44140 -33.90786
14                       Benito Juárez -59.88628 -37.58798
15                         Berazategui -58.14120 -34.84363
16                             Berisso -57.85202 -34.89866
17                             Bolívar -61.15579 -36.29357
18                             Bragado -60.60463 -35.02820
19                            Brandsen -58.23788 -35.19553
20                             Campana -58.88924 -34.15991
21                     Capital Federal -58.43547 -34.61515
22                   Capitán Sarmiento -59.84528 -34.14161
23                      Carlos Casares -61.29527 -35.73349
24                      Carlos Tejedor -62.43390 -35.39224
25                     Carmen de Areco -59.92388 -34.42105
26                            Castelli -57.65124 -36.01938
27                            Cañuelas -58.72227 -35.15660
28                           Chacabuco -60.32958 -34.63540
29                           Chascomús -57.87466 -35.59756
30                           Chivilcoy -59.97838 -34.90887
31                               Colón -61.04032 -33.85050
32                     Coronel Dorrego -61.15382 -38.64395
33                    Coronel Pringles -61.24195 -38.16803
34                      Coronel Suárez -61.91250 -37.54200
35  Coronel de Marina Leonardo Rosales -61.93088 -38.81603
36                            Daireaux -61.94126 -36.61709
37                             Dolores -57.59941 -36.42196
38                            Ensenada -57.97776 -34.84021
39                             Escobar -58.77772 -34.34234
40                  Esteban Echeverría -58.47645 -34.82407
41               Exaltación de la Cruz -59.13155 -34.31044
42                              Ezeiza -58.57336 -34.87375
43                    Florencio Varela -58.25360 -34.88657
44                 Florentino Ameghino -62.41611 -34.88750
45                    General Alvarado -58.06044 -38.20038
46                      General Alvear -60.10413 -36.04127
47                    General Arenales -61.29278 -34.23922
48                    General Belgrano -58.61672 -35.84266
49                       General Guido -57.94733 -36.67494
50              General Juan Madariaga -57.28162 -37.16193
51                   General La Madrid -61.28003 -37.40732
52                   General Las Heras -58.99601 -34.90984
53                     General Lavalle -57.01046 -36.67784
54                         General Paz -58.33569 -35.47546
55                       General Pinto -61.97697 -34.68665
56                  General Pueyrredón -57.78250 -37.97401
57                   General Rodríguez -58.99482 -34.64047
58                    General Viamonte -61.06068 -34.98104
59                    General Villegas -62.99874 -34.87244
60                             Guaminí -62.43702 -36.90480
61                   Hipólito Yrigoyen -61.69276 -36.27273
62                          Hurlingham -58.65275 -34.59981
63                           Ituzaingó -58.68822 -34.64233
64                         José C. Paz -58.78106 -34.50335
65                               Junín -60.96998 -34.54486
66                            La Costa -56.69242 -36.66074
67                          La Matanza -58.63546 -34.77297
68                            La Plata -57.99139 -35.03789
69                               Lanús -58.39866 -34.70293
70                             Laprida -60.64166 -37.49570
71                          Las Flores -59.12327 -36.01897
72                     Leandro N. Alem -61.64284 -34.49384
73                              Lezama -57.93164 -35.86462
74                             Lincoln -61.80579 -35.09365
75                             Lobería -58.68880 -38.07036
76                               Lobos -59.15286 -35.20128
77                     Lomas De Zamora -58.57596 -34.54360
78                     Lomas de Zamora -58.41026 -34.74998
79                               Luján -59.15158 -34.58838
80                           Magdalena -57.62397 -35.18716
81                               Maipú -57.58922 -36.89209
82                 Malvinas Argentinas -58.72082 -34.48464
83                        Mar Chiquita -57.60642 -37.51881
84                          Marcos Paz -58.83455 -34.82132
85                            Mercedes -59.42672 -34.70347
86                               Merlo -58.74705 -34.70788
87                               Monte -58.75188 -35.49808
88                       Monte Hermoso -61.28918 -38.95552
89                              Moreno -58.80228 -34.59624
90                               Morón -58.61937 -34.64628
91                             Navarro -59.39377 -35.02273
92                            Necochea -59.11314 -38.17667
93                           Olavarría -60.71476 -36.85806
94                           Patagones -62.86131 -40.18127
95                             Pehuajó -61.97322 -35.90659
96                          Pellegrini -63.16732 -36.24039
97                                Pila -58.38114 -36.23235
98                               Pilar -58.89737 -34.44171
99                             Pinamar -56.86715 -37.10634
100                   Presidente Perón -58.41364 -34.94209
101                        Punta Indio -57.34538 -35.45684
102                               Puán -63.03783 -38.11116
103                            Quilmes -58.27554 -34.74127
104                            Ramallo -60.03576 -33.58824
105                              Rauch -58.91645 -36.60297
106                          Rivadavia -63.02164 -35.57785
107                              Rojas -60.72242 -34.19580
108                        Roque Pérez -59.21778 -35.52084
109                           Saavedra -62.43006 -37.74616
110                          Saladillo -59.64920 -35.68244
111                         Salliqueló -63.04286 -36.67565
112                              Salto -60.30479 -34.24776
113                San Andrés de Giles -59.47306 -34.42320
114               San Antonio de Areco -59.56440 -34.20744
115                       San Cayetano -59.63009 -38.40343
116                       San Fernando -58.56731 -34.45870
117                         San Isidro -58.53767 -34.48685
118                         San Miguel -58.70184 -34.55303
119                        San Nicolás -60.28747 -33.47246
120                          San Pedro -59.82146 -33.79661
121                        San Vicente -58.42015 -35.08145
122                           Suipacha -59.71374 -34.73507
123                             Tandil -59.18070 -37.33613
124                           Tapalqué -60.22351 -36.36921
125                              Tigre -58.61231 -34.40115
126                           Tordillo -57.22011 -36.41438
127                          Tornquist -62.18618 -38.26284
128                    Trenque Lauquen -62.69757 -36.04662
129                       Tres Arroyos -60.26733 -38.47286
130                    Tres De Febrero -60.58050 -33.86411
131                         Tres Lomas -62.88158 -36.48679
132                    Tres de Febrero -58.56250 -34.60183
133                      Vicente López -58.50640 -34.52899
134                       Villa Gesell -57.06391 -37.36494
135                          Villarino -62.86191 -39.15349
136                             Zárate -59.14666 -34.00438
# guardo los centroides
write.csv(cent, "data/procesada/centroides_mapa.csv")