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.
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
mcptools1.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 herramientasLo 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 ArcGIS | Estado | Con qué se cubre, o por qué no |
|---|---|---|---|
| Analysis · 21 herramientas | |||
| 1 | Add Field To Analysis Layer | sin cubrir | no hay objeto «capa de análisis» que editar: acá el resultado es una tabla de R |
| 2 | Add Locations | parcial | los puntos se pegan al nodo más cercano dentro de st_network_cost, pero no se guardan como capa de paradas |
| 3 | Add Fleet Routing Breaks | sin cubrir | ruteo de flotas con descansos |
| 4 | Add Fleet Routing Routes | sin cubrir | ruteo de flotas |
| 5 | Calculate Locations | parcial | el pegado a la red ocurre, pero no se persisten los campos de ubicación |
| 6 | Copy Network Analysis Layer | sin cubrir | gestión de capas de análisis de ArcGIS |
| 7 | Copy Traversed Source Features | sin cubrir | haría falta sfnetworks::st_network_paths, que no se llamó |
| 8 | Delete Network Analysis Layer | sin cubrir | gestión de capas de análisis de ArcGIS |
| 9 | Directions | sin cubrir | no hay indicaciones giro a giro |
| 10 | Make Closest Facility Analysis Layer | cubierta | instalacion_mas_cercana — /solveClosestFacility |
| 11 | Make Last Mile Delivery Analysis Layer | sin cubrir | ruteo de flotas |
| 12 | Make Location-Allocation Analysis Layer | sin cubrir | haría falta tbart, que no tiene versión para navegador |
| 13 | Make OD Cost Matrix Analysis Layer | cubierta | matriz_od — /solveODCostMatrix |
| 14 | Make Route Analysis Layer | parcial | st_network_cost da el costo de la ruta, no su geometría |
| 15 | Make Service Area Analysis Layer | parcial | area_servicio — /solveServiceArea, pero con envolvente convexa en vez de polígono ajustado a la calle |
| 16 | Make Vehicle Routing Problem Analysis Layer | sin cubrir | ruteo de flotas con ventanas horarias |
| 17 | Make Waste Collection Analysis Layer | sin cubrir | ruteo de flotas |
| 18 | Share As Route Layers | no aplica | publica el resultado en el portal de Esri |
| 19 | Solve | parcial | resuelve los tres análisis de arriba, no todos los del pliego |
| 20 | Update Fleet Routing Assignments | sin cubrir | ruteo de flotas |
| 21 | Update Fleet Routing Results | sin cubrir | ruteo de flotas |
| Network Dataset · 8 herramientas | |||
| 22 | Build Network | cubierta | construir_red — sfnetworks::as_sfnetwork |
| 23 | Create Network Dataset | cubierta | construir_red — arma la red desde las líneas del CSV |
| 24 | Create Network Dataset From Template | no aplica | archivo plantilla propio de Esri |
| 25 | Create Template From Network Dataset | no aplica | archivo plantilla propio de Esri |
| 26 | Dissolve Network | sin cubrir | simplificación de la red: no implementada |
| 27 | Export Network Travel Modes | no aplica | travel modes en el .json de Esri |
| 28 | Make Network Dataset Layer | sin cubrir | capa de red de ArcGIS |
| 29 | Replace Network Travel Modes | no aplica | travel modes en el .json de Esri |
| Turn Feature Class · 6 herramientas | |||
| 30 | Create Turn Feature Class | sin cubrir | restricciones de giro: no implementadas |
| 31 | Increase Maximum Edges | sin cubrir | restricciones de giro |
| 32 | Populate Alternate ID Fields | sin cubrir | restricciones de giro |
| 33 | Turn Table To Turn Feature Class | no aplica | convierte tablas de ArcView / ArcInfo Workstation |
| 34 | Update By Alternate ID Fields | sin cubrir | restricciones de giro |
| 35 | Update By Geometry | sin cubrir | restricciones 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 obra | Equivale en ArcGIS a | Solver REST |
|---|---|---|
| construir_red | Build Network / Create Network Dataset | — |
| matriz_od | Make OD Cost Matrix Analysis Layer + Solve | /solveODCostMatrix |
| instalacion_mas_cercana | Make Closest Facility Analysis Layer + Solve | /solveClosestFacility |
| area_servicio | Make 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 datasetsTodo 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.
| Paquete | Versión usada | Licencia | Para qué |
|---|
Versiones leídas del propio entorno donde corrió, con
packageDescription() — no de una lista escrita a mano.
Los datos
| Dataset | Organismo | Licencia | Registros |
|---|---|---|---|
| Ciclovías actualizado 7-ago-2026 bajar el CSV que leyó la corrida ↗ |
GCBA · Transporte y Obras Públicas | CC-BY-2.5-AR | 2.764 tramos |
| Espacios verdes públicos actualizado 6-jul-2026 bajar el GeoJSON que leyó la corrida ↗ |
GCBA · Desarrollo Urbano | CC-BY-2.5-AR | 2.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.
- Dos resultados dan 0 m y no es que estén encima del Obelisco. «Paquita Bernardo» y «La Cumparsita» salen a 0 metros porque el cálculo pega cada espacio verde al nodo de ciclovía más cercano, y esos dos cayeron en el mismo nodo que el origen. El número honesto de la pregunta «¿qué verde tengo cerca?» es el tercero: Plaza de la República, 91 m — que además cualquiera que conozca el Obelisco puede verificar caminando.
- El área de servicio es una envolvente, no la mancha real. Las 573,1 ha salen del polígono convexo que envuelve los 197 nodos alcanzables. ArcGIS dibuja un polígono ajustado a las calles; esta versión todavía no. Por eso esa herramienta figura como parcial y no como cubierta en la matriz de las 35.
- Las fichas del diccionario pueden ir una versión atrás de lo que corrió. Cuando pasa, la ficha lo dice arriba de todo, al lado del nombre de la función, y la cuenta exacta está en Los papeles. Es una diferencia menor, pero la página la muestra en vez de taparla.
- Siete de las 19 funciones del recibo no tienen ficha. El diccionario cubre 19
paquetes a nivel función, e
igraph,tidygraph,dplyryellmertodavía no están adentro. Esas siete se usaron igual y están listadas con nombre y apellido, pero su firma no la verificamos nosotros. La página lo dice donde pasa, en lugar de inventar la ficha. - El mapa del encabezado es una silueta, no un mapa. Está dibujado con los mismos 2.764 tramos que leyó la corrida, pero con una proyección simple para poder mirarlo. Las distancias nunca se midieron sobre ese dibujo: se midieron en EPSG:32721.
- Al abrir esta página, la consola del navegador muestra dos errores 404. Son las
dos consultas al diccionario por paquetes que no cubre (
igraphytidygraph): el 404 es la respuesta correcta del servicio, no una falla. Lo decimos acá para que nadie confunda ese ruido con un problema real. - Nadie la aprobó todavía. Esta obra está corrida y verificada, pero no tiene la firma de una persona de la comuna. Hasta que la tenga, es un borrador con recibo.
- Si la aprobás desde acá, la firma queda en este navegador y en ningún lado más. Los botones de arriba hacen lo que dicen —cambian el estado de la obra, y se puede deshacer—, pero esta página guarda ese estado en el almacenamiento local de tu equipo. En la plataforma, la misma acción se asienta en el tablero de la Comuna 1 con la fecha y con quién la puso. Lo decimos porque un recibo que se miente sobre su propia firma no sirve para nada.
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.