GeoDjangoのチュートリアル

PostGISに入力したデータを使った処理を作成して行きたいと思います。

RESTful APIの作成

leaflet.js等のJavaScriptとサーバとのインターフェースとしてRESTful APIを実装します。 DjangoでRESTful APIを実装する為に、Django REST framework(DRF)を使用します。 django-rest-framework-gisは、このDRFに地理空間機能拡張したモジュールです。

pipコマンドを使って追加をします。

  • djangorestframework-gis : RESTful APIモジュール Django REST framework(DRF)の地理空間機能拡張バージョン

  • django-filter : 検索機能モジュール

  • markdown : Markdown変換ライブラリ

(env) $ pip install djangorestframework-gis
(env) $ pip install django-filter   # Filtering support
(env) $ pip install markdown        # Markdown support for the browsable API.
(env) $ pip freeze
  :
djangorestframework==3.8.2
djangorestframework-gis==0.13
django-filter==1.1.0
Markdown==2.6.11

Note

編集対象ファイル

geodjango/settings.py設定

インストールしたアプリケーションを設定ファイルのsettings.pyに追加します

world/serializers.py作成

シリアライザはデータベースとAPIのとの間でデータフォーマットの変換をします。 worldアプリにserializers.pyファイルを作成します。

world/views.py作成

ビューでリクエストに対するレスポンスの設定をします。

設定項目

  • queryset: クエリーデータ一覧

  • serializer_class: シリアライズ・デシリアライズで使用するserializer_classを指定

  • pagination_class: ページングの設定

  • filter_backends: データを絞り込む方法を設定

    • DistanceToPointFilter: 指定した点からの距離で絞り込むフィルタ

    • InBBoxFilter: バウンダリでの絞り込むフィルタ。南西端、北東端の経度、緯度を指定する

  • distance_filter_field: フィルタの対象フィールドを設定

  • bbox_filter_field: フィルタの対象フィールドを設定

  • distance_filter_convert_meters: 距離でのフィルター (??? 多分。。。。)

django-rest-framework-gisのフィルター

  • InBBOXFilter

  • GeometryFilter

  • GeoFilterSet

  • TMSTileFilter

  • DistanceToPointFilter

geodjango/urls.py設定

URLを設定します

router.registerにURLの接尾辞とViewを指定します。これをinclude(router.urls)で追加することで/api/配下のルーティングルールを登録します。

Browsable APIによる確認

Django REST frameworkのBrowsable APIを利用して、作成したREST APIの確認をします。

Webサーバを立ち上げて、http://localhost:8000/api/arrow-up-right にアクセスします。

行政区域データ

指定した点からの距離で絞り込むフィルタを指定

小学校区データ

指定した点からの距離で絞り込むフィルタを指定

公共施設データ

指定した点からの距離で絞り込むフィルタを指定

バス停留所データ

指定した点からの距離で絞り込むフィルタを指定

ページサイズとページ番号を指定

バウンダリを指定

データIDを指定

GeoJSON Serializer

GeoJSON Serializerを使ってLeafletでGeoJSONをマップに表示します。

編集対象ファイル

Note staticとtemplatesは、フレームワークで決められた静的データとテンプレートの置き場所で(geodjango/settings.pyで変更可能)、アプリケーション名の下にそれぞれのファイルを配置します。

geodjango/urls.py設定

2つのURLを設定します。

  • ルート”/”でマップ表示するURL

  • REST APIでGeoJSONをgetするURL

URLを設定します

static/world/css/app.css編集

マップページのCSSを記述します。

static/world/js/app.js編集

マップページのJavaSvriptを記述します。

templates/world/index.html編集

マップページのHTMLを記述します。

world/views.py編集

2つのビューを作成します。

  • REST APIでGeoJSONを返すビュー

  • マップ表示するビュー

REST APIでGeoJSONを返すビューを作成。札幌市中央区のポリゴンを返します。

マップ表示するビューを作成

ユーザ認証

Webサイトで公開した場合に誰でもアクセス可能な状態です。 サイト閲覧を権限を管理するためにアクセス制限機能をつけます。

編集対象ファイル

Note

  • ユーザ管理は、管理画面 http://127.0.0.1:8000/admin/arrow-up-right で行います。

  • ユーザ認証はセッションで行ってます。

  • デフォルトのセッション有効期間は2週間です

参考サイト

ユーザー認証の機能はDjangoの標準で用意されています。ユーザ向けに表示するHTML等は別途作成する必要があります。

テンプレートを読み込むディレクトリを追加

ログイン関連のURLを設定します

アカウントにURLを追加

アクセス制限させたい関数に@login_requiredアノテーションをつけます

ログイン画面のHTMLを作成します

メインページで、http://127.0.0.1:8000/にアクセスした時に、ログインしてない時は、ログイン画面に遷移します。arrow-up-right

Last updated