見出し画像

Djangoで地図アプリ開発をしよう【前編】

この技術ノートでは、Djangoで以下のような避難所マップWEBアプリをローカルPC環境で開発する方法について学ぶことができる内容になっています。



サイト全体の画面

画像82


このチュートリアルノートは約9万字、80枚の画像で手順を詳細に説明するようにしました。

技術的にはGeodjangoという機能を使ってウェブアプリ開発を行います。

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

Geodjangoは非常に便利ですが、日本ではまだ情報が非常に少ないため、初心者が入門するハードルが高い状態なのではないかと思います。
少しでもそのハードルを下げ、Geodjango入門のきっかけになればと思いこのチュートリアルノートを書きあげました。

この技術チュートリアルを通してできるようになること

大きく以下の3点についてのノウハウを習得することができます。

①Djangoで位置情報を扱った地図アプリケーション開発ができるようになる。
②DjangoとGoogle MAP APIを連携させる方法を学べる。
③DjangoでBootstrapテンプレートを適用してデザインを整える。


対象者

このチュートリアルのおすすめ対象者は、こんな人です。

1. Pythonの基礎構文がわかる人。
2. python入門者、またはチュートリアルはやったけどちょっとした応用事例を学びたい人。
3. Djangoに興味がある人。
4.MAPアプリケーションを開発したい人。


前提知識

このチュートリアルでは以下の基礎知識がある人を前提としています。

①Pythonの基礎構文の理解
②Djangoの基礎知識の理解
③JavaScriptの基礎構文の理解

Pythonに関しては特にクラスの基本的な考え方を理解していることが望ましいです。
Djangoについてはそこまで細かい機能を利用しない内容になっているので、プロジェクト、アプリケーション、モデル、テンプレート等の基本的な使い方を理解していると学習しやすいです。

Djangoがまったく初心者という方は以下のサイト等で基本部分を事前に学んでおきましょう。


Django初心者の方は、以下のDjango初心者向けNoteを事前学習しておくとスムーズに学習できます。

JavaScriptについてはGoogle Map API連携の実装部分で利用しますので、基礎構文(特に配列変数、関数、クラスなど)については事前に理解しておくことをお勧めします。


サポート体制

本記事に関する質問はいつでも受け付けています。
以下のいづれかの方法でお問い合わせいただければ返信致します。

・TwitterID「@shinya_hd」にDM
問い合わせサイトから質問
※業務都合上返信が遅れる場合があります。


開発環境

この記事ではWindows10(python3.x)を前提で解説していきます。
なお、Djangoで地図アプリを開発する場合、OSの種類によって環境構築手順が大きく異なります。

なお、別途リリース予定の後編では、Ubuntu環境を前提にAWS上にデプロイを行いますので、こちらを参考にすればローカル環境上のUbuntuで開発は可能です。

※ブラウザはChrome推奨です。

また、各モジュールは以下のバージョンを利用します。

Django:バージョン3.x
PostgresSQL: バージョン11
PostGis:バージョン3.0

※各モジュールのバージョンが上記組み合わせと異なる場合Geodjango環境がうまく動作しないケースがあるので注意してください。

ソースコード

このチュートリアルで開発するコースコード一式は以下のGITHUBで公開していますので、ご自由にお使いください。

ローカル開発環境の構築

このチュートリアルではWindows10環境にGeoDjango開発環境を構築していきます。

pythonインストール

pythonのインストールについては以下のサイト等を参考にして各自インストールしておきましょう。


PostgreSQLのインストール

まず最初に以下のサイトからPostgreSQLバージョン11のインストーラーをダウンロードします。

サイトにアクセスしたらPostgreSQL Versionが「11.xx」のWindows x86-64の「Download」をクリックしてインストーラーをダウンロードしましょう。

画像1

インストーラーファイル「postgresql-11.xx-xx-windows-x64.exe」がダウンロードされたらダブルクリックでインストールを開始します。

以下の画面が表示されるので「Next」ボタンを押します。


画像2

インストールディレクトリを指定する画面が表示されますが、デフォルトのまま「Next」ボタンを押します。

画像3

インストールコンポーネントの選択画面が表示されますが、デフォルトですべてにチェックが入っているのでこの状態のまま「Next」ボタンを押します。

画像4

