[ptbr] Consumir Funções do PostGIS direto do Python

RMAG news

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(fpostgresql://{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(
fSELECT 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.