Djangoには django.contrib.gis というパッケージが標準で搭載されています。
この django.contrib.gis を使ったWebアプリケーションを作ろうと思ったのですがその環境を作るのにとてつもなくハマってしまいました…
環境
VPS(Ubuntu 22.04 LTS)にdokkuをインストールしています。今回 dokku apps:create したものにDjangoアプリを載せようとしていました。
ハマったこと
GeoDjangoのドキュメントにあった地理空間ライブラリのインストールに従って、必要なパッケージをインストールしようと思いました。
具体的には https://github.com/heroku/heroku-buildpack-apt.git を buildpackに追加し、 Aptfile を作成。
Aptfile 内に必要なパッケージを記述しました
# Aptfile binutils libproj-dev libatlas-base-dev gdal-bin
起こったこと
デプロイ中に実行する django manage.py collectstatic --no-input が失敗しデプロイできなくなりました
File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/db/backends/postgis/adapter.py", line 6, in <module>
from django.contrib.gis.geos import GEOSGeometry
File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/geos/__init__.py", line 6, in <module>
from .collections import ( # NOQA
...<4 lines>...
)
File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/geos/collections.py", line 7, in <module>
from django.contrib.gis.geos.geometry import GEOSGeometry, LinearGeometryMixin
File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/geos/geometry.py", line 9, in <module>
from django.contrib.gis import gdal
File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/gdal/__init__.py", line 29, in <module>
from django.contrib.gis.gdal.datasource import DataSource
File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/gdal/datasource.py", line 40, in <module>
from django.contrib.gis.gdal.driver import Driver
File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/gdal/driver.py", line 5, in <module>
from django.contrib.gis.gdal.prototypes import ds as capi
File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/gdal/prototypes/ds.py", line 10, in <module>
from django.contrib.gis.gdal.libgdal import lgdal
File "/app/.heroku/python/lib/python3.13/site-packages/django/contrib/gis/gdal/libgdal.py", line 71, in <module>
lgdal = CDLL(lib_path)
File "/app/.heroku/python/lib/python3.13/ctypes/__init__.py", line 390, in __init__
self._handle = _dlopen(self._name, mode)
~~~~~~~^^^^^^^^^^^^^^^^^^
OSError: libblas.so.3: cannot open shared object file: No such file or directory
OSError: libblas.so.3: cannot open shared object file: No such file or directory が出てしまっています
解決法
https://github.com/heroku/heroku-buildpack-apt.git のbuildpackでなく、
Herokuが公式に提供している heroku-geo-buildpack を導入することで解決します
起きた理由
エラーでググると同じ症状が
どうも、 heroku-buildpack-apt においてインストールしたパッケージがサブディレクトリに配置されていると検出してくれないようです。
対応のプルリクエストも出ているのですが放置されています。
解決策に提示した https://github.com/heroku/heroku-geo-buildpack ではGEO/GISで必要なライブラリのインストールだけでなくきちんとパスの処理も実行されている ことから問題なく動作します。