[ptbr] Consumir Funções do PostGIS direto do Python
Mauro Martins Jr
Posted on May 17, 2024
Todo o tutorial está sendo feito dentro de uma WSL2 com Ubuntu do Windows 11.
Primeiro precisamos de um PostgreSQL com PostGIS instalado. Nesse exemplo vamos iniciar utilizando Docker Container com o comando abaixo:
docker run --name postgis -p 5432:5432 -e POSTGRES_PASSWORD=admin -d postgis/postgis
Explicando os parâmetros;
-
--name postgis
: nome dado ao container -
-p 5432:5432
: mapeando a nossa porta 5432 com a porta 5432 do container -
-e POSTGRES_PASSWORD=admin
: definindo a senha do default do usuário postgres para admin -
-d
: roda o container em background, printando o ID do container, sem travar o terminal
Precisamos de um ambiente com Python instalado. Vou partir do princípio que o leitor sabe como criar esse ambiente, mesmo que seja em ambiente virtual. Nesse exemplo estou usando pipenv.
Criando um diretório, entrando no mesmo, criando o ambiente com Python3.12 e iniciando o ambiente:
mkdir sqlalchemy_postgis && cd sqlalchemy_postgis/ && pipenv --python 3.12 && pipenv shell
Vamos instalar umas dependências para esse tutorial:
pip install psycopg2 sqlalchemy
Criando um arquivo .py:
touch main.py
Dentro do arquivo:
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine, text
from sqlalchemy.sql.expression import literal_column
# no exemplo usaremos as seguintes variáveis setadas hardcoded para ser mais sucinto
user: str = "postgres" # usuário padrão do container postgis
password: str = "admin" # senha que definimos no comando docker run
host: str = "127.0.0.1" # vulgo localhost
database_name: str = "postgres"
engine = create_engine(f"postgresql://{user}:{password}@{host}/{database_name}")
Session = sessionmaker(bind=engine)
session = Session()
encoded_polyline = "sdxIy~vrkL"
def get_line_from_encoded_polyline(engine, encoded_polyline) -> str:
with engine.connect() as conn:
# Consulta SQL para chamar a função ST_LineFromEncodedPolyline
query = text(
f"SELECT ST_AsText(ST_LineFromEncodedPolyline('{encoded_polyline}')) AS geom"
)
result = conn.execute(query)
return result.scalar()
result = get_line_from_encoded_polyline(engine, encoded_polyline)
print(result)
Esse foi um exemplo simples de como utilizar funções do PostGIS diretamente do Python.
Posted on May 17, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.