## 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
```