続いてPostgreSQLのデータファイルを配置するディレクトリの設定画面が表示されますが、ここもデフォルトのまま「Next」ボタンを押します。

画像5

次にPostgreSQLの初期ユーザ「postgres」のパスワードを設定する画面が表示されるので、任意のパスワードを指定後に「Next」ボタンを押します。

ここで設定したpostgresユーザのパスワードは後程利用するので忘れないように控えておきましょう。


画像6

PostgreSQLで利用するポート番号の設定画面が表示されますがここもデフォルトの5432ポートのまま「Next」ボタンを押します。

画像7

ロケールの設定画面が表示されるので、「Japanese,Japan」を選択して「Next」ボタンを押します。

画像8

確認画面が表示されるので「Next」ボタンを押します。

画像9

以下の画面が表示されるので「Next」ボタンを押します。

画像10

PostgreSQLのインストール処理が開始されるのでしばらく待ちましょう。

インストール処理が完了すると以下の画面が表示されるので、「Stack Builder may be ***」にチェックが入っていることを確認して「Finish」ボタンを押します。

画像11


すると、以下の画面が自動的に表示されます。
ここからは地理空間情報を扱うために必要なPostGISをインストールしていきます。
画面中央のリストから「PostgreSQL 11(x64) on port 5432」を選択後に「次へ(N)」ボタンを押します。


画像12

Spatial Extensionsを展開して「PostGIS 3.0 Bundle for PostgreSQL11」にチェックを入れたら「次へ(N)」ボタンを押します。

画像13


そのまま「次へ(N)」ボタンを押します。

画像14

しばらくすると以下のような画面が表示されてダウンロード処理が開始されます。

画像15

以下の画面が表示されたらそのまま「次へ(N)」ボタンを押します。

画像16


ライセンス同意の画面が表示されるので「I Agree」をクリックします。

画像17


PostGIS」にチェックがついていることを確認後に「Next」ボタンを押します。

画像18

インストールフォルダ指定の画面が表示されますが、デフォルトのまま「Next」を押します。

画像19

以下の環境変数の設定画面が3つ表示されるのですべて「はい」を選択します。

画像20


PostGISのインストール処理が完了したら「Close」ボタンを押します。

画像21


以下の画面も「終了」ボタンを押して消しておきましょう。

画像22

PostgreSQLサーバはWindowsが起動時に自動で実行されるように設定されます。

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

続いてシステム環境変数のPATHに「C:\Program Files\PostgreSQL\11\bin」を追加します。
画面左下の「ここに入力して検索」の欄に「env」と入力後表示される「システム環境変数の編集」を選択します。

画像23


詳細設定タブの「環境変数」ボタンをクリックします。

画像24

「システム環境変数」の「Path」を選択して「編集」ボタンをクリックします。

画像25


新規」ボタンを押して一番下に「C:\Program Files\PostgreSQL\11\bin」と入力して「OK」ボタンを押します。

画像26

以上でPostgreSQL/PostGIS環境変数、パスの設定は完了です。

ここまで来たら、一旦PostgreSQLに接続できることを確認しておきましょう。

DOSを起動してコマンド「psql -U postgres -l」を実行します。
postgresユーザのパスワードを聞かれるのでインストール時に指定したパスワードを入力します。

psql -U postgres -l
ユーザ postgres のパスワード:

以下のような情報が表示されればOKです。

画像27


仮想環境作成

ローカル環境で開発するための仮想環境を作成していきます。

DOS画面を起動したら任意のディレクトリに移動します。
ここでは「C:\geodjango\venv」を作業ディレクトリとして説明していきます。

以下のコマンドを実行して仮想環境(geodjango)を作成します。

cd C:\geodjango\venv
python -m venv geodjango

作成した仮想環境をアクティベートします。

geodjango\scripts\activate

以下のように(仮想環境名)が表示されればOKです。

(geodjango) C:\geodjango\venv> 


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

Geodjango環境構築に必要な以下のモジュールをインストールします。

django:バージョン3.xを利用します。
six:Djangoバージョン3.xで必応になる。
psycopg2:PythonとPostgreSQL間の連携のために利用します。

仮想環境をアクティベートした状態で以下のコマンドを実行します。

pip install django
pip install psycopg2
pip install six

