---
# System prepended metadata

title: 'Ilustração com mapas, dados georeferenciados e programação - Aula 3'

---


## Sesc Av. Paulista
# Ilustração com mapas, dados georeferenciados e programação - Aula 3
### `hackmd.io/@sesc-av-paulista/ilustra-mapas-2025-a3` - [índice](https://hackmd.io/@sesc-av-paulista/ilustra-mapas-2025)

- https://geo-python-site.readthedocs.io/en/latest/
- Carregando outras fontes de dados: https://geopandas.org/en/v1.1.0/docs/reference/api/geopandas.read_file.html
- Contato do Alê: abav @ lugaralgum . com

```python=
import py5   # biblioteca de desenho
import osmnx as ox  # para pegar dados do OSM em geopandas.GeoDataFrame
import shapely # biblioteca de geometria usada pelo geopandas

DIST = 7000

ox.settings.log_console = True
# Obter tupla (lat, long) de um endereço (geocoding)
ponto = ox.geocode('Brasília, DF, Brasil')
# Obter GeoDataFrame de um local (place)
predios = ox.features.features_from_point(
    ponto, # tupla de cooredenadas
    tags={'building': True},
    dist=DIST
    )
aguas = ox.features.features_from_point(
    ponto, # tupla de cooedenadas
    tags={'water': True},
    dist=DIST
    )
ruas = ox.features.features_from_point(
    ponto, # tupla de cooedenadas
    tags={'highway': True},
    dist=DIST
    )
# 
# graph = ox.graph_from_point(
#      ponto, network_type='walk', dist=DIST
#      )
# gdf_nodes, caminhos = ox.graph_to_gdfs(
#     graph,
#     nodes=True, edges=True,
#     node_geometry=True,
#     fill_edge_geometry=False
#     )
# 
def setup():
    py5.size(800, 800)
    # começa a gravar um pdf
    py5.begin_record(py5.PDF, 'mapa-bsb.pdf')
    py5.color_mode(py5.HSB)  # Hue (Matiz), Saturation, Brightness
    py5.background(255)  # branco
    #  Calculo para caber na tela usando .total_bounds do GDF
    x_min, y_min, x_max, y_max = aguas.total_bounds
    map_w, map_h = (x_max - x_min), (y_max - y_min)
    x_scale = y_scale = py5.height / map_h
    # Aplicar tranformação nos GDFs (encolher pra caber na tela) inverte Y
    translate_and_scale_gdf(predios, -x_min, -y_min, x_scale, -y_scale)
    translate_and_scale_gdf(ruas, -x_min, -y_min, x_scale, -y_scale)
    translate_and_scale_gdf(aguas, -x_min, -y_min, x_scale, -y_scale)
    # Desenhar aguas
    py5.no_stroke()
    py5.fill(0, 0, 200) # cinza 200
    geometria_aguas = aguas.geometry.union_all()
    py5.shape(geometria_aguas, 0, py5.height)  # desenhar começando na parte de baixo da tela
    # Desenhar na tela predios
    py5.stroke_weight(0.1)
    py5.stroke(0)  # cor do traço
    grupo_predios = py5.create_shape(py5.GROUP)
    for geometria_predio in predios.geometry:
        py5.fill(py5.random(255), 255, 255)  # Matiz/Hue aleatório, Sat max, Brilho max
        grupo_predios.add_child(py5.convert_shape(geometria_predio))
    py5.shape(grupo_predios, 0, py5.height)  # desenhar começando na parte de baixo da tela
    # Desenhar ruas
    py5.fill(240, 128)
    geometria_ruas = ruas.geometry.union_all()
    py5.shape(geometria_ruas, 0, py5.height)  # desenhar começando na parte de baixo da tela
    # termina de gravar o PDF
    py5.end_record()
   
def translate_and_scale_gdf(gdf, x, y, x_scale, y_scale):
    gdf['geometry'] = gdf.geometry.translate(x, y)
    gdf['geometry'] = gdf.geometry.scale(
        xfact=x_scale, yfact=y_scale, origin=(0, 0))

py5.run_sketch(block=False)  # remove block=False if on MacOS

```

### Dados externos

```python=
import py5   # biblioteca de desenho
import osmnx as ox  # para pegar dados do OSM em geopandas.GeoDataFrame
import shapely # biblioteca de geometria usada pelo geopandas
import geopandas as gpd

DIST = 5000

ox.settings.log_console = True
ox.settings.requests_timeout = 60 * 5
# Obter tupla (lat, long) de um endereço (geocoding)
ponto = ox.geocode('São Paulo, SP, Brasil')
# Obter GeoDataFrame de um local (place)


ruas = ox.features.features_from_point(
    ponto, # tupla de cooedenadas
    tags={'highway': True},
    dist=DIST
    )
feiras = gpd.read_file('feiras-sp.gpkg') #.to_crs('EPSG:31982').buffer(100)
feiras = feiras.to_crs(ruas.crs)

def setup():
    py5.size(800, 800)
    # começa a gravar um pdf
    py5.begin_record(py5.PDF, 'mapa-bsb.pdf')
    py5.background(255)  # branco
    #  Calculo para caber na tela usando .total_bounds do GDF
    x_min, y_min, x_max, y_max = ruas.total_bounds
    map_w, map_h = (x_max - x_min), (y_max - y_min)
    x_scale = y_scale = py5.height / map_h
    # Aplicar tranformação nos GDFs (encolher pra caber na tela) inverte Y
    #translate_and_scale_gdf(predios, -x_min, -y_min, x_scale, -y_scale)
    translate_and_scale_gdf(ruas, -x_min, -y_min, x_scale, -y_scale)
    translate_and_scale_gdf(feiras, -x_min, -y_min, x_scale, -y_scale)


    # Desenhar feiras
    py5.stroke(0, 0, 200)
    py5.stroke_weight(3)
    geometria_feiras = feiras.geometry.union_all()
    py5.shape(geometria_feiras, 0, py5.height)  # desenhar começando na parte de baixo da tela
    # Desenhar ruas
    py5.fill(100)
    py5.stroke(0)
    py5.stroke_weight(0.1)
    geometria_ruas = ruas.geometry.union_all()
    py5.shape(geometria_ruas, 0, py5.height)  # desenhar começando na parte de baixo da tela
    # termina de gravar o PDF
    py5.end_record()
   
def translate_and_scale_gdf(gdf, x, y, x_scale, y_scale):
    gdf['geometry'] = gdf.geometry.translate(x, y)
    gdf['geometry'] = gdf.geometry.scale(
        xfact=x_scale, yfact=y_scale, origin=(0, 0))

py5.run_sketch(block=False)  # remove block=False if on MacOS

```