Praças de João Pessoa#

import warnings
warnings.filterwarnings('ignore')
import geopandas as gpd
import matplotlib.pyplot as plt
from matplotlib.offsetbox import AnchoredText

Lendo de geodata-jp#

pracas = gpd.read_file('https://raw.githubusercontent.com/paulovitorweb/geodata-jp/main/data/pracas.geojson')
pracas.info()
<class 'geopandas.geodataframe.GeoDataFrame'>
RangeIndex: 214 entries, 0 to 213
Data columns (total 4 columns):
 #   Column    Non-Null Count  Dtype   
---  ------    --------------  -----   
 0   bairro    213 non-null    object  
 1   nome      213 non-null    object  
 2   area      212 non-null    object  
 3   geometry  214 non-null    geometry
dtypes: geometry(1), object(3)
memory usage: 6.8+ KB
pracas.head()
bairro nome area geometry
0 ERNESTO GEISEL PRAÇA ORLANDO GEISEL 3497,98600310013 POLYGON Z ((-34.86926 -7.17795 0.00000, -34.86...
1 ERNESTO GEISEL PRAÇA RADIALISTA PASCOAL CARRILHO 2620,63999998348 POLYGON Z ((-34.87292 -7.18300 48.96000, -34.8...
2 BESSA PRAÇA DJALMA GOMES DA FONSECA - PRAÇA DO CAJU 7695,04039995941 POLYGON Z ((-34.84340 -7.06852 5.36000, -34.84...
3 AEROCLUBE PRAÇA FRANCISCO EVARISTO DOS SANTOS 758,679452962841 POLYGON Z ((-34.84002 -7.09656 0.00000, -34.84...
4 AEROCLUBE PRAÇA CELIA SANTIAGO 8066,92307513824 POLYGON Z ((-34.84308 -7.09773 0.00000, -34.84...
pracas = pracas.drop(columns=['area'])
pracas.head()
bairro nome geometry
0 ERNESTO GEISEL PRAÇA ORLANDO GEISEL POLYGON Z ((-34.86926 -7.17795 0.00000, -34.86...
1 ERNESTO GEISEL PRAÇA RADIALISTA PASCOAL CARRILHO POLYGON Z ((-34.87292 -7.18300 48.96000, -34.8...
2 BESSA PRAÇA DJALMA GOMES DA FONSECA - PRAÇA DO CAJU POLYGON Z ((-34.84340 -7.06852 5.36000, -34.84...
3 AEROCLUBE PRAÇA FRANCISCO EVARISTO DOS SANTOS POLYGON Z ((-34.84002 -7.09656 0.00000, -34.84...
4 AEROCLUBE PRAÇA CELIA SANTIAGO POLYGON Z ((-34.84308 -7.09773 0.00000, -34.84...

Transformando para coordenadas métricas#

pracas = pracas.to_crs('EPSG:31985')
pracas.crs
<Projected CRS: EPSG:31985>
Name: SIRGAS 2000 / UTM zone 25S
Axis Info [cartesian]:
- E[east]: Easting (metre)
- N[north]: Northing (metre)
Area of Use:
- name: Brazil - between 36°W and 30°W, northern and southern hemispheres, onshore and offshore.
- bounds: (-36.0, -23.8, -29.99, 4.19)
Coordinate Operation:
- name: UTM zone 25S
- method: Transverse Mercator
Datum: Sistema de Referencia Geocentrico para las AmericaS 2000
- Ellipsoid: GRS 1980
- Prime Meridian: Greenwich

Calculando a área#

pracas['area_m2'] = pracas['geometry'].area
pracas.head()
bairro nome geometry area_m2
0 ERNESTO GEISEL PRAÇA ORLANDO GEISEL POLYGON ((293582.019 9206159.013, 293583.120 9... 3500.708264
1 ERNESTO GEISEL PRAÇA RADIALISTA PASCOAL CARRILHO POLYGON ((293180.220 9205597.923, 293181.211 9... 2619.178130
2 BESSA PRAÇA DJALMA GOMES DA FONSECA - PRAÇA DO CAJU POLYGON ((296390.569 9218272.870, 296392.878 9... 7698.145543
3 AEROCLUBE PRAÇA FRANCISCO EVARISTO DOS SANTOS POLYGON ((296776.311 9215173.161, 296776.530 9... 760.352547
4 AEROCLUBE PRAÇA CELIA SANTIAGO POLYGON ((296438.193 9215042.411, 296439.160 9... 8068.992371

Plotando gráficos#

pracas.sort_values(by='area_m2')[-15:].plot.barh(x='nome', y='area_m2', figsize=(5,5))
<AxesSubplot:ylabel='nome'>
../../_images/geodata-jp-pracas-example_13_1.png

Plotando mapas#

bairros = gpd.read_file('https://raw.githubusercontent.com/paulovitorweb/geodata-jp/main/data/bairros.geojson')
bairros = bairros.to_crs('EPSG:31985')
def _insert_title(title, ax):
    at = AnchoredText(title, prop={'size': 11}, frameon=True, loc='upper left')
    at.patch.set_boxstyle('square,pad=0.1')
    ax.add_artist(at)

def plot():
    fig, ax = plt.subplots(1, 1, figsize=(5,5))
    _insert_title('PRAÇAS', ax)
    bairros.plot(ax=ax, alpha=0.3, zorder=1)
    pracas.plot(ax=ax, alpha=0.9, edgecolor='k', zorder=2)

plot()
../../_images/geodata-jp-pracas-example_16_0.png

Respondendo algumas perguntas#

Quantos metros quadrados João Pessoa tem de praças?#

pracas['area_m2'].sum()
617983.397359327

João Pessoa tem pouco mais de 600 mil metros quadrados de praças.

Qual a cobertura das praças num raio de 500 metros?#

Na literatura 500 metros é uma distância de caminhada considerada, via de regra, razoável.

def get_pracas_500m():
    buffer = pracas['geometry'].buffer(500).unary_union
    buffer_gdf = gpd.GeoDataFrame(crs=pracas.crs, geometry=[buffer])
    return gpd.clip(buffer_gdf, bairros.dissolve())

pracas_500m = get_pracas_500m()
pracas_500m.plot()
<AxesSubplot:>
../../_images/geodata-jp-pracas-example_21_1.png
(pracas_500m['geometry'].area.sum() / 1000000) / (bairros['geometry'].area.sum() / 1000000)
0.34812778534438826

Cerca de 35% do território de João Pessoa, considerando os polígonos dos bairros, está há pelo menos 500 metros de uma ou mais praças.

E a cobertura por bairro?#

bairros_clipped = bairros.clip(pracas_500m.dissolve())
bairros_clipped['area_pracas_500m'] = bairros_clipped['geometry'].area
bairros['area_m2'] = bairros['geometry'].area
bairros = bairros.set_index('nome').join(bairros_clipped.set_index('nome'), lsuffix='_orig', rsuffix='_clip')
bairros['area_pracas_500m'].fillna(0, inplace=True)
bairros = bairros.reset_index()
bairros['coverage'] = bairros.area_pracas_500m / bairros.area_m2
bairros['geometry'] = bairros.geometry_orig
bairros.sort_values(by='coverage').plot.barh(x='nome', y='coverage', figsize=(8,20))
<AxesSubplot:ylabel='nome'>
../../_images/geodata-jp-pracas-example_30_1.png
bairros.plot(column='coverage', cmap='OrRd')
<AxesSubplot:>
../../_images/geodata-jp-pracas-example_31_1.png