GeoDjangoのインストール

GISライブラリインストール (Windowsの場合のみ)

OSGeo4Wインストール

GeoDjangoが必要とする、GDAL(Geospatial Data Abstraction Library), GEOS (Geometry Engine, Open Source) ,PROJ4 (Cartographic Projections Library) ライブラリをOSGeo4Wインストーラでインストールしまします

OSGeo4Wインストーラを https://trac.osgeo.org/osgeo4w/wiki/OSGeo4W_jp からダウンロードして実行します。

「エクスプレス Web-GIS インストール」を選択して「次へ」をクリック

ダウンロードサイトは「http://osgeo4w-oslandia.com」を選択して「次へ」をクリック

[パッケージの選択]リストで、[GDAL]のみを選択。MapServer等の他に選択肢を外して「次へ」をクリック

「依存関係に対応するパッケージをインストール(推奨)」をチェックして、「次へ」をクリック

「上記のライセンス条項に同意しました」をチェックして、「次へ」をクリック

パッケージが自動的にダウンロードされ、インストールされます。

インストールが終わったら「完了」をクリックして終了します。

環境変数設定 (Windowsの場合)

GeoDjangoを使用するには、OSGeo4Wディレクトリの情報をWindowsシステム環境変数に追加する必要があります。 コマンドプロンプトを新規に起動したときには下記のコマンドを実行して設定を追加します。

C:¥OSGeo4W64の場合

set POSTGRES_ROOT=C:¥Program Files¥PostgreSQL¥9.6
set OSGEO4W_ROOT=C:¥OSGeo4W64
set GDAL_LIBRARY_PATH=C:¥OSGeo4W64¥bin
set GDAL_DATA=%OSGEO4W_ROOT%¥share¥gdal
set PROJ_LIB=%OSGEO4W_ROOT%¥share¥proj
set PATH=%OSGEO4W_ROOT%¥bin;%POSTGRES_ROOT%¥bin;%PATH%;

C:¥QGIS2の場合

set POSTGRES_ROOT=C:¥Program Files¥PostgreSQL¥9.6
set GDAL_LIBRARY_PATH=C:¥QGIS2¥bin
set GDAL_DATA=%OSGEO4W_ROOT%¥share¥gdal
set PROJ_LIB=%OSGEO4W_ROOT%¥share¥proj
set PATH=%OSGEO4W_ROOT%¥bin;%POSTGRES_ROOT%¥bin;%PATH%;

Note

  • コマンドプロンプトのウィンドウを閉じると設定が無効になるます。

  • コマンドプロンプトを起動するたびに設定する必要がありますので、batファイルを作成しておくことをお勧めします。

  • 毎回設定するのが大変な場合は、システムの環境変数に直接設定をするとことも出来ます。

batファイルの例

$ vi genv.bat

@echo off
set POSTGRES_ROOT=C:\Program Files\PostgreSQL\9.6
set OSGEO4W_ROOT=C:¥OSGeo4W64
set GDAL_LIBRARY_PATH=C:¥OSGeo4W64¥bin
set GDAL_DATA=%OSGEO4W_ROOT%¥share¥gdal
set PROJ_LIB=%OSGEO4W_ROOT%¥share¥proj
set PATH=%OSGEO4W_ROOT%¥bin;%POSTGRES_ROOT%¥bin;%PATH%;

settings.pyの例

$ vi プロジェクト名>\settings.py

import os
if os.name == 'nt':
    import platform
    POSTGRES = r"C:\Program Files\PostgreSQL\9.6"
    OSGEO4W = r"C:\OSGeo4W"
    if '64' in platform.architecture()[0]:
        OSGEO4W += "64"
    assert os.path.isdir(OSGEO4W), "Directory does not exist: " + OSGEO4W

    os.environ['OSGEO4W_ROOT'] = OSGEO4W
    os.environ['POSTGRES_ROOT'] = POSTGRES
    os.environ['GDAL_LIBRARY_PATH'] = OSGEO4W + r"\bin"
    os.environ['GEOS_LIBRARY_PATH'] = OSGEO4W + r"\bin"
    os.environ['GDAL_DATA'] = OSGEO4W + r"\share\gdal"
    os.environ['PROJ_LIB'] = OSGEO4W + r"\share\proj"
    os.environ['PATH'] = OSGEO4W + r"\bin;" + POSTGRES + r"\bin;" + os.environ['PATH']

環境設定のエラー対策 (Windowsの場合)

