GeoDjangoの概要

GeoDjangoとは

GeoDjangoはDjangoに標準で含まれている地理空間データ用のモジュールです。
GeoDjangoモジュールを使うことで地理情報システム (GIS) のWebアプリケーションの作成が可能になります。
GeoDjangoの機能
  • Modelに地理空間情報フィールド を追加 (GeometryField, PointField ...)
  • ORMで空間演算に対応 (rast__contains (ST_Contains) ....)
  • Djanngoの管理画面で地理地理情報フィールドの編集 (GeoModelAdmin ...)
  • 地理空間情報APIを追加 (GeolocationAPI ...)
  • Manageコマンド (GeoDjango Management Commands)
GeoDjango Webアプリの基本的な構成例

GeoDjangoの利用例

  • インタラクティブにバックエンドで計算してからフロントサイドへ送信
  • アクセスユーザーの制限と管理
  • Pythonベースのデータ分析や機械学習等との連携または融合
  • Pythonベースの地理情報ライブラリの利用
    • 代表的な例
      • geopandas - pandasの地理情報拡張
      • osmnx - Open Street Mapのデータを操作
      • folium - LeafletをPythonから操作
      • geopy - 住所→緯度経度 緯度経度→住所 変換
      • shapely - GEOSライブラリを使用して、地理情報オブジェクトを図形的にいろいろ扱う

GeoDjangoのポイント

必要な周辺ツール (Geospatial libraries and Spatial database)

  • GDAL, GEOS, PROJ4をインストール
  • PostgresSQL, PostGIS / MySQL / Oracle / SQLite, SpatialLiteのどれかをインストール
* https://docs.djangoproject.com/en/2.0/ref/contrib/gis/install/#spatial-database

設定 (GeoDjango Setting Up (setting))

設定ファイルにGISデータベースエンジンとアプリケーションを設定
PostGISの場合
1
$ vi <プロジェクト>/settings.py
2
DATABASES = {
3
'default': {
4
'ENGINE': 'django.contrib.gis.db.backends.postgis', <-- エンジン設定
5
'NAME': 'geodjangodb', <-- 変更 データベース名
6
'USER': 'postgres', <-- 追加 ユーサ名
7
'HOST':'localhost', <-- 追加 ホスト名
8
'PASSWORD': 'xxxxxxxx', <-- 追加 パスワード
9
:
10
},
11
}
12
INSTALLED_APPS = [
13
:
14
'django.contrib.gis', <-- アプリケーション設定
15
:
16
]
Copied!

データベース定義(モデル) (GeoDjango Setting Up (model))

1
$ vi <アプリケーション>/models.py
2
3
from django.db import models
4
5
# This is an auto-generated Django model module created by ogrinspect.
6
from django.contrib.gis.db import models
7
8
class Border(models.Model):
9
n03_001 = models.CharField(max_length=10)
10
n03_002 = models.CharField(max_length=20)
11
n03_003 = models.CharField(max_length=20)
12
n03_004 = models.CharField(max_length=20)
13
n03_007 = models.CharField(max_length=5)
14
geom = models.PolygonField(srid=6668)
Copied!

データのインポート (Importing Spatial Data)

* 国土数値情報ダウンロードサービス: http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v2_3.html

シェープファイルからモデル定義のコードを生成 (Importing Spatial Data (ogrinspect))

シェープファイルからのモデル作成
1
座標系:JGD2011 -> SRID=6668
2
$ python manage.py ogrinspect --srid=6668 world/data/N03-17_14_170101.shp Border
3
4
# This is an auto-generated Django model module created by ogrinspect.
5
from django.contrib.gis.db import models
6
7
class Border(models.Model):
8
n03_001 = models.CharField(max_length=10)
9
n03_002 = models.CharField(max_length=20)
10
n03_003 = models.CharField(max_length=20)
11
n03_004 = models.CharField(max_length=20)
12
n03_007 = models.CharField(max_length=5)
13
geom = models.PolygonField(srid=6668)
Copied!

データインポート用のスクリプロプログラムを作成 (Importing Spatial Data (LayerMapping))

シェープファイルをプログラムでデータベースにロードpythonプログラムを編集する
  • border_mapping
    • モデルフィールドとシェーブファイル属性の対応表
  • transform
    • 座標データ変換はしない
  • encoding
    • シェープファイルの文字コードを指定
  • N03-17_14_170101.shp
    • ロードするシェープファイル
$ vi load.py
1
# -*- coding: utf-8 -*-
2
import os
3
from django.contrib.gis.utils import LayerMapping
4
from world.models import Border
5
6
# Modelとシェープファイルのカラムのマッピング
7
border_mapping = {
8
'n03_001' : 'N03_001',
9
'n03_002' : 'N03_002',
10
'n03_003' : 'N03_003',
11
'n03_004' : 'N03_004',
12
'n03_007' : 'N03_007',
13
'geom' : 'POLYGON',
14
}
15
# シェープファイル
16
border_shp = os.path.abspath(
17
os.path.join(os.path.dirname(__file__), 'data', 'N03-17_14_170101.shp'),
18
)
19
20
def run(verbose=True):
21
lm = LayerMapping(Border, border_shp, border_mapping, transform=False, encoding='sjis')
22
lm.save(strict=True, verbose=verbose)
Copied!

インポート実行 (Importing Spatial Data)

load.pyを実行してデータベースにロードする
1
$ python manage.py shell
2
In [1]: from world import load
3
In [2]: load.run()
4
In [3]: exit
Copied!

管理画面 (Geographic Admin)

$ vi <アプリケーション>/admin.py
1
from django.contrib.gis import admin
2
from .models import Border
3
4
#admin.site.register(Border, admin.GeoModelAdmin)
5
admin.site.register(Border, admin.OSMGeoAdmin)
Copied!
$ vi <プロジェクト>/urls.py
1
from django.urls import include, path
2
from django.contrib.gis import admin
3
urlpatterns = [
4
path('admin/', admin.site.urls),
5
]
Copied!

GeoJSON Serializer

データベースから指定のデータをGeoJSON形式で取得
1
from django.core.serializers import serialize
2
import json
3
from world.models import Border
4
5
encjson = serialize('geojson', Border.objects.filter(n03_004="中原区"),
6
srid=4326, geometry_field='geom', fields=('n03_004',) )
7
result = json.loads(encjson)
Copied!

GeoDjangoアプリの作成基本例

leaflet.js

MAPD: tweetmap

Twitterつぶやきのダッシュボード
* https://www.mapd.com/demos/tweetmap/

MAPD:NYC Taxi Rides

ニューヨークのタクシーの乗降ダッシュボード
* https://www.mapd.com/demos/taxis/#/dashboard?_k=aigptu

5952 for GTFS

CesiumでGTFSデータの可視化ダッシュボード