pip freezeコマンドを実行してインストールされたモジュールのバージョンを確認しておきましょう。

(geodjango) C:\geodjango\venv>pip freeze
asgiref==3.2.7
Django==3.0.5
psycopg2==2.8.5
pytz==2019.3
six==1.14.0
sqlparse==0.3.1

GISライブラリインストール

Windows環境でGeoDjangoを利用するにはOSGeo4Wインストーラを使って以下をインストールする必要があります。

GDAL(Geospatial Data Abstraction Library)
GEOS (Geometry Engine, Open Source)
PROJ4 (Cartographic Projections Library) 

OSGeo4Wインストーラは以下のサイトからダウンロードします。

OSGeo4Wユーザーのためのクイックスタート」の下にある「64bit」をクリックしてインストーラ「osgeo4w-setup-x86_64.exe」をダウンロードします。

画像28

ダウンロードが完了したら「osgeo4w-setup-x86_64.exe」を右クリック→「管理者として実行」を選択します。

エクスプレスWeb-GISインストール」にチェックを入れ「次へ」ボタンを押します。

画像29

ダウンロードサイトの選択で「http://osgeo4w-oslandia.com」を選択して「次へ」ボタンを押します。

画像30

パッケージの選択で「GDALだけにチェックを入れた状態で「次へ」ボタンを押します。

画像31

依存関係の箇所にチェックを入れた状態で「次へ」ボタンを押します。

画像32

ライセンスの同意画面が複数回表示されるのですべてチェックボックスにチェックを入れ「次へ」ボタンを押します。

画像33

インストール処理が完了すると以下の画面が表示されるので、「完了」ボタンを押します。

画像34


以上でGISライブラリインストールは完了です。

データベース作成

ここではPostgreSQLのデータベースを作成します。

DOS画面上で以下のコマンドを実行します。
すると、postgresユーザのパスワードを聞かれるので入力してEnterキーを押します。

createdb -U postgres -E UTF-8 geodjangodb
ユーザ postgres のパスワード:

-Uはユーザ名、-Eでエンコードを指定します。
最後の「geodjangodb」の部分にデータベース名を指定します。

次にpsqlコマンドで作成されたデータベースを確認します。
postgresユーザのパスワードを聞かれるので入力します。

psql -U postgres -d postgres
ユーザ postgres のパスワード:

次に「¥l」コマンドでデータベースの一覧情報を表示します。
以下のようにgeodjangodbデータベースが表示されていればデータベースの作成はOKです。

postgres=# \l
                                             データベース一覧
   名前     |  所有者  | エンコーディング |      照合順序      | 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 行)

一旦「¥q」コマンドを実行して接続を終了しておきましょう。

postgres=# \q


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

先ほど作成したgeodjangodbデータベースに対してPostgreSQLで空間データベースを有効にするために以下のコマンドを実行します。

以下のように「CREATE EXTENSION」と表示されればOKです。

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

念のためgeodjangodbデータベースに接続してextentionが有効になっているか確認しましょう。

まず以下のコマンドでgeodjangodbデータベースに接続します。

psql -U postgres -d geodjangodb
ユーザ postgres のパスワード:
psql (11.7)
"help" でヘルプを表示します。

geodjangodb=#    

接続が完了したら以下のSQLを実行します。

select * from pg_available_extensions;

以下のような情報が表示されればOKです。

geodjangodb=# select * from pg_available_extensions;
            name             | default_version | installed_version |                                                       comment
