Comuna 1recibo · red de ciclovías
El universo
Obra · análisis de red

Ciclovías de la Ciudad: cuánto se tarda, qué verde queda cerca y hasta dónde se llega

Con las 2.764 ciclovías publicadas por el Gobierno de la Ciudad se armó una red ruteable y se contestaron tres preguntas de comuna. Abajo está el recibo: la llamada exacta y la función exacta que produjo cada número, quién la corrió, contra qué pliego, con qué licencia y qué parte de esto puede correr en el navegador de un vecino.

4 herramientas corridas de punta a punta datos abiertos del GCBA · CC-BY-2.5-AR corrida del 15 de agosto de 2026 todavía no aprobada por un humano

Este resultado se puede rehacer, número por número

Nada de esto es una caja negra. Cada cifra de abajo trae la línea de R que la calculó, el nombre de la función, su versión, su licencia y su documentación oficial — y la ficha se abre acá adentro, sin salir de esta página.

Los números y con qué se calculó cada uno

Cada cifra trae la línea de R que la produjo, copiable, tal como está en el script. Tocá cualquier función y se abre su ficha completa acá abajo: para qué sirve, cómo se llama, qué argumentos toma, qué versión y qué licencia. Las fichas se le piden al diccionario de funciones de R al abrir esta página, una consulta por función, y quedan guardadas para cuando las abrís. Lo único escrito por nosotros es la glosa en castellano: va rotulada como tal dentro de cada ficha.

Las tres distancias por ciclovía, comparadas

Los tres valores salen de la misma matriz origen-destino de la salida cruda de abajo. Se dibujan para que se vea lo que el número solo no muestra: que ir del Obelisco a Lezama es más corto que ir al Centenario, aunque en el mapa Lezama parezca más lejos.

Saliendo del Obelisco · comparables entre sí

  • al Parque Lezama3.895 m
  • al Parque Centenario6.009 m

Entre parques · otro origen, no entra en el ranking de arriba

  • Parque Centenario → Parque Lezama9.024 m

0 mescala común a las tres barras9.024 m

Anchos proporcionales al mayor de los tres (9.024 m). Las dos primeras salen del mismo origen y por eso se pueden comparar; la tercera va rayada y aparte porque sale de otro punto y compararla con las de arriba no querría decir nada. Los tres valores están en la matriz de la salida cruda, sin redondeo nuestro.

El andamiaje (no produce cifras, pero está en la corrida)

Estas funciones ordenan los datos y publican las herramientas. Están en el recibo porque también forman parte de lo que se ejecutó.

Ver la salida cruda de la corrida, tal como la escribió R
== 1. construir_red (toda la ciudad) ==
Red construida: 2505 nodos, 2613 tramos, 286.8 km de ciclovia (componente conexa mayor, EPSG:32721).
== 2. matriz_od Obelisco / Pque Centenario / Pque Lezama ==
Matriz OD en metros por ciclovia (origenes x destinos):
     [,1] [,2] [,3]
[1,]    0 6009 3895
[2,] 6009    0 9024
[3,] 3895 9024    0
== 3. instalacion_mas_cercana desde el Obelisco ==
Paquita Bernardo: 0 m por ciclovia
La Cumparsita: 0 m por ciclovia
Plaza De La Republica: 91 m por ciclovia
== 4. area_servicio 2000 m desde el Obelisco ==
Area de servicio a 2000 m por red: 197 nodos alcanzables, poligono de 573.1 ha.
== tiempo total: 29.8 s ==

Corrida el 15 de agosto de 2026 en el servidor de la sección con Rscript prueba-directa.R — 29,8 segundos de punta a punta, sin errores en la salida de error. Los tres orígenes son Obelisco (−58,3816 / −34,6037), Parque Centenario (−58,4358 / −34,6064) y Parque Lezama (−58,3697 / −34,6280). El script completo está en Cómo rehacerlo.

Quién lo hizo

La obra no es anónima. Tiene una sección responsable, con nombre propio y dirección permanente en el registro público de ANS.

La sección responsable

ans://…

Consultando el registro público…

Dónde y cuándo corrió

