Algo que me deixou viciado recentemente foi como é fácil analisar e criar mapas usando Python. Então não podia faltar um tópico extra pra falar de mapas. Se gostarem eu faço algo mais ambicioso depois. Pensei em criar um mapa parecido com aqueles que saem depois de um resultado eleitoral, com as zonas eleitorais e as votações e tal, mas é algo um pouco mais trabalhoso. Então inicialmente vou fazer algo mais simples: mapear as ciclofaixas e ciclovias do RJ. Sei que vou falar de muita coisa não dita ainda aqui mas novamente, a intenção é mostrar mais uma possibilidade da linguagem e não ensinar o código detalhadamente. Algumas coisas vão ser meio que no atropelo mesmo mas eu posso gravar um vídeo sobre isso depois e as coisas ficarão bem mais claras.
Aqui vou usar uma lib irmã da lib Pandas (ainda não fiz extra com Pandas mas pretendo fazer), a GeoPandas. E uma lib de plotagem de gráficos e mapas, a matplotlib. Mas como muita gente aqui talvez deva usar Windows, e eu já tive problemas para plotar mapas no Windows por conta da falta de uma dependência que não me recordo o nome, e só resolvi depois de instalar o pacote Anaconda, então recomendo pra quem for usuário de Windows instalar o Anaconda:
https://www.anaconda.com/Não é a intenção aqui no tópico setar ambiente nem ensinar a instalar pacotes. Quem tentar e tiver problemas manda a dúvida aí embaixo.
Com o pacote instalado, precisamos da lib geopandas e da lib matplotlib:
# Em Python puro, caso tenham criado um virtual environment:
pip install geopandas
pip install matplotlib
pip install descartes # Aqui foi uma dependência necessária para plotar o mapa, mas talvez no Anaconda não precise instalar essa dependência.
pip install ipython # Um interpretador interativo da linguagem, necessário para rodar o jupyter
pip install jupyter # O próprio jupyter notebook que será usado como IDE aqui
# OU
# No terminal do Anaconda, caso tenham instalado o programa:
conda install geopandas
conda install matplotlib
Preciso também das base de dados. A base para gerar o mapa do RJ eu obtive daqui:
ftp://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2015/UFs/RJ/ do arquivo rj_municipios.zip. São arquivo no formato shapefiles. São vários arquivos no conjunto e eu preciso de todos, não somente do de extensão .shp.
A base da rede cicloviária eu obtive do site data rio (
http://www.data.rio/datasets/rede-ciclovi%C3%A1ria), clicando do lado direito deste link em "APIs" e baixando o arquivo "GeoJSON".
De posse de todos os dados, eu coloquei os arquivos dos mapas em uma pasta chamada "shapefiles" e o arquivo da base cicloviária numa pasta chamada "data", e abri um jupyter-notebook, que é uma espécie de IDE própria para análise e dados, mas isso pode ser feito em uma IDE convencional também. O Anaconda já vem com o Jupyter instalado. Ele tem essa cara aqui:

Nessas janelinhas podemos inserir códigos Python.
Agora, podemos começar nosso código:
import geopandas as gpd
%matplotlib inline
Aqui importei geopandas e atribuí um apelido, um "alias" à lib, que foi a palavra "gpd". É costume da comunidade fazer isso.
O %matplotlib inline é um comando diferente para imports mas ele indica dentro do jupyter notebook que eu quero gerar os gráficos dentro do jupyter, dentro do console interativo. É uma boa forma de visualizar os gráficos enquanto roda o código.
Em seguida, abrindo nosso arquivo da base cicloviária:
dados_ciclovia = gpd.read_file('data/Rede_Cicloviária.geojson')
"dados_ciclovia" se tornou um geodataframe, que a seguir vocês vão ver que parece uma planilha de excel. Caso estejamos usando o jupyter, podemos pedir para ver as 5 primeiras linhas do dataframe assim:
dados_ciclovias.head()
Print do jupyter até agora:

Vejam como se parece uma planilha de Excel. Passando para o lado vejam a coluna "geometry":
dados_ciclovias['geometry'].head()
O resultado:
0 LINESTRING (-43.18106110800686 -22.94251717279...
1 LINESTRING (-43.25547180351271 -22.99858636168...
2 LINESTRING (-43.3740377538093 -23.011235689973...
3 (LINESTRING (-43.3740377538093 -23.01123568997...
4 (LINESTRING (-43.49226644254462 -23.0345444855...
Name: geometry, dtype: object
Cada célula armazena um objeto LINESTRING, que indica uma figura geométrica no formato de linha no mapa com os dados de localização.
Como meu geodataframe "dados_ciclovias" tem uma coluna "geometry", eu posso plotar essas linhas num mapa:

Temos as ciclovias já desenhadas. Agora precisamos do mapa do RJ.
Novamente irei usar a função "read_file" do geopandas para abrir meu arquivo do mapa do RJ:
mapa_rj = gpd.read_file('shapefiles/RJ/33MUE250GC_SIR.shp')
33MUE250GC_SIR.shp é o nome que o arquivo tem ao ser deszipado.
Mas mapa_rj apresenta o mapa do estado do Rio e não da cidade, e podemos perceber isso dando o comando abaixo:
mapa_rj.head()
O resultado:

Percebam a coluna NM_MUNICIP, que mostra que temos listados os municípios do estado. Precisamos filtrar a cidade do RJ, pois as ciclovias estão praticamente todas na cidade:
municip_rj = mapa_rj.loc[(mapa_rj['NM_MUNICIP'] == 'RIO DE JANEIRO')]
A função "loc" nos permite localizar uma linha da coluna NM_MUNICIP. Aqui, estou capturando somente a linha que representa o município do Rio.
Como municip_rj é um geodataframe que possui a coluna "geometry", também podemos plotar o mapa que essa coluna representa:

Pronto, agora o que precisamos é plotar um mapa de duas layers, duas camadas. Usarei o mapa do RJ como base e irei plotar as ciclovias por cima:
base = municip_rj.plot(color='white', edgecolor='black', figsize=(12, 12))
dados_ciclovias.plot(ax=base, figsize=(12, 12))
O resultado disso ao dar o comando no jupyter:

Pronto, temos as ciclovias e ciclofaixas mapeadas dentro do mapa do município. Dá pra fazer várias coisas com esses dados, como calcular a menor distância de uma ciclovia para a praia ou para um ponto de ônibus ou metrô ou para a casa do patrão

, enfim, muita coisa dá pra ser feita com esses dados. O que fiz aqui foi algo bem breve pra mostrar como pode ser simples plotar mapas com Python.
Código completo:
import geopandas as gpd
%matplotlib inline
dados_ciclovias = gpd.read_file('data/Rede_Cicloviária.geojson') # Lê a base cicloviária
mapa_rj = gpd.read_file('shapefiles/RJ/33MUE250GC_SIR.shp') # Lê o mapa do estado do RJ
municip_rj = mapa_rj.loc[(mapa_rj['NM_MUNICIP'] == 'RIO DE JANEIRO')] # Filtra pela cidade do RJ
base = municip_rj.plot(color='white', edgecolor='black', figsize=(12, 12))
dados_ciclovias.plot(ax=base, figsize=(12, 12)) # Plota o mapa cicloviário por cima do mapa da cidade
Sei que aqui foi tudo muito no atropelo mas se mesmo atropelado ficou um post gigante, imaginem se fosse detalhar o que interessa haha mas podemos transformar isso num vídeo e criar outras coisas mais interessantes depois.