------------------------------+-----------------+-------------------+---------------------------------------------------------------------------------------------------------------------
address_standardizer         | 3.0.1           |                   | Used to parse an address into constituent elements. Generally used to support geocoding address normalization step.
address_standardizer_data_us | 3.0.1           |                   | Address Standardizer US dataset example
adminpack                    | 2.0             |                   | administrative functions for PostgreSQL
amcheck                      | 1.1             |                   | functions for verifying relation integrity
autoinc                      | 1.0             |                   | functions for autoincrementing fields
bloom                        | 1.0             |                   | bloom access method - signature file based index
btree_gin                    | 1.3             |                   | support for indexing common datatypes in GIN
btree_gist                   | 1.5             |                   | support for indexing common datatypes in GiST
citext                       | 1.5             |                   | data type for case-insensitive character strings
cube                         | 1.4             |                   | data type for multidimensional cubes
dblink                       | 1.2             |                   | connect to other PostgreSQL databases from within a database
dict_int                     | 1.0             |                   | text search dictionary template for integers
dict_xsyn                    | 1.0             |                   | text search dictionary template for extended synonym processing
earthdistance                | 1.1             |                   | calculate great-circle distances on the surface of the Earth
file_fdw                     | 1.0             |                   | foreign-data wrapper for flat file access
fuzzystrmatch                | 1.1             |                   | determine similarities and distance between strings
hstore                       | 1.5             |                   | data type for storing sets of (key, value) pairs
hstore_plperl                | 1.0             |                   | transform between hstore and plperl
hstore_plperlu               | 1.0             |                   | transform between hstore and plperlu
hstore_plpython2u            | 1.0             |                   | transform between hstore and plpython2u
-- More  --                                                                                                                 


データベースの管理ユーザを作成する

続いてgeodjangodbデータベース用の管理者ユーザを作成し、管理者権限を割り当てます。

先ほどのgeodjnagodbに接続した状態のDOS画面上で以下のコマンドを実行します。

geodjangodb=# CREATE USER django_admin WITH PASSWORD 'django_admin';
CREATE ROLE

CREATE ROLE」と表示されればOKです。

ここでは新規に「django_admin」というデータベースユーザを作成し、パスワードを「django_admin」に設定しています。

続いてgeodjangodbデータベースに対する全権限をdjango_adminユーザに付与します。

geodjangodb=# GRANT ALL PRIVILEGES ON DATABASE geodjangodb TO django_admin;
GRANT

GRANT」と表示されればOKです。

なお、ここで作成したdjango_adminユーザは後程djangoのsettings.py内で行うデータベースへの接続設定で利用します。

一旦「¥q」コマンドを実行して接続を終了しておきましょう。

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

ここからはDjangoの開発を行っていきます。
まず最初にDjangoプロジェクトを作成します。

今回はC:\geodjangoフォルダ直下にtutorialというプロジェクトを作成します。

DOS画面を起動し以下のコマンドを実行してください。

cd c:\geodjango

django-admin startproject tutorial

【注意】コマンド実行前に仮想環境を有効になっていることを確認してください。

以下のようにDjangoのプロジェクトが作成されます。

画像35


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


続いて今回開発する避難所マップ用のDjangoアプリケーションを作成します。

まずmanage.pyファイルが存在しているC:\geodjango\tutorialに移動した後にstartappコマンドでmapという名称のアプリケーションを作成します。

cd tutorial

python manage.py startapp map

下図のようにmapアプリケーションのファイルが生成されます。

画像36


settings.pyの設定

ここではDjango全体に関わる以下の設定を行っていきます。

・環境変数の設定
・INSTALLED_APPSにアプリケーションを追加
・データベースの接続設定
・言語とタイムゾーンの設定


環境変数の設定

C:\geodjango\tutorial\tutorial\settings.pyを開き「import os」の直後に以下のコードを追記します。

if os.name == 'nt':
   import platform
   POSTGRES = r"C:\Program Files\PostgreSQL\11"
   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']

ここでは、PostgreSQL、OSGEO4W等の動作に必要なOSの環境変数の設定を自動的に行う処理を設定しています。

細かいコード内容については解説しませんが、OSの環境変数の設定を行うためのコードである点だけ認識できていればOKです。


INSTALLED_APPSにアプリケーションを追加

C:\geodjango\tutorial\tutorial\settings.pyを開きINSTALLED_APPSに以下の2エントリーを追加します。

'django.contrib.gis',  #add
'map.apps.MapConfig',  #add

1つ目はDjangoで地理空間情報を扱うために追加します。
2つ目は先ほど作成したmapアプリケーションを利用するために追加します。

※追加した後のINSTALLED_APPSの状態

INSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'django.contrib.gis',  #add
   'map.apps.MapConfig',  #add
]


データベースの接続設定

次にDjangoからPostgreSQLデータベースへ接続できるようにするための設定を行います。

データベースの接続設定はsettings.py内の「DATABASES」で設定します。

Djangoでは以下のようにデフォルトでSqlite3を利用するようになっていますので、PostgreSQL(PostGIS)を利用する設定に変更します。

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.sqlite3',
       'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
   }
}

