AJUSTES INICIAIS
Começamos instalando a biblioteca GeoPandas, que contém os comandos que utilizamos para converter arquivos em GeoDataFrames.
╔══════════════════════════════╦════════════════════════════════╗
║ ⚠ NETWORK DISABLED ⚠ ║ ⚠ NO INTERNET ACCESS ⚠ ║
╠══════════════════════════════╩════════════════════════════════╣
║ This project does not have access to the internet. ║
║ Add a valid license in order to enable internet access. ║
║ Otherwise, you cannot pull from a Git repository, use cURL, ║
║ wget, download Python packages from PyPI, etc. ║
║ Requests to load data will fail or hang indefinitely. ║
║ ║
║ https://cocalc.com/store/site-license ║
║ ║
╟───────────────────────────────────────────────────────────────╢
║ Note: You can't become 'root' on CoCalc for security reasons. ║
╚═══════════════════════════════════════════════════════════════╝
Em seguida, importamos algumas das bibliotecas que sempre temos utilizado:
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
/tmp/ipykernel_1481/4031467662.py in <cell line: 4>()
2 import geopandas as gpd
3 import pandas as pd
----> 4 from google.colab import drive, files
5 import shapely
6 import os
ModuleNotFoundError: No module named 'google.colab'
Por fim, conectamos o Google Drive ao Colab:
Na aula passada, ao tentarmos salvar a variável contendo a união entre as geometrias do zoneamento urbanístico e a tabela de índices do Plano Diretor, ocorreu um erro que impediu o salvamento.
A razão do erro foi que, para realizar a operação de merge, havíamos criado a coluna "ZONA" na tabela de índices para poder conectá-la à coluna de mesmo nome na base geométrica das zonas. O problema é que, com essa adição, a tabela ficou com uma coluna chamada "Zona" e outra "ZONA", o que não é aceito pelo comando de enviar arquivos ao Google Drive, pois ele não diferencia letras maiúsculas de minúsculas.
A solução, portanto, seria deletar uma das colunas antes de salvar a tabela ou modificar o nome da coluna antes de sua importação.
MERGE DO ARQUIVO DE ZONEAMENTO COM A TABELA DE ÍNDICES
Iniciamos importando a base do zoneamento do Plano Diretor que produzimos na aula 02:
Então, importamos a planilha com os índices do Plano Diretor de São Paulo, obtido do site da prefeitura do município: https://gestaourbana.prefeitura.sp.gov.br/marco-regulatorio/zoneamento/arquivos/
Novamente, precisamos criar colunas com o mesmo nome em ambos os arquivos que serão unidos:
Então, realizamos a união das duas variáveis com base no valor da coluna "ZONA":
Para evitar erros no salvamento da base de dados no Google Drive, utilizamos o comando drop() para remover a coluna "Zona" do GeoDataFrame resultante:
Por fim, salvamos o GDF manipulado em nossa pasta de arquivos do Google Drive:
Novamente, utilizaremos os dados disponibilizados pela plataforma GeoSampa: https://geosampa.prefeitura.sp.gov.br/
Mais especificamente, os seguintes dados da aba "Transporte":
Rede Cicloviária (arquivo GPKG_ZIP)
Metro Estação (arquivo GPKG_ZIP)
E também os seguintes dados da aba "Verde e Recursos Naturais":
Parque Estadual (arquivo GPKG_ZIP)
Parque Outras Secretarias (arquivo GPKG_ZIP)
Parque Unidades Conservação (arquivo GPKG_ZIP)
Parques Municipais (arquivo Shapefile)
Esses arquivos também estão na seguinte pasta do Google Drive: https://drive.google.com/drive/folders/1ODwbWiIBLVidme4uDSSZb1sLbZbiPGBn?usp=sharing
O problema da operação de buffer é que ela não gera como resultado um GeoDataFrame, mas sim uma GeoSeries, tipo de variável que possui apenas uma coluna, que nesse caso contém a geometria do buffer.
Uma forma de realizar a operação de buffer sem perder as informações contidas no GeoDataFrame original é salvar as geometrias expandidas na coluna "geometry" do GeoDataFrame.
Para não perder a geometria da variável original, pode-se criar uma cópia dela para a realização do buffer. Porém, deve-se cuidar que, para variáveis complexas no Python, a criação de cópias nem sempre é um processo tão simples.
Note que, no código abaixo, a modificação da cópia gera automaticamente uma modificação na variável original:
Isso ocorre porque o Python não salva o valor que a variável contém, mas sim o endereço dela na memória do computador.
Para evitar esse problema, o melhor método é utilizar o comando deepcopy( ) do módulo copy do Python:
Como mostrado pelo código abaixo, a operação acima cria a geometria do buffer e mantém os atributos originais da base de dados:
Aplicando o método dissolve( ), unimos as geometrias anteriores em uma única geometria.
Por fim, geramos uma visualização da geometria resultante no mapa de São Paulo:
No exemplo anterior, utilizamos uma base de pontos. Agora vemos como gerar os buffer a partir de uma base de linhas, contendo a rede cicloviária da cidade de São Paulo:
Para ficar mais fácil de visualizar as geometrias, utilizamos o método clip( ) para delimitar a base apenas à área de análise:
Para gerar múltiplos buffers a partir de uma camada, podemos utilizar um laço de repetição:
Mas, como unir todos os resultados gerados em um único GDF?
Poderíamos salvar os resultados em uma lista e, ao fim do processo, utilizar o comando concat( ) para juntar todas as geometrias:
O problema é que a geometria resultante da concatenação possui todos os buffers sobrepostos uns aos outros.
Dentro do laço de repetição, precisamos inserir um novo laço de repetição que subtrai do buffer recém-gerado todos os outros buffers que já foram gerados para distâncias menores:
Por fim, concatenamos os resultados salvos na lista de buffers:
Note que, apesar de termos feitos a operação de clip antes, os buffers fizeram com que o resultado final excedesse a área de análise:
Por fim, podemos criar uma função para podermos repetir facilmente esse processo para qualquer conjunto de raios e qualquer GeoDataFrame:
Por fim, apresentamos as geometrias resultantes no visualizador da biblioteca Folium:
Nos exemplos dos buffers, criamos categorias para representar determinados intervalos de distâncias. Mas, o que fazer se desejássemos trabalhar com a distância absoluta de cada ponto da cidade?
Neste exemplo, utilizamos os dados de parques importados do GeoSampa, cujos arquivos também estão na pasta do Google Drive:
Como um dos arquivos é um Shapefile, enquanto os outros são GeoPackages, precisamos realizar uma leve modificação no nosso processo de importação para levar em conta essa diferença:
Em seguida, realizamos a concatenação das geometrias de todos os arquivos, para conter todos os tipos de parque em um único arquivo:
E realizamos a operação de clip() para obter apenas aqueles situados na área de análise:
Como gerar a malha de pontos utilizada como referência para a medição das distâncias?
O método GeoDataFrame( ) da biblioteca GeoPandas permite a criação de um GDF de pontos a partir de listas contendo a latitude e a longitude de cada ponto:
Para a criação automática dos conjuntos de coordenadas, podemos utilizar dois laços de repetição para combinar todas as latitudes e longitudes dentro de um intervalo:
Utilizamos as listas recém criadas para gerar um novo GeoDataFrame:
Um exercício para a aula de hoje seria, por exemplo, realizar o mesmo processo com os dados de pontos de ônibus, por exemplo.
Qualquer coisa que precisar, podem me mandar email: [email protected]
Link para todos os Colabs: https://docs.google.com/document/d/1hQAvkAAZKG394cDBjpido4yhOlV0_8Xfyuseew0aaSo/edit?usp=sharing
REFERÊNCIA:
Web Book PyGIS - Open Source Spatial Programming & Remote Sensing https://pygis.io/docs/a_intro.html