Fernando Ferraz Ribeiro
Beth Leite Soares
O objetivo deste notebook exportar dados de um shapefile e dados baixados do open street maps para tabelas em um banco de dados georeferenciado (Postgis)
Mostrando o caminho que o servidor Jupyter carrega interpretador o Python (python.exe) e carregas o anbiente (\envs)
import os
import sys
print(sys.executable)
pathFix = sys.prefix
print(pathFix)
Algumas bibliotecas importadas apresentam um erro apendas na plataforma Windows.
Caso esteja rodando no windows e tenha problemas com o sistema de coordenadas de referĂȘncia (crs), rode a linha de comando abaixo:
pathFix = pathFix .replace('\\', '/')
print(pathFix)
os.environ["PROJ_LIB"] = pathFix + "/Library/share"
mais informaçÔes no Post sobre o Erro
# Biblioteca basica de programação cientĂfica em python
import numpy as np
# biblioteca de anĂĄlise de dados
import pandas as pd
# biblioteca de grĂĄficos
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import matplotlib.colors as colors
# Bibliotecas geopandas
import geopandas as gpd
# biblioteca de redes complexas
import networkx as nx
# biblioteca para acessar dados do Open sreet maps
import osmnx as ox
# bibliotecas de leitura e escrita em banco de dados
from geoalchemy2 import Geometry, WKTElement
# bibliotecas de leitura e escrita em banco de dados geoespaciais
from sqlalchemy import *
%matplotlib inline
ox.config(use_cache=True, log_console=True)
ox.__version__
# coordenada inicial x
xSC = 555000
# variação da coordenada x
deltaX = 2000
# coordenada inicial y
ySC = 8570000
# variação da coordenada y
deltaY = 2000
from shapely.geometry import Polygon
recorte = gpd.GeoSeries([ Polygon([(xSC,ySC), (xSC + deltaX , ySC), (xSC + deltaX, ySC + deltaY ), (xSC, ySC + deltaY )]) ])
A geometria criada pela linha de comando acima, embora tenha as corrdenadas relativas ao sistema de projeção Sigras 2000, nĂŁo tem nenhuma informação georreferenciada. Ă preciso informar qual o sistema de coordenadas de referĂȘncia utilizado ( coordenates reference sistem - crs). O Bloco de cĂłdigo abaxo informa que as coordenadas do recorte devem ser tratadas com o sistema Sigras 2000. com unidades em metro.
# colocando em coordenaadas SIRGAS 2000
recorte.crs = {'proj': 'utm', 'zone': 24, 'south': True, 'ellps': 'aust_SA', 'units': 'm', 'no_defs': True}
#recorte.crs ={'init': 'epsg:4674', 'units': 'm', 'no_defs': True}
# importando Shape dos bairros - polĂgonos
bairros = gpd.read_file('../shapefiles/BaseSSA/Limites/bairros_fim.shp', bbox = recorte )
# importando Shape das edificaçÔs - polilinhas
edf = gpd.read_file('../shapefiles/BaseSSA/edificacoes_polyline.shp', bbox = recorte)
# importando shape de pontos
edf_pt = gpd.read_file('../shapefiles/BaseSSA/edificacoes_point.shp', bbox = recorte)
bairros.head()
edf.head()
edf_pt.head()
O open street maps trabalha com coordenadas WGS84, definidas pelo cĂłdigo epsg 4326. O sistema WGS84 utiliza coordenadas em graus de latitude e longitude.
recorte.bounds
Para utilizar a mesma geometria limite da utilizada para a importação do Shapefile, Ă© preciso converter o sistema de coordenadas de referĂȘncia de Sigras 2000 para WGS84.
recorte_LL = recorte.to_crs({'init': 'epsg:4326'})
recorte_LL.bounds
O elemento de Ăndice 0 da coluna geometry Ă© um polĂgono da biblioteca shapely.
type(recorte_LL.geometry[0])
segundo a documentação do comando ox.graph_from_polygon ele recebe como primĂ©iro parĂąmetro um polĂgono ou multi-polĂgono da biblioteca citada.
O download do multi-grafo depende da conexĂŁo com a internet
gLatLon = ox.graph_from_polygon(
recorte_LL.geometry[0]
, network_type='all_private'
, truncate_by_edge= True
, retain_all = True
)
gLatLon
ox.plot_graph(ox.project_graph(gLatLon))
osm_pontos, osm_linhas = ox.save_load.graph_to_gdfs(gLatLon)
osm_linhas.head()
# Mudando o sistema de coordenadas de referĂȘncia
# Para o Shape de Pontos
osm_pontos.to_crs(bairros.crs, inplace = True)
# Para o Shape de Bairros
osm_linhas.to_crs(bairros.crs, inplace = True)
Odenando as colunas do shape das linhas
# Ordenando as colunas das linhas para que a coluna de geometria fique por Ășltimo
osm_linhas_cols = osm_linhas.columns.tolist()
osm_linhas_cols = [x for x in osm_linhas_cols if x != 'geometry']
osm_linhas_cols.append('geometry')
osm_linhas = osm_linhas[osm_linhas_cols]
osm_linhas.head()
osm_pontos.head()
fig2, layers2 = plt.subplots(figsize=(10,10)
#,dpi=30
)
recorte.plot(ax = layers2, color = 'blue', alpha = 1)
# Plotando os bairros
# Limites preto
# alpha - transparĂȘncia
# layers - quadro o qual poderĂĄ ser alterado os valores de xmin, xmax, tĂtulo e etc
bairros.plot(ax= layers2, color='yellowgreen', edgecolor='black', linestyle="--", lw= 1.5, alpha=1)
# Plotando as edificaçÔes com a cor vermelha
edf.plot(ax= layers2, color='darkred', lw= 0.7)
try:
edf_pt.plot(ax= layers2, color='orange', lw= 0.7, )
except:
pass
# importados do OSM
osm_linhas.plot(ax= layers2, color='teal', lw= 0.8, )
osm_pontos.plot(ax= layers2, color='indigo', lw= 0.4, )
# titulo da figura
fig2.suptitle('Imagem Teste', fontsize=16)
# limites do grĂĄfico
layers2.set_xlim(xSC, xSC + deltaX )
layers2.set_ylim(ySC, ySC + deltaY )
engine = create_engine('postgresql://postgres:1234@localhost:5432/sdb_arqb30')
referĂȘncia do epsg:
http://spatialreference.org/ref/epsg/sirgas-2000-utm-zone-24s/
bairros['geom'] = bairros['geometry'].apply(lambda x: WKTElement(x.wkt, srid= 31984))
bairros.drop('geometry', 1, inplace=True)
bairros.to_sql('bairrosSSAPoly', engine, if_exists='append', index=False,
dtype={'geom': Geometry('Polygon', srid= 31984)})
osm_linhas['geom'] = osm_linhas['geometry'].apply(lambda x: WKTElement(x.wkt, srid= 31984))
osm_linhas.drop('geometry', 1, inplace=True)
osm_linhas.to_sql('osm_linhas', engine, if_exists='append', index=False,
dtype={'geom': Geometry('LINESTRING ', srid= 31984)})