まず上記DATABASESをすべてコメント化して直後にPostGIS用の接続設定を追加します。

"""
DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.sqlite3',
       'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
   }
}
"""

# Postgis用の接続設定
DATABASES = {
   'default': {
       'ENGINE': 'django.contrib.gis.db.backends.postgis',
       'NAME': 'geodjangodb',
       'USER': 'django_admin',
       'HOST':'localhost',
       'PASSWORD': 'django_admin',
   }
}

NAMEには接続先のデータベース名「geodjangodb」を指定します。
USERには接続用のデータベースユーザ「django_admin」を指定します。
PASSWORDにはdjango_adminユーザのパスワードを指定します。

以上でデータベース接続設定は完了です。

言語とタイムゾーンの設定

最後に言語とタイムゾーンの設定を行います。

settings.pyの最後の方にあるLANGUAGE_CODETIME_ZONEパラメータの設定を以下の通り変更します。

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'


以上でsettings.pyの設定は完了です。

Djangoマイグレーションの実行

続いて一旦Djangoのマイグレーションを実行します。

まず最初に以下のコマンドを実行してマイグレーションファイルを生成します。

python manage.py makemigrations

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

  File "C:\geodjango\venv\geodjango\lib\site-packages\django\contrib\gis\gdal\libgdal.py", line 43, in <module>
   % '", "'.join(lib_names)
django.core.exceptions.ImproperlyConfigured: Could not find the GDAL library (tried "gdal203", "gdal202", "gdal201", "gdal20", "gdal111"). Is GDAL installed? If it is, try setting GDAL_LIBRARY_PATH in your settings.

C:\geodjango\venv\geodjango\Lib\site-packages\django\contrib\gis\gdal\libgdal.py」ファイルをエディタで開き以下のようにlib_namesに「gdal300」を追加します。

※変更前

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

※変更後

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


再度以下のコマンドを実行し「No changes detected」と表示されればOKです。

python manage.py makemigrations
No changes detected

続いてマイグレーション「python manage.py migrate」を実行します。

(geodjango) c:\geodjango\tutorial>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 admin.0003_logentry_add_action_flag_choices... 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 auth.0010_alter_group_name_max_length... OK
 Applying auth.0011_update_proxy_permissions... OK
 Applying sessions.0001_initial... OK


Django管理者ユーザの作成

以下のコマンドを実行してDjango管理サイトの管理者ユーザを作成します。

python manage.py createsuperuser    

以下の例では、ユーザ名「manager」を指定していますが任意のユーザ名を指定すればOKです。
また、メールアドレスは空でOKです。

python manage.py createsuperuser
ユーザー名 (leave blank to use 'sinfo'): manager
メールアドレス:
Password:
Password (again):
Superuser created successfully.

ここまで来たら、開発サーバを起動してTOPページにアクセスできることを確認しましょう。

まず、以下のコマンドで開発サーバを起動します。

python manage.py runserver

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
April 03, 2020 - 16:14:11
Django version 2.2.12, using settings 'tutorial.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.


ウェブブラウザで「http://127.0.0.1:8000/」にアクセスし、以下のページが表示されればOKです。

画像37


地理情報の基礎知識

GeoDjangoで地図アプリを開発するためには地理情報システム(GIS)の知識が必要になります。
ここでは、GeoDjangoアプリケーションを開発するにあたって最低限必要な知識をまとめましたので、まずはGISの基礎知識について理解しましょう。

地理情報システム(GIS)とは?

地理情報システムは別名でGeographic Information System(略してGIS)と言います。地理空間情報(地理空間データ)を可視化したり、分析するシステムのことです。

GISを使うと以下のようなことを実現できます。

・最短経路を表示する
・建物等の分布密度の可視化する
・標高データから地形情報を可視化する

このほかにも様々な地図情報を可視化することができます。

空間参照系について

空間参照系は「測地系」と「投影座標系」/「地理座標系」の組み合わせで成り立っており、座標によってどのようにGISの中の投影された二次元が地球の実際の場所と関係づけられているかを決定します。

測地系とは?

測地系は、地球上のある位置を緯度・経度で示すための基準のことです。
国際的に定められた測地系(JGD2000, JGD2011, WGS84)や日本測地系のように各国独自の測地系などがあります。