GDAL not installed (gdalxxx.dllが見つからない) エラー

GDALのライブラリが見つからない

    django.core.exceptions.ImproperlyConfigured: Could not find the GDAL library (tried "gdal202", "gdal201", "gdal20", "gdal111", "gdal110", "gdal19"). Is GDAL installed? If it is, try setting GDAL_LIBRARY_PATH in your settings.

GDALのライブラリが更新されている場合にエラーになることがあります。GDAL_LIBRARY_PATHのパスに"gdalxxx.dll"があるか確認をしてください。 GDALのライブラリが"gdal204.dll"に更新されていて、かつDjangoのバージョンが古い場合にはDjangoのソースにパッチをあててください。 このパッチはDjangoの最新版では既に対応済みですので、古いDjangoを使う場合のときだけに必要です。

ソースパッチは、Djangoのソースコードに「gdal204」を追加します。

「gdal204」追加する例

    $ vi %PYTHON_ROOT%\Lib\site-packages\django\contrib\gis\gdal\libgdal.py

    elif os.name == 'nt':
        # Windows NT shared libraries
        lib_names = ['gdal204', 'gdal202', 'gdal201', 'gdal20', 'gdal111', 'gdal110', 'gdal19']

パッチをあてない場合は、GDALのバージョンを下げる必要があります。

"gdal204.dll"の代わりに"gdal111.dll"を使う場合

Djangoのソースを編集したくない場合は、"gdal204.dll"の代わりに"gdal111.dll"を使う方法があります。 QGISをインストールすると、GDALライブラリgdalxxxx.dllがインストールされるのでこれを使用します。 確認した時点では、QGIS 3.4.10 LTRをインストールすると"gdal111.dll"がインストールされます。

sqlite3.dllのコンフリクト

Windowsの場合、OSGeo4Wインストーラでgdalライブラリをインストールするとsqlite3.dllがインストールされます。 Pythonでもsqlite3.dllがインストールされるので、同名ファイルで衝突発生してエラーが発生する場合があります。 エラーになったら、Python側のenv¥Scripts¥sqlite3.dllの名前を変更して重複を避けてください

C:¥> ren env¥Scripts¥sqlite3.dll 000.sqlite3.dll 

C:¥> dir env¥Scripts¥000.sqlite3.dll
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 72DC-FA37 です
C:\Users\xxxx\Documents\geodjango\env\Scripts のディレクトリ
2018/06/12  15:08         1,153,176 000.sqlite3.dll
            1 個のファイル           1,153,176 バイト
            0 個のディレクトリ  89,404,837,888 バイトの空き領域

OSGeo4WやQGIS2のPython2とのコンフリクト

OSGeo4W ShellやQGIS2の環境変数を設定した場合、OSGeo4WやQGISでインストールされているpythonが2系の為に、python.exeがコンフリクトする場合があります。

確認方法

C:¥> where python
C:¥QGIS2¥bin¥python.exe
C:¥Python36¥python.exe

バージョン確認

C:¥> python -V
Python 2.1.17

C:¥> dir C:¥QGIS2¥bin¥python*.*
     :
    2017/09/17 03:27  python.exe
    2017/09/17 03:27  python27.dll
    :

その場合には利用するPython3を有効にするために、パスの優先順位を変更するか、python3.exeファイルを利用する。

優先順位の変更例

python3のあるディレクトリーをPATHの一番最初に設定し、仮想環境のパッケージのディレクトリをPYTHONPATHに設定する

set PATH=<仮想環境実行ディレクトリ>¥env¥bin;%PATH%;
set PYTHONPATH=<仮想環境実行ディレクトリ>¥env¥lib¥python3.6¥site-packages

例)
set PATH=C:¥Users¥xxxx¥Documents¥geodjango¥env¥bin;%PATH%;
set PYTHONPATH=C:¥Users¥xxxx¥Documents¥geodjango¥env¥lib¥python3.6¥site-packages

PostGISのデータベースを作成

PostGISのデータベースを作成します。データベースは「geodjangodb」とい名前で作成します。

データベース作成

(env) $ createdb -U postgres -E UTF-8 geodjangodb
パスワード:

PostGISのエクステンションを作成

(env) $ psql -U postgres -d geodjangodb -c "CREATE EXTENSION postgis;"
ユーザ postgres のパスワード:
CREATE EXTENSION

エクステンションの確認

