GeoDjango For Windows チュートリアル編その2

GeoDjango For Windows チュートリアル編その1の続きです。
ここではGISなどの専門用語等の説明は無視して動作することを目的とします。


地理データ取得

まずは国境などの地理データをここからダウンロードします。
置き場所は"world"アプリケーション直下に"data"フォルダを作成し、解凍し保存します。
C:\geodjango\world\data


ogrinfoを使って空間データを調べる

ogrinfoはシェイプファイルのメタデータを調べるユーティリティです。
C:\Program Files\GeoDjango\bin以下にあります。
ogrinfoを使用してTM_WORLD_BORDERS-0.3.shpの中身を見てみましょう。

C:\Program Files\GeoDjango\bin>ogrinfo.exe c:\geodjango\world\data\TM_WORLD_BORDERS-0.3.shp
INFO: Open of `c:\geodjango\world\data\TM_WORLD_BORDERS-0.3.shp'
      using driver `ESRI Shapefile' successful.
1: TM_WORLD_BORDERS-0.3 (Polygon)

という結果が表示されると思います。
これにより、シェイプファイルはPolygonデータを持ったレイヤーが一つあることがわかります。
このレイヤーを詳しく調べてみましょう。

C:\Program Files\GeoDjango\bin>ogrinfo.exe -so c:\geodjango\world\data\TM_WORLD_BORDERS-0.3.shp TM_WORLD_BORDERS-0.3
INFO: Open of `c:\geodjango\world\data\TM_WORLD_BORDERS-0.3.shp'
      using driver `ESRI Shapefile' successful.

Layer name: TM_WORLD_BORDERS-0.3
Geometry: Polygon
Feature Count: 246
Extent: (-180.000000, -90.000000) - (180.000000, 83.623596)
Layer SRS WKT:
GEOGCS["GCS_WGS_1984",
    DATUM["WGS_1984",
        SPHEROID["WGS_1984",6378137.0,298.257223563]],
    PRIMEM["Greenwich",0.0],
    UNIT["Degree",0.0174532925199433]]
FIPS: String (2.0)
ISO2: String (2.0)
ISO3: String (3.0)
UN: Integer (3.0)
NAME: String (50.0)
AREA: Integer (7.0)
POP2005: Integer (10.0)
REGION: Integer (3.0)
SUBREGION: Integer (3.0)
LON: Real (8.3)
LAT: Real (7.3)

このような構成でデータは作成されています。
上記の構成を基にmodelを作成します。


model作成

"world"アプリのmodels.pyを編集します。

# -*- encoding:utf-8 -*-

from django.contrib.gis.db import models

class WorldBorders(models.Model):
    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 Disit 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()
    
    mpoly = models.MultiPolygonField()
    objects = models.GeoManager()
    
    class Meta:
        verbose_name_plural = "World Borders"
    
    def __unicode__(self):
        return self.name

注意する点は、

  • from django.contrib.gis.db import models
  • objects = models.GeoManager()

となっていることです。


syncdbを実行してみる

まずどのようなSQLを発行するか調べてみましょう。

C:\geodjango>manage.py sqlall world
BEGIN;
CREATE TABLE "world_worldborders" (
    "id" serial NOT NULL PRIMARY KEY,
    "name" varchar(50) NOT NULL,
    "area" integer NOT NULL,
    "pop2005" integer NOT NULL,
    "fips" varchar(2) NOT NULL,
    "iso2" varchar(2) NOT NULL,
    "iso3" varchar(3) NOT NULL,
    "un" integer NOT NULL,
    "region" integer NOT NULL,
    "subregion" integer NOT NULL,
    "lon" double precision NOT NULL,
    "lat" double precision NOT NULL
)
;
SELECT AddGeometryColumn('world_worldborders', 'mpoly', 4326, 'MULTIPOLYGON', 2);
ALTER TABLE "world_worldborders" ALTER "mpoly" SET NOT NULL;
CREATE INDEX "world_worldborders_mpoly_id" ON "world_worldborders" USING GIST ("mpoly" GIST_GEOMETRY_OPS );
COMMIT;

では、DBに反映させましょう。

C:\geodjango>manage.py syncdb
Creating table world_worldborders
Installing custom SQL for world.WorldBorders model

PgAdmin3で確認してみてください。
上記のメッセージと"world_worldborders"テーブルが作成されていれば成功です。


次は空間データのインポートから始めます。