測地系が違うと下図のように地図上の位置がずれることがあります。

画像40

※上図は以下の国土地理院のページより引用

座標系とは?

座標系とは地球上の球面(3次元の立体)を2次元の地図の平面上に表現する方法のことです。

大きく「地理座標系」と「投影座標系」の2つがあります。

「地理座標系」は3次元である地球上の位置を緯度と経度で表現します。
また、赤道からの角度(緯度)、子午線からの角度(経度)で示します。

投影座標系」は3次元である地球を 2 次元の平面に投影し、XY 座標で表現する座標系です。
平面直角座標系, UTM, Webメルカトル座標系などがあります。

空間参照系は上記のような「測地系」と「投影座標系」/「地理座標系」の組み合わせで成り立っています。
そして、空間参照系を識別するためにSRIDというコードが使われます。

良く使われるSRIDは以下の通りです。

画像39

※WGS84国際的に定められた測地系でGPSで使われている。
※各国で固有の測地系があるが、世界測地系へ移行するのが現在のトレンド

Geodjangoのモデル定義でもこのSRIDというパラメータが出てくるのでここで意味を理解しておきましょう。


GeoDjagnoとは?

GeoDjangoはDjangoに含まれる標準モジュールで、ロケーションベースのサービスなどの地理的Webアプリケーションを簡単に作成できるようになっており、以下のような機能を備えています。

・OGCジオメトリとラスターデータのDjangoモデルフィールド。
・空間データのクエリと操作のためのDjangoのORMの拡張機能。
・GISジオメトリおよびラスター操作とさまざまな形式のデータ操作のための疎結合の高レベルPythonインターフェイス
・adminサイトからジオメトリフィールドを編集できる。

ベクターデータとラスタデータ

実世界をデジタル地図で表現する場合、実世界を個別の図形で表現する「ベクタデータ」と、セルで表現する「ラスタデータ」の2つの表現方法があります。

ベクターデータとは?

ベクタデータは長さと方向を持ち、それぞれ「点」(ポイント)、「線」(ライン)、「面」(ポリゴン)等で表現されます。

ポイントデータは長さや幅のない点を指します。
ラインデータは長さと方向があり、複数の点を接続する線を指します。
ポリゴンデータは境界線を表わす線の終点を始点に一致させ地図上で一つの領域を表します。

図示すると以下のようなイメージです。

画像41


ラスタデータとは?

画像データは格子状(グリッド)に並んだピクセル(画素)の集合体であらわされますが、このような画像データと同様のデータ構造を「ラスタ」と呼びます。
ラスタデータの各ピクセルは属性として一つの位置座標と数値を持ちます。

GeoDjagnoではこれらのベクターデータとラスタデータを扱うための空間フィールドタイプ(Spatial Field Types)が用意されています。

例えば以下のようなタイプがあります。

GeometryField(ジオメトリフィールドの基本クラス)
PointField(ポイントデータ)
LineStringField(ラインデータ)
PolygonField(ポリゴンデータ)

その他にも多数のフィールドタイプが用意されています。
興味がある方は以下のGeodjango公式サイトを参照してください。

GISのデータ形式について

GISのデータ形式にはいくつかありますが、ここでは代表的なデータ形式であるGeoJSONについて簡単に解説します。

GeoJSONは、JavaScript Object Notation (JSON) を基としたGISデータを記述するためのフォーマットです。

まず最初にGeoJsonの基本構造について解説します。
GeoJSON は以下のようなフォーマットになっています。

{
 "type": "FeatureCollection",
 "features": [
   {
     "type": "Feature",
     "geometry": {
       "type": "Point",
       "coordinates": []
     },
     "properties": {}
   },
   {
     "type": "Feature",
     "geometry": {
       "type": "Polygon",
       "coordinates": []
     },
     "properties": {}
   }
 ]
}

最初のtypeではFeatureCollectionを指定していますが、複数のFeatureを定義する場合にFeatureCollectionを指定します。

features の中には以下のようなfeature オブジェクトを配列で定義していきます。

 {
    "type": "Feature",
    "geometry": {
      "type": "Point",
      "coordinates": []
    },
    "properties": {}
  },


feature オブジェクトにはいくつかのタイプがあり、 geometry プロパティの中にある type プロパティで指定します。
typeプロパティには以下のような種類があります。

