Angular, Blockchain, Science とか

Angular, Blockchain, Science全般 の情報を主に書いていきます。

GeoDjango 入門 (ubuntu)

Djangoに慣れてきたので、GeoDjangoのチュートリアルをやってみたのでそれをまとめてみました。
Djangoの基本がわかっている人向けで。公式ドキュメントの雑な日本語訳です。変な日本語が多いですが悪しからず。


まずプログラミングのいちばんの難関、環境構築から。ここではubuntu16.04が前提です。
settings の INSTALLED_APPS に 'django.contrib.gis' を入れてください。
いろいろインストールします。

In general, GeoDjango installation requires:


1 Python and Django
2 Spatial database(PostGIS
3 Installing Geospatial libraries

PythonDjangoはすでにインストールされている前提。

postgis のrequirements

まずPostgreSQLPostGISのインストール
postgresql-x.x, postgresql-x.x-postgis, postgresql-server-dev-x.x, python-psycopg2(Xはインストールするバージョン)

apt-get install postgresql-9.5
apt-get install postgresql-9.5-postgis
apt-get install postgresql-server-dev-9.5
pip install psycopg2
sudo apt install pgadmin3

次にGeospatial libraries
postgresql postgisの場合
GEOS
PROJ4
POSTGIS
が必要

$ sudo apt-get install binutils libproj-dev gdal-bin

GEOS

$ wget http://download.osgeo.org/geos/geos-3.4.2.tar.bz2
$ tar xjf geos-3.4.2.tar.bz2

その後

$ cd geos-3.4.2
$ ./configure
$ make
$ sudo make install
$ cd ..

その後Djangoのsettings に追加

GEOS_LIBRARY_PATH = '/home/bob/local/lib/libgeos_c.so'

PROJ.4

$ wget http://download.osgeo.org/proj/proj-4.9.1.tar.gz
$ wget http://download.osgeo.org/proj/proj-datumgrid-1.5.tar.gz

次に

$ tar xzf proj-4.9.1.tar.gz
$ cd proj-4.9.1/nad
$ tar xzf ../../proj-datumgrid-1.5.tar.gz
$ cd ..

そして

$ ./configure
$ make
$ sudo make install
$ cd ..

データベース作成

$ createdb  <db name>
$ psql <db name>
> CREATE EXTENSION postgis;

CREATE EXTENSION はスーパーユーザ

from django.contrib.postgres.operations import CreateExtension
from django.db import migrations

class Migration(migrations.Migration):

    operations = [
        CreateExtension('postgis'),
        ...
    ]


ようやくプロジェクトを開始します。

$ django-admin startproject geodjango

ココらへんは説明いらないよね。

$ python manage.py startapp world

settings に world を入れてください

次に世界の国境データを取得します。

$ mkdir world/data
$ cd world/data
$ wget http://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip
$ unzip TM_WORLD_BORDERS-0.3.zip
$ cd ../..

以下のファイルができていると思います。(world borders geometriesの訳し方がわからん,geometriesは地理なのか幾何的なのか誰かおしえて。)

.shp: 国境のジオメトリのベクトルデータを保持します
.shx: .shp に格納されたジオメトリの空間インデックスファイル
.dbf: 非幾何学的属性データ(e.g. integer and charcter fields)を保持するためのダータベースファイル
.prj: shapefile格納されている地理データの空間参照情報を含まれます

ここでGDAL: GDAL - Geospatial Data Abstraction Libraryを使います。
まずインストール。

sudo apt install gdal-bin

これでGDALのogrinfoコマンドを使えばshapefileや他のベクトルデータのソースのメタデータを調べられる。

$ ogrinfo world/data/TM_WORLD_BORDERS-0.3.shp
INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp'
      using driver `ESRI Shapefile' successful.
1: TM_WORLD_BORDERS-0.3 (Polygon)

ogrinfoはshapefileに1つのレイヤーがあり、このレイヤーにポリゴンデータが含まれていることを伝えます。
詳細については、レイヤー名を指定し、-soオプションを使用して重要な要約情報のみを取得します。

$ ogrinfo -so world/data/TM_WORLD_BORDERS-0.3.shp TM_WORLD_BORDERS-0.3

地理Modelの定義

from django.contrib.gis.db import models

class WorldBorder(models.Model):
    # world vorders shapefile の属性に対応した通常のDjangoフィールドを書きます。
    name = models.CharField(max_length=50)
    area = models.IntegerField()
    pop2005 = models.IntegerField('Population 2005')
    fips = models.CharField('FIPS Code', max_length=2)
    iso2 = models.CharField('2 Digit ISO', max_length=2)
    iso3 = models.CharField('3 Digit ISO', max_length=3)
    un = models.IntegerField('United Nations Code')
    region = models.IntegerField('Region Code')
    subregion = models.IntegerField('Sub-Region Code')
    lon = models.FloatField()
    lat = models.FloatField()

    # GeoDjango-specific: a geometry field (MultiPolygonField)
    mpoly = models.MultiPolygonField()

    def __str__(self):              
        return self.name

makemigrations,migrate してください。