スポンサードリンク



こんにちは。sinyです。

本記事ではDjangoで地図アプリを作成できるGeoDjangoの入門チュートリアルということで記事にしてみました。

GeoDjangoとは

GeoDjangoはDjangoに標準で組み込まれている地理空間情報(GIS)を扱うためのモジュールです。

Geographic Information System の頭文字をとり、GISと言います。
GeoDjangoを使うと以下のようなマップWEBアプリを開発できます。

なお、GeoDjangoを利用するにあたってGISの基本的な概念や知識について把握しておくと理解が進むので、以下のサイト等を参考に基本知識を事前学習しておくことをお勧めします。

GeoDjango環境構築手順

この記事では以下の前提で環境構築を行います。

項目 バージョン
OS Windows10
データベース PostGres10.12-1
Python 3.6.5
Django 3.0.3
psycopg2 2.8.4
django-leaflet 0.26.0

 

Pythonのインストール

Pythonのインストール手順はここでは割愛します。
以下のサイト等を参考にインストールしてください。

 

PostgreSQLのインストール

以下のサイトからWindows x86-64のPostgresバージョン10.12のインストーラをダウンロードしてインストールします。

基本的にデフォルト設定のままでOKですが、Localeの設定ではJapanを選びます。

Postgresのインストールが終わると以下の画面が表示されるのでそのまま「Finish」ボタンを押してStack Builderを起動します。
Stack Builderを使ってPostGISをインストールしていきます。

スタックビルダーの画面が表示されるので、インストールしたPostgreSQL10を選択して「次へ」ボタンを押します。

今回はPostGIS 2.4(64bit)を選択します。

あとは基本的にデフォルトのままで進めていけばOKです。

以下のようなメッセージが表示されますがすべて「はい」を選びます。

インストールが終わると以下の画面が表示されます。

PostgreSQL/PostGIS環境変数、パスの設定

システム環境変数のPATHに「C:\Program Files\PostgreSQL\10\bin」を追加しておきます。
最後にDOSを起動して「psql -U postgres -l」でDBにログオンできればOKです。

※パスワードはインストール時に指定してpostgresユーザのパスワードを入力します。

GeoDjango環境の作成

ここからはDjangoとGeoDjangoの環境を作成しています。

仮想環境作成

ここではmyenvという仮想環境を作成した後アクティベートを行っておきます。

 

モジュールのインストール

pipコマンドを使って以下のモジュールをインストールします。

 

 Djangoバージョン3.0を入れると以下のエラーが発生したのでpipコマンドで明示的にsixモジュールをインストールすることで解消しました。
from django.utils import six
ImportError: cannot import name 'six'

 

OSGeo4Wのインストール

GeoDjangoをWindows環境で利用するにはOSGeo4Wをインストールする必要があります。
以下のサイトから64bit版のOSGeo4Wインストーラをダウンロードします。

ダウンロードしたインストーラをクリックしてOSGeo4Wをインストールしていきます。
「エクスプレスWeb-GISインストーラ」を選択してインストールします。

パッケージは「GDAL」だけにチェック入れます。

 

後はデフォルトのままインストールすればOKです。

データベース作成

GeoDjangoで利用するデータベースを作成します。
今回は以下のコマンドでgeodjangodbという名称のデータベースを作成します。

以下のコマンドでpostgresSQLに接続して、\lコマンドでDB一覧を確認します。

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

続いてGISを扱うためのPostGISエクステンションを作成します。

以下のコマンドでエクステンションが生成されていることを確認します。

DB管理ユーザを作成

続いて先ほど作成したデータベースの管理ユーザを作成します。
以下のコマンドではgeo_adminという管理ユーザを作成して、geodjangodbデータベースに対してフル権限を付与しています。

 

Djangoプロジェクトを作成する

通常のDjangoプロジェクトを作成します。(プロジェクト名:tutorial)

 

アプリケーションを作成する

mapという名称でdjangoアプリケーションを作成します。

 

settings.pyのカスタマイズ

まずは利用するデータベースをデフォルトのSqliteからPostGISに変更します。
※ユーザ名とパスワードは先ほど作成したDB管理用ユーザ(geo_admin)を指定

次にタイムゾーンなどを日本語に変更しておきます。

続いてINSTALLED_APPSにmapアプリケーションとGISを追加します。

ここまで設定したら一旦Djangoマイグレーションを実行します。

すると、以下のエラーが発生するのでこのエラーを回避するための設定を行います。

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

 

まず、settings.pyに以下の環境設定を追加します。

 

さらに仮想環境は以下にあるDjangoのファイル(myenv\Lib\site-packages\django\contrib\gis\gdal\libgdal.py)にgdal300を追加します。

変更前

 

変更後

gdal300はC:\OSGeo4W64\bin\gdal300.dllを指します。

再度makemigrationsを実行してエラーが出なくなればOKです。

 

一旦マイグレートを実行しておきます。

 

※補足

もし以下のようなエラーが出る場合は\myenv\Scripts\sqlite.dllをリネームします。
※これはC:\OSGeo4W64\bin\sqlite.dllと競合することが原因で発生する。

Djangoの管理者ユーザも作成しておきます。

 

インポートデータの準備と登録

この記事では、G空間情報センターで公開されている指定緊急避難場所データ_13東京都(GeoJson)のデータを使って、避難場所のデータをGeodjangoにインポートします。

避難場所のデータは以下のサイトからGeojson形式のデータを取得できます。

取得したgeojsonデータをhinanbasho.geojsonとしてdjangoプロジェクト直下に配置します。

まずは、取得したgeojsonのデータをDjangoのモデルに落とし込むためにdjangoのogrinspectコマンドを使ってデータ構造をチェックします。

実行結果は以下のようになります。

カラム名が日本語になっているのでアルファベットに変更し、max_lengthを適宜修正したらmodes.pyにモデルの定義を記載します。

今回は以下のようにモデルを定義します。

注意点は、通常のdjango.dbのmodelsではなくgis用のmodelsをインポートしている点です。

#from django.db import models
     ↓
from django.contrib.gis.db import models

テーブルをDBに反映させるためマイグレーションを行います。

続いて、サンプルデータをデータベースへ登録するスクリプトを作成します。
mapアプリケーション直下にload_data.pyというファイルを作成して以下のコードを記載します。

 

LayerMappingクラスを使ってDjangoのmodels.pyで定義したカラム名とgeojsonファイル内に定義されているカラム名のマッピング情報を定義しています。

mappingの左側がDjangoのカラム名、右側がgeojsonファイル内の定義名です。
続いてhinanbasho.geojsonをmap\dataフォルダ直下に配置した後に以下のコマンドを実行してデータベースへ登録します。

 

管理画面の設定

admin.pyに以下の設定を行い登録したデータを参照できるようにします。

 

上記設定をするとadminサイト上で以下のような地図データ入りのデータが登録されていることが確認できます。

この状態だと地図のデザインがあまり行けていないので、もう少し見た目の良いデザインに変更してみます。
django-leafletというモジュールを使うと簡単にデザインを変更することができます。

まずpipでdjango-leafletをインストールします。

settings.pyにleafletを登録します。

 

最後にadmin.pyを以下のように変更します。

先ほどのadminサイト上のデータ画面を更新し以下のように地図のデザインが変わればOKです。

 

今回は登録したGISデータをdjangoのadminサイト上で表示するところまで解説しました。

 

おすすめの記事