(env) $ psql -U postgres -d geodjangodb -c "select * from pg_available_extensions;"
ユーザ postgres のパスワード:
name | default_version | installed_version | comment
--------+--------------+-------------------+------------------------------
     :
postgis | 2.3.7        | 2.3.7             | PostGIS geometry, geography, and raster spatial types and functions

データベースの確認

(env) $ psql -U postgres -l
ユーザ postgres のパスワード:
                                            データベース一覧
    名前     |  所有者  | エンコーディング |      照合順序      | Ctype(変換演算子)  |      アクセス権
-------------+----------+------------------+--------------------+--------------------+-----------------------
geodjangodb | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
postgres    | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
template0   | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
            |          |                  |                    |                    | postgres=CTc/postgres
template1   | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
            |          |                  |                    |                    | postgres=CTc/postgres
(4 行)

アプリケーション作成

マップ表示をするアプリケーションの作成をします。

アプリケーション作成コマンド $ python manage.py startapp <アプリケーション名>

(env) $ python manage.py startapp world

ファイル構成

geodjango           <-- プロジェクトのルート
├── manage.py       <-- プロジェクトの管理用のスクリプト
├── geodjango       <-- プロジェクト設定
│   ├── __init__.py     <-- Pythonの初期化パッケージファイル
│   ├── settings.py     <-- プロジェクトの設定ファイル
│   ├── urls.py         <-- プロジェクトのURLパターン設定ファイル
│   └── wsgi.py         <-- プロジェクトのWSGI(ウィズギー)インターフェース設定ファイル
└── world           <-- アプリケーションディレクトリ
    ├── __init__.py     <-- Pythonの初期化パッケージファイル
    ├── admin.py        <-- 管理サイトの設定ファイル
    ├── apps.py         <-- アプリケーションの設定ファイル
    ├── migrations      <-- データベースのマイグレーションファイル
    │   └── __init__.py <-- Pythonの初期化パッケージファイル
    ├── models.py       <-- モデル定義のファイル
    ├── tests.py        <-- テストの記述するファイル
    └── views.py        <-- ビューを記述するファイル

psycopg2をインストール

psycopg2 Pythonモジュールは、PythonとPostgreSQLデータベース間のインタフェースライブラリです。 下記のバイナリーバージョンをインストールします。

バイナリーバージョンの場合

(env) $ pip install psycopg2-binary
    -> psycopg2-binary==2.7.4

コンパイルバージョンの場合

(env) $ pip install psycopg2

データベースとアプリケーションの設定

データベースのENGINEをPostGISに変更とアプリケーションの追加をします。

設定ファイル「geodjango/settings.py」を編集します。

(env) $ vi geodjango/settings.py
# django.contrib.gis.db.backends.postgisに変更
DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',  <-- 変更
        'NAME': 'geodjangodb',  <-- 変更  データベース名
        'USER': 'postgres',     <-- 追加  ユーサ名
        'HOST':'localhost',     <-- 追加  ホスト名
        'PASSWORD': 'xxxxxxxx', <-- 追加  パスワード
    }
}
#'django.contrib.gis'と'world'を追加。
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.gis',       <-- 追加
    'world.apps.WorldConfig',   <-- 追加 (obsolete: world)
)

PostGISのデータベースにテーブルを作成します。

(env) $ python manage.py migrate
Operations to perform:
    Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
    Applying contenttypes.0001_initial... OK
    Applying auth.0001_initial... OK
    Applying admin.0001_initial... OK
    Applying admin.0002_logentry_remove_auto_add... OK
    Applying contenttypes.0002_remove_content_type_name... OK
    Applying auth.0002_alter_permission_name_max_length... OK
    Applying auth.0003_alter_user_email_max_length... OK
    Applying auth.0004_alter_user_username_opts... OK
    Applying auth.0005_alter_user_last_login_null... OK
    Applying auth.0006_require_contenttypes_0002... OK
    Applying auth.0007_alter_validators_add_error_messages... OK
    Applying auth.0008_alter_user_username_max_length... OK
    Applying auth.0009_alter_user_last_name_max_length... OK
    Applying sessions.0001_initial... OK

PostGISに管理画面にログイン権限のある管理ユーザのアカウントを作成します。 Webアプリ起動されていたら、CTRL+Cで一旦止めます

管理ユーザのアカウントを作成します

(env) $ python manage.py createsuperuser
Username (leave blank to use 'xxxxx'): admin
Email address: hoge@fuga.com
Password: xxxxxx
Password (again): xxxxxx
Superuser created successfully.

Last updated