DEV Community

Cover image for [ptbr] Consumir Funções do PostGIS direto do Python
Mauro Martins Jr
Mauro Martins Jr

Posted on

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

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Vamos instalar umas dependências para esse tutorial:

pip install psycopg2 sqlalchemy
Enter fullscreen mode Exit fullscreen mode

Criando um arquivo .py:

touch main.py
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

Esse foi um exemplo simples de como utilizar funções do PostGIS diretamente do Python.

Top comments (0)