{"id":51303193,"url":"https://github.com/roquerodrigo/subway-builder-rmsp","last_synced_at":"2026-06-30T22:02:20.912Z","repository":{"id":367858205,"uuid":"1279592762","full_name":"roquerodrigo/subway-builder-rmsp","owner":"roquerodrigo","description":"Gerador do mapa da Região Metropolitana de São Paulo (RMSP) para Subway Builder — dados reais da Pesquisa OD 2023 do Metrô-SP.","archived":false,"fork":false,"pushed_at":"2026-06-28T01:53:17.000Z","size":844,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-28T03:14:25.901Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/roquerodrigo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-24T20:45:27.000Z","updated_at":"2026-06-28T01:52:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/roquerodrigo/subway-builder-rmsp","commit_stats":null,"previous_names":["roquerodrigo/subway-builder-rmsp"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/roquerodrigo/subway-builder-rmsp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roquerodrigo%2Fsubway-builder-rmsp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roquerodrigo%2Fsubway-builder-rmsp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roquerodrigo%2Fsubway-builder-rmsp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roquerodrigo%2Fsubway-builder-rmsp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/roquerodrigo","download_url":"https://codeload.github.com/roquerodrigo/subway-builder-rmsp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roquerodrigo%2Fsubway-builder-rmsp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34984784,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-30T02:00:05.919Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-30T22:02:20.689Z","updated_at":"2026-06-30T22:02:20.898Z","avatar_url":"https://github.com/roquerodrigo.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RMSP — São Paulo para Subway Builder\n\nGera e instala uma cidade jogável da **Região Metropolitana de São Paulo\ninteira** (capital + ABC + Guarulhos + Osasco/Barueri + Mogi + periferia) para\no jogo [Subway Builder](https://www.subwaybuilder.com) (modding API **v1.0.0**).\nO bbox cobre todo o extent da Pesquisa OD (~157 × 101 km), para que nenhuma zona\nde demanda fique fora do mapa.\n\nA cidade traz ruas, prédios (3D), água (represas Billings/Guarapiranga, rios\nTietê/Pinheiros), aeroportos (Congonhas, Guarulhos, Campo de Marte) e **demanda\nde passageiros real** da Pesquisa Origem-Destino do Metrô-SP, com trajetos que\nseguem o viário (OSRM).\n\n```\nsubway-builder-rmsp/\n├── mod/                  # o mod (vai para \u003cgame\u003e/mods/rmsp/)\n│   ├── manifest.json\n│   └── index.js\n├── src/rmsp/             # gerador (pacote Python, CLI `rmsp`)\n│   ├── config.py         #   Settings: bbox, zoom, knobs, URLs, paths  (fonte única)\n│   ├── cli.py            #   comandos: sources cnefe build routes tiles validate install serve play all\n│   ├── sources.py        #   downloads + clip (osmium) + extração OSM + CNEFE/Censo\n│   ├── layers.py         #   roads / buildings / water / airports  -\u003e .gz\n│   ├── subpoints.py      #   desagregação dasimétrica (CNEFE / prédios -\u003e sub-pontos)\n│   ├── demand.py         #   Pesquisa OD + sub-pontos -\u003e demand_data\n│   ├── routing.py        #   OSRM (rota viária dos pops) + Douglas-Peucker\n│   ├── tiles.py          #   tippecanoe -\u003e PMTiles ; pmtiles serve\n│   ├── validate.py · install.py · external.py · geojson.py\n├── tests/                # pytest (funções puras)\n└── data/                 # gitignored: sources/ build/ tiles/  (gerado em runtime)\n```\n\n## Pré-requisitos\n\n```bash\nbrew install osmium-tool tippecanoe pmtiles osrm-backend uv\nuv sync                       # cria o venv e instala o pacote + deps\n```\n\nA pasta de dados do jogo é resolvida por `SB_DATA_DIR`\n(default `~/Library/Application Support/metro-maker4`).\n\n## Uso\n\nPipeline completo (baixa fontes, gera tudo, valida e instala no jogo):\n\n```bash\nuv run rmsp all\n```\n\nOu passo a passo:\n\n```bash\nuv run rmsp sources     # baixa OSM + Pesquisa OD + CNEFE/Censo; recorta no bbox; extrai\nuv run rmsp build       # 5 arquivos de dados -\u003e data/build/  (--only roads,demand,...)\nuv run rmsp routes      # trajetos viários reais dos commuters (OSRM)\nuv run rmsp tiles       # basemap vetorial (PMTiles)\nuv run rmsp validate    # confere os .gz contra o schema das cidades nativas\nuv run rmsp install     # copia mod + dados pro jogo (SB_DATA_DIR)\n\n# uv run rmsp cnefe     # (re)constrói só o proxy CNEFE: cnefe.csv + setor_pop.csv\n```\n\nVer a seção **Pipeline de dados** abaixo para as fontes baixadas e o modelo de demanda.\n\n## Pipeline de dados\n\n### Fontes baixadas (`rmsp sources`)\n\n| Fonte | O que fornece | Tamanho | Onde |\n|---|---|---|---|\n| **Geofabrik Sudeste** (OSM PBF) | ruas, prédios, água, aeroportos, lugares | ~1,5 GB | `sources` → `\u003clayer\u003e.geojsonseq` |\n| **Pesquisa OD 2023** (Metrô-SP) | zonas (527) + totais/matriz de demanda por zona | ~50 MB | `sources` → `od2023/` |\n| **CNEFE 2022** (IBGE, UF-SP) | ~23 mi de endereços com lat/lng + espécie (residência/estabelecimento) | ~1 GB zip | `cnefe` → `cnefe.csv` (filtrado ao bbox: ~8,3 mi) |\n| **Censo 2022 — Agregados por setor** (IBGE) | população residente por setor censitário (`v0001`) | ~15 MB | `cnefe` → `setor_pop.csv` |\n\nOs downloads são idempotentes (pulam se o arquivo já existe). O CNEFE/Censo só\nsão baixados quando o proxy de demanda é `cnefe` (o padrão). O FTP do IBGE serve\ncadeia TLS incompleta — usamos o bundle de CAs do `certifi`.\n\n### Fluxo\n\n```\nOSM PBF ──clip(bbox)──extract──\u003e roads/buildings/water/aero/places.geojsonseq ──layers──\u003e *.gz  +  tiles ──\u003e PMTiles\nPesquisa OD ───────────────────\u003e zonas + matriz/totais por zona ─┐\nCNEFE (endereços) ─┐                                             ├─ demand.py ──\u003e demand_data(.gz) ──routes(OSRM)──\u003e drivingPath\nCenso (pop/setor) ─┴─ subpoints.py ─\u003e sub-pontos (res_w/job_w) ──┘\n```\n\n### Modelo de demanda (desagregação dasimétrica)\n\nA Pesquisa OD fixa **quanto** de demanda cada zona tem (totais e matriz zona→zona);\num **proxy** decide **onde dentro da zona** ela fica. Os totais oficiais nunca são\nalterados — `Σ residents == Σ jobs == Σ pop.size` (invariante do jogo/Railyard).\n\nDois proxies, selecionáveis por `RMSP_DEMAND_PROXY`:\n\n- **`cnefe`** (padrão) — endereços georreferenciados do CNEFE 2022. A espécie separa\n  **residência** de **estabelecimento** direto do dado real (sem heurística). O peso\n  residencial vem da **população real do setor censitário** (Censo `v0001`),\n  distribuída entre os endereços residenciais do setor (`res_w = pop / nº endereços`);\n  empregos = densidade de estabelecimentos. `RMSP_CNEFE_CENSUS=0` desliga a ponderação\n  por censo (volta a peso por espécie).\n- **`buildings`** (fallback) — pegadas de prédio do OSM, peso = área × andares dividido\n  pelas tags `building`/`amenity`/`shop`/`office`. Não precisa do download do CNEFE\n  (placement mais grosseiro).\n\nEm ambos, os sub-pontos são agrupados numa grade (`subcell_size`, ~1 km), cada célula\nvira um `point` (descartando pops abaixo de `min_pop_size`), e `pops` ligam sub-ponto\nresidencial → sub-ponto de emprego (entrando nos\n`popIds` das **duas** pontas, senão a aba *Workers* fica sem horários). `drivingPath`\nsegue as ruas via OSRM.\n\n### Variáveis de ambiente\n\n| Var | Default | Efeito |\n|---|---|---|\n| `RMSP_DEMAND_PROXY` | `cnefe` | proxy de demanda: `cnefe` ou `buildings` |\n| `RMSP_CNEFE_CENSUS` | `1` | pondera residências pela população do setor (Censo) |\n| `RMSP_BASIS` | `workers` | base OD: `workers` (FE_PESS, ~10,4 mi) ou `commute` (FE_VIA, ~14,3 mi) |\n| `RMSP_BUILD_WORKERS` | `0` (auto) | nº de processos nas passadas por-feature do build |\n| `SB_DATA_DIR` | macOS metro-maker4 | pasta de dados do jogo (alvo do `install`) |\n\n\u003e **Build paralelo**: `buildings_index` e os sub-pontos da demanda são gerados em\n\u003e múltiplos processos (faixas de bytes do arquivo, com merge determinístico), e os\n\u003e `.gz` usam compressão nível 6 — ~2,5× mais rápido que a versão serial/nível 9.\n\n## Jogar\n\nO basemap precisa do servidor de tiles local (limitação do sandbox de mods):\n\n```bash\nuv run rmsp play        # sobe o pmtiles serve :8080 (se preciso) e abre o jogo\n# ou: uv run rmsp serve  (num terminal) e abrir o jogo manualmente\n```\n\nNo jogo: **Settings → Mods** → ligar **RMSP**; em **Selecionar cidade → aba 🇧🇷\nBrasil → São Paulo (RMSP)**.\n\n## Notas técnicas\n\n- **Demanda OD**: ver **Pipeline de dados → Modelo de demanda** acima para os proxies\n  (CNEFE/prédios) e a ponderação por censo. Detalhe de implementação: `residents`/`jobs`\n  por `point` são **derivados dos pops** (não entradas independentes), garantindo a\n  invariante `Σ residents == Σ jobs == Σ pop.size`.\n- **Ferramentas externas**: osmium, tippecanoe, pmtiles e osrm-\\* são binários nativos\n  (Homebrew), chamados por `src/rmsp/external.py`.\n- **Basemap**: PMTiles com as camadas que o estilo do jogo renderiza —\n  `water/parks/buildings/airports`, os rótulos `city_labels/suburb_labels/\n  neighborhood_labels` e as fundações `foundations/ocean_foundations`. Cada feature\n  carrega só a propriedade que a camada lê: `parks→area`, `buildings→height` (m),\n  `foundations→foundationDepth`, `water/ocean_foundations→depth_min`, labels→`name`.\n  `index.js` liga `oceanFoundations:false` — sem isso a camada `water` fica\n  `visibility:none`.\n- **Prédios**: a altura 3D vem da tile `buildings.height` (de `height`/`building:levels`);\n  o campo `f` do `buildings_index` é a **profundidade de fundação** (subsolos, default 1)\n  que o jogo lê como `foundationDepth` ao tunelar sob prédios — não os andares acima.\n- **API v1.0.0**: confirmado via `SubwayBuilderAPI` (`{\"version\":\"1.0.0\"}`),\n  mesmo no app 1.3.0.\n\n## Limitações conhecidas\n\n- **`Error: layers[N]: source \"general-tiles\" not found`** no console (ao\n  renderizar rotas). É um *diff* de estilo do MapLibre disparado pelo basemap\n  custom (`setTileURLOverride`); **transitório e não-fatal** — o mapa renderiza\n  normalmente. Acontece com qualquer mapa custom que use override (a comunidade\n  [Subway Builder Modded](https://github.com/Subway-Builder-Modded) usa a mesma\n  técnica). Não há correção limpa pelo lado do mod, pois o jogo reconstrói o\n  estilo internamente e o MapLibre não é acessível a partir do mod.\n- **Servidor de tiles**: o basemap só renderiza com `rmsp serve`/`rmsp play` no ar.\n\nInspirado no ecossistema [Subway Builder Modded](https://github.com/Subway-Builder-Modded).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froquerodrigo%2Fsubway-builder-rmsp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Froquerodrigo%2Fsubway-builder-rmsp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froquerodrigo%2Fsubway-builder-rmsp/lists"}