ここのことはなかったことにするかもしれない

仕事がらみの記事を主として扱いますが、あくまで個人ブログです。2013年以前の記事は https://yellow-73.hatenablog.com/ にあります。

GeoDjangoに挑戦中 #2 地物管理まで

参考URL

https://homata.gitbook.io/geodjango/geodjango/import

PostGISテーブル

プロジェクト全体の設定で、使用するデータベースを指定します。(プロジェクト名)/settings.pyを変更します。

PostgreSQLをデフォルトデータベースに指定

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': (データベース名),
        'USER': (ユーザ名),
        'HOST':'localhost',
    },
}

GISデータを使うようにする

プロジェクト全体の設定でGISデータ型を使用するようにします。(プロジェクト名)/settings.pyを変更します。

INSTALLED_APPS = [
...
    'django.contrib.gis',
...
]

psycopg2が必要

ModuleNotFoundError: No module named 'psycopg2'と怒られたので py37-psycopg2 を入れました。

データモデル

仮定するfieldテーブル

ここでは次のテーブルがデータベースにあるとします。

CREATE TABLE field (
  gid SERIAL PRIMARY KEY,
  name TEXT,
  geom GEOMETRY(POLYGON, 4612);
);

modules.pyの作成

(アプリ名)/modules.pyを作成します。

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

class Border(models.Model):
    gid = models.IntegerField(primary_key=True)
    name = models.TextField()
    geom = models.PolygonField(srid=4612)

    class Meta:
        db_table = 'field'

TEXT型(models.TextField())とVARCHAR型(models.CharField())とは別になっています。

djangoはテーブル名は(アプリ名)_(モデルクラス名)と仮定します。変更するには、サブクラスMetaを作り、db_tableフィールドにテーブル名を与えます。

また、djangoは主キーはidと仮定し、モデルに存在しないなら自動追加します。shp2pgsqlからPostGISテーブルを作る場合には、デフォルトの主キーはgidです。gidprimary_key=Trueとすることで、idの自動追加は抑制されます。

admin.py の設定

(アプリ名)/admin.pyBorderクラスの管理方法を登録します。

from django.contrib.gis import admin
from .models import Border

admin.site.register(Border, admin.OSMGeoAdmin)

管理ツールで地物も管理できるようにする

(プロジェクト名)/urls.pyで既に管理ツールを実行できるようにしていると思いますが、これを少し変更します。

#from django.contrib import admin
from django.contrib.gis import admin

url(r'^admin/', admin.site.urls)admindjango.contrib.gis.adminに切り替えます。

アプリを登録

(プロジェクト名)/settigs.pyで次のようにアプリを登録します。

INSTALLED_APPS = [
...
    (アプリ名),
...
]

登録しないと、全く動きません。