Herramienta
ansgis.red — paquete de R servido como herramientas por mcptools 1.0.1
Fecha de la corrida
15 de agosto de 2026
Duración
29,8 s de punta a punta, las 4 herramientas
Motor
R 4.3.3 «Angel Food Cake» · GDAL 3.8.4 · GEOS 3.12.1 · PROJ 9.4.0
Sistema de coordenadas
EPSG:32721 (UTM 21S) — por eso las distancias salen en metros y no en grados

Contra qué pliego

35 herramientas

Lo que hay que construir no lo inventamos: lo escribió Esri. La extensión Network Analyst de ArcGIS es la especificación. Acá está medido cuánto de esa especificación cubre esta obra — con las 35 herramientas listadas una por una, incluidas las 20 que no cubre.

ArcGIS Network Analyst · 35 herramientas documentadas

El conteo sale de las tres listas oficiales del toolbox: 21 herramientas de Analysis, 8 de Network Dataset y 6 de Turn Feature Class. Las 4 cubiertas son exactamente las 4 herramientas que corrieron. «No aplica» quiere decir que la herramienta mantiene un formato o un portal propio de Esri (plantillas de network dataset, travel modes .json, tablas de ArcView) — no hay nada equivalente que cubrir de este lado.

Las 35 herramientas del pliego, con su estado
#Herramienta de ArcGISEstado Con qué se cubre, o por qué no
Analysis · 21 herramientas
1Add Field To Analysis Layersin cubrirno hay objeto «capa de análisis» que editar: acá el resultado es una tabla de R
2Add Locationsparciallos puntos se pegan al nodo más cercano dentro de st_network_cost, pero no se guardan como capa de paradas
3Add Fleet Routing Breakssin cubrirruteo de flotas con descansos
4Add Fleet Routing Routessin cubrirruteo de flotas
5Calculate Locationsparcialel pegado a la red ocurre, pero no se persisten los campos de ubicación
6Copy Network Analysis Layersin cubrirgestión de capas de análisis de ArcGIS
7Copy Traversed Source Featuressin cubrirharía falta sfnetworks::st_network_paths, que no se llamó
8Delete Network Analysis Layersin cubrirgestión de capas de análisis de ArcGIS
9Directionssin cubrirno hay indicaciones giro a giro
10Make Closest Facility Analysis Layercubiertainstalacion_mas_cercana/solveClosestFacility
11Make Last Mile Delivery Analysis Layersin cubrirruteo de flotas
12Make Location-Allocation Analysis Layersin cubrirharía falta tbart, que no tiene versión para navegador
13Make OD Cost Matrix Analysis Layercubiertamatriz_od/solveODCostMatrix
14Make Route Analysis Layerparcialst_network_cost da el costo de la ruta, no su geometría
15Make Service Area Analysis Layerparcialarea_servicio/solveServiceArea, pero con envolvente convexa en vez de polígono ajustado a la calle
16Make Vehicle Routing Problem Analysis Layersin cubrirruteo de flotas con ventanas horarias
17Make Waste Collection Analysis Layersin cubrirruteo de flotas
18Share As Route Layersno aplicapublica el resultado en el portal de Esri
19Solveparcialresuelve los tres análisis de arriba, no todos los del pliego
20Update Fleet Routing Assignmentssin cubrirruteo de flotas
21Update Fleet Routing Resultssin cubrirruteo de flotas
Network Dataset · 8 herramientas
22Build Networkcubiertaconstruir_redsfnetworks::as_sfnetwork
23Create Network Datasetcubiertaconstruir_red — arma la red desde las líneas del CSV
24Create Network Dataset From Templateno aplicaarchivo plantilla propio de Esri
25Create Template From Network Datasetno aplicaarchivo plantilla propio de Esri
26Dissolve Networksin cubrirsimplificación de la red: no implementada
27Export Network Travel Modesno aplicatravel modes en el .json de Esri
28Make Network Dataset Layersin cubrircapa de red de ArcGIS
29Replace Network Travel Modesno aplicatravel modes en el .json de Esri
Turn Feature Class · 6 herramientas
30Create Turn Feature Classsin cubrirrestricciones de giro: no implementadas
31Increase Maximum Edgessin cubrirrestricciones de giro
32Populate Alternate ID Fieldssin cubrirrestricciones de giro
33Turn Table To Turn Feature Classno aplicaconvierte tablas de ArcView / ArcInfo Workstation
34Update By Alternate ID Fieldssin cubrirrestricciones de giro
35Update By Geometrysin cubrirrestricciones de giro

