参考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です。gidでprimary_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 = [  
...  
    (アプリ名),  
...  
]  

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