Point: 特定の座標を示すためのマーカーを設置
LineString: 複数の座標を結ぶ線を設置
Polygon:多角形の図形を設置

coordinatesには緯度経度を指定します。

properties内には具体的なキーと値の情報を追加していきます。

以下は、この後出てくる指定避難所のGeojsonデータの一部です。

{"type":"FeatureCollection","features":[
{"type":"Feature",
"geometry":
    {"type":"Point",
    "coordinates":[135.5746412,34.7137142]},
    "properties":{"指定緊急避難場所":"鶴見緑地","所在地":"大阪府大阪市鶴見区緑地公園、緑3、浜1大阪府守口市大字高瀬旧馬場","洪水":"","がけ崩れ、土石流及び地滑り":"","高潮":"","地震":"◎","津波":"◎","大規模な火事":"◎","内水氾濫":"","火山現象":""}
   },

{"type":"Feature",
"geometry":
    {"type":"Point",
    "coordinates":[135.626247790663,34.4638979052024]},
    "properties":{"指定緊急避難場所":"いきいきサロンくすのき","所在地":"大阪府南河内郡千早赤阪村大字二河原邊8-1","洪水":"◎","がけ崩れ、土石流及び地滑り":"◎","高潮":"","地震":"◎","津波":"","大規模な火事":"◎","内水氾濫":"","火山現象":""}
   }
  ]
 }


インポートデータの準備

このチュートリアルでは、国土地理院で公開されている「指定緊急避難場所データ」を活用して緊急避難所マップWEBアプリを開発します。

まず、以下のG空間情報センターサイトにアクセスしましょう。

https://www.geospatial.jp/ckan/dataset/hinanbasho

上記ページには全国の指定緊急避難場所データが公開されています。

データファイルはShapefile形式GeoJson形式のデータがありますが、今回はGeojson形式のデータを使います。

全国のデータも公開されていますがデータ数が膨大のため、ご自身が住んでいる都道府県のGeojson形式のデータをダウンロードしてください。

ここでは「指定緊急避難場所データ_13東京都(GeoJson)」を使う前提で説明します。

上記WEBページ内の「指定緊急避難場所データ_13東京都(GeoJson)」の箇所で「詳細」から「ダウンロード」を選択してgeojsonファイルをダウンロードします。

画像38

13.geojson」というファイルがダウンロードされます。

中身を見ると以下のような形式のGeojsonデータになっています。

{"type":"FeatureCollection","features":[
{"type":"Feature","geometry":{"type":"Point","coordinates":[139.77132890862,35.676572613649]},"properties":{"指定緊急避難場所":"京橋区民館","所在地":"東京都中央区京橋2-6-7","洪水":"◎","がけ崩れ、土石流及び地滑り":"","高潮":"","地震":"◎","津波":"","大規模な火事":"","内水氾濫":"◎","火山現象":""}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[139.77164071164,35.673184063993]},"properties":{"指定緊急避難場所":"京橋プラザ","所在地":"東京都中央区銀座1-25-3","洪水":"◎","がけ崩れ、土石流及び地滑り":"","高潮":"","地震":"◎","津波":"","大規模な火事":"","内水氾濫":"◎","火山現象":""}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[139.76145785516,35.67225296963]},"properties":{"指定緊急避難場所":"泰明小学校","所在地":"東京都中央区銀座5-1-13","洪水":"◎","がけ崩れ、土石流及び地滑り":"","高潮":"","地震":"◎","津波":"","大規模な火事":"","内水氾濫":"◎","火山現象":""}},
{"type":"Feature","geometry":{"type":"Point","coordinates":[142.162035037284,26.6349094786039]},"properties":{"指定緊急避難場所":"評議平運動場","所在地":"東京都小笠原村母島字評議平","洪水":"◎","がけ崩れ、土石流及び地滑り":"◎","高潮":"◎","地震":"◎","津波":"◎","大規模な火事":"◎","内水氾濫":"","火山現象":""}}
]
}


ここから先は

71,844字 / 40画像 / 3ファイル

¥ 980

主にITテクノロジー系に興味があります。 【現在興味があるもの】 python、Django,統計学、機械学習、ディープラーニングなど。 技術系ブログもやってます。 https://sinyblog.com/