Los nombres de las 35 salen de las tres páginas oficiales del toolbox, leídas el 15-ago-2026: Analysis (21) ↗ · Network Dataset (8) ↗ · Turn Feature Class (6) ↗. El estado de cada fila lo asignamos nosotros con esta regla: cubierta = hay una herramienta de esta obra que la reemplaza y corrió; parcial = la pieza está adentro de la corrida pero no expuesta o incompleta; no aplica = mantiene un formato o portal propietario de Esri. Ante la duda se marcó la opción más dura.

Cada herramienta corrida, contra su equivalente en el pliego

Herramienta de esta obraEquivale en ArcGIS aSolver REST
construir_redBuild Network / Create Network Dataset
matriz_odMake OD Cost Matrix Analysis Layer + Solve /solveODCostMatrix
instalacion_mas_cercanaMake Closest Facility Analysis Layer + Solve /solveClosestFacility
area_servicioMake Service Area Analysis Layer + Solve /solveServiceArea

Sobre la API REST de ruteo de ArcGIS ↗, esta obra reemplaza los tres endpoints de la tabla — los mismos tres, ni uno más. El ruteo de flotas y las restricciones de giro, que son el grueso de lo que falta, no tienen equivalente acá.

Los papeles

10 paquetes · 2 datasets

Todo lo que se usó es software libre y datos abiertos, y cada uno viene con su licencia y su versión exacta. Nada acá tiene costo de licencia ni ata a un proveedor.

Los paquetes de R que estaban cargados en la corrida

Tocá cualquiera y se abre su ficha acá abajo, con la línea para instalarlo, cuántas de sus funciones tiene el diccionario y qué usó esta obra.

PaqueteVersión usadaLicenciaPara qué

Versiones leídas del propio entorno donde corrió, con packageDescription() — no de una lista escrita a mano.

Los datos

DatasetOrganismoLicenciaRegistros
Ciclovías
actualizado 7-ago-2026
bajar el CSV que leyó la corrida ↗
GCBA · Transporte y Obras Públicas CC-BY-2.5-AR2.764 tramos
Espacios verdes públicos
actualizado 6-jul-2026
bajar el GeoJSON que leyó la corrida ↗
GCBA · Desarrollo Urbano CC-BY-2.5-AR2.176 espacios

Licencias leídas del catálogo oficial (data.buenosaires.gob.ar/api/3/action/package_show) el 15-ago-2026, no supuestas. CC-BY quiere decir que se puede reusar citando la fuente. Las dos URLs de descarga exactas están en Cómo rehacerlo.

Lo que este recibo no puede afirmar

Un recibo que sólo dice lo que salió bien no es un recibo. Esto es lo que quedó flojo en esta corrida, dicho por quien la hizo.

Cómo rehacer esto desde cero

Un recibo sirve si otro puede repetir la cuenta y obtener lo mismo. Acá está el código que corrió, no una descripción del código que corrió.

1 · Los dos datasets, con la URL exacta que leyó el script

https://cdn.buenosaires.gob.ar/datosabiertos/datasets/transporte-y-obras-publicas/ciclovias/ciclovias.csv
https://cdn.buenosaires.gob.ar/datosabiertos/datasets/secretaria-de-desarrollo-urbano/espacios-verdes/espacio_verde_publico.geojson

Las dos respondieron 200 el 15-ago-2026. Son las mismas dos constantes URL_CICLOVIAS y URL_VERDES del script de abajo.

2 · El entorno

# R 4.3.3 o superior
install.packages(c("sf", "sfnetworks", "tidygraph", "dplyr", "igraph", "ellmer"))
# el paquete propio, desde nuestro r-universe
install.packages("ansgis.geostat", repos = "https://emri-setup.r-universe.dev")

Las versiones exactas que había cargadas están en Los papeles. Si instalás versiones distintas, el resultado puede moverse: por eso el recibo lleva las versiones y no sólo los nombres.

3 · El código que produjo los siete números

Es el núcleo de tools.R, tal cual está en el servidor de la sección. Las cuatro funciones son las cuatro herramientas del pliego.

library(sf); library(sfnetworks); library(tidygraph); library(dplyr)

