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