Anaconda 配下の Python から PostGIS のデータを扱う(Ubuntu 上)

PostGIS は、PostgreSQL サーバ内で動作する拡張機能であり、C 言語で実装されている。そのため、Anaconda 配下の Python から PostGIS のデータを扱う場合でも、PostGIS 自体を Anaconda 向けに用意する必要は無い。Python 側には、データベース接続用のパッケージ(psycopg2、SQLAlchemy)と地理空間データ用のパッケージ(GeoPandas)をインストールする。

前準備

  1. 前準備として Anaconda がインストール済みであること
  2. conda パッケージの更新と、古い conda パッケージファイルの削除

    GeoPandas とその依存パッケージは conda-forge チャンネルで配布されている。チャンネルを混在させると依存関係の解決に失敗することがあるため、conda-forge を追加したうえで strict のチャンネル優先度を設定する。

    端末で、次のコマンドを実行

    conda config --add channels conda-forge
    conda config --set channel_priority strict
    conda upgrade -y --all
    conda clean -y --packages
    

    (途中省略)

    (途中省略)

  3. PostgreSQL と PostGIS のインストール

    PostGIS は Ubuntu のパッケージからインストールする。「postgresql-18-postgis-3」の「18」は、使用する PostgreSQL のメジャーバージョンに合わせる。バージョンは「psql --version」で確認できる。Ubuntu 26.04 LTS の標準リポジトリには PostgreSQL 18 が含まれる。

    端末で、次のコマンドを実行

    sudo apt -y update
    sudo apt -y install postgresql postgis postgresql-18-postgis-3
    psql --version
    
  4. データベースでの PostGIS 拡張の有効化

    PostGIS の機能は、データベースごとに有効化する。「hoge」は、使用するデータベース名に置き換えて実行すること。

    端末で、次のコマンドを実行

    sudo -u postgres psql -d hoge -c "CREATE EXTENSION IF NOT EXISTS postgis;"
    

Anaconda 配下の Python から PostGIS を使ってみる

  1. Anaconda 配下の Python に psycopg2, SQLAlchemy, GeoPandas, GDAL をインストール

    端末で、次のコマンドを実行

    conda install -y -c conda-forge psycopg2 sqlalchemy geopandas gdal
    
  2. 次のプログラムを実行してみる

    データベース名(下のプログラムでは「hoge」)、ユーザ名(「dbadmin」)、パスワード(「mypassword」)、テーブル名(「P」)、ジオメトリの列名(「geo」)は、実際の値に置き換えて実行すること。パスワードに「@」「:」「/」などの記号が含まれる場合は、URL エンコードが必要である。

    GeoPandas では、PostGIS からの読み込みに geopandas.read_postgis を使う。接続には SQLAlchemy のエンジンまたは接続オブジェクトを渡す。

    import geopandas
    from sqlalchemy import create_engine
    
    engine = create_engine("postgresql+psycopg2://dbadmin:mypassword@localhost:5432/hoge")
    q = "select * from P;"
    a = geopandas.read_postgis(q, engine, geom_col='geo')
    print(a)
    
  3. インストールされたパッケージのバージョンの確認

    端末で、次のコマンドを実行

    python -c "import geopandas; print(geopandas.__version__)"
    python -c "import geopandas; geopandas.show_versions()"