URL_CICLOVIAS <- "https://cdn.buenosaires.gob.ar/datosabiertos/datasets/transporte-y-obras-publicas/ciclovias/ciclovias.csv"
URL_VERDES    <- "https://cdn.buenosaires.gob.ar/datosabiertos/datasets/secretaria-de-desarrollo-urbano/espacios-verdes/espacio_verde_publico.geojson"
CRS_M <- 32721   # UTM 21S: metros para CABA

puntos_de_texto <- function(txt) {
  m <- do.call(rbind, lapply(strsplit(strsplit(txt, ";")[[1]], ","), as.numeric))
  st_transform(st_as_sf(data.frame(lon = m[, 1], lat = m[, 2]),
                        coords = c("lon", "lat"), crs = 4326), CRS_M)
}

# 1 · Build Network / Create Network Dataset  ->  2.505 nodos y 286,8 km
f_construir_red <- function(comuna = "") {
  df     <- utils::read.csv(URL_CICLOVIAS, encoding = "UTF-8")
  lineas <- st_as_sf(df, wkt = "geometry", crs = 4326)
  if (nzchar(comuna)) lineas <- lineas[lineas$comuna == as.integer(comuna), ]
  lineas <- st_transform(lineas, CRS_M)
  red <- as_sfnetwork(lineas, directed = FALSE) |>
    activate("edges") |> mutate(peso = edge_length()) |>
    activate("nodes") |> filter(group_components() == 1L)   # componente conexa mayor
  .ans$red <- red
  km <- sum(as.numeric(st_length(st_as_sf(red, "edges")))) / 1000
  sprintf("Red construida: %d nodos, %d tramos, %.1f km", igraph::vcount(red), igraph::ecount(red), km)
}

# 2 · Make OD Cost Matrix + Solve  ->  6.009 m y 3.895 m
f_matriz_od <- function(puntos) {
  p <- puntos_de_texto(puntos)
  m <- st_network_cost(.ans$red, from = p, to = p, weights = "peso")
  round(matrix(as.numeric(m), nrow = nrow(m)))
}

# 3 · Make Closest Facility + Solve  ->  91 m
f_instalacion_mas_cercana <- function(lon, lat, n = "3") {
  v      <- st_transform(st_make_valid(st_read(URL_VERDES, quiet = TRUE)), CRS_M)
  origen <- puntos_de_texto(paste0(lon, ",", lat))
  costos <- as.numeric(st_network_cost(.ans$red, from = origen,
                                       to = st_centroid(v), weights = "peso"))
  ord <- order(costos)[seq_len(min(as.integer(n), length(costos)))]
  sprintf("%.0f m por ciclovia", costos[ord])
}

# 4 · Make Service Area + Solve  ->  197 nodos y 573,1 ha
f_area_servicio <- function(lon, lat, corte_m = "1000") {
  origen <- puntos_de_texto(paste0(lon, ",", lat))
  costos <- as.numeric(st_network_cost(.ans$red, from = origen, weights = "peso"))
  alcanz <- which(costos <= as.numeric(corte_m))
  nodos  <- st_as_sf(.ans$red, "nodes")[alcanz, ]
  hull   <- st_convex_hull(st_union(nodos))
  sprintf("%d nodos alcanzables, poligono de %.1f ha",
          length(alcanz), as.numeric(st_area(hull)) / 10000)
}

Se recortaron sólo las guardas de estado (if (is.null(.ans$red))) y las declaraciones ellmer::tool() que publican estas cuatro funciones como herramientas — no cambian ningún número. El archivo completo vive en el servidor de la sección como /root/ansgis-prueba/tools.R.

4 · Las cuatro llamadas de la corrida

cat(f_construir_red(""))
cat(f_matriz_od("-58.3816,-34.6037;-58.4358,-34.6064;-58.3697,-34.6280"))
cat(f_instalacion_mas_cercana("-58.3816", "-34.6037", "3"))
cat(f_area_servicio("-58.3816", "-34.6037", "2000"))

Es prueba-directa.R entero, sin el cronómetro. La salida que devolvió está arriba, en la salida cruda. Si te da distinto, lo más probable es que el GCBA haya publicado una versión nueva de las ciclovías: por eso el recibo lleva la fecha del dato y no sólo la del cálculo.