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.