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
注意する点は、
となっていることです。
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"テーブルが作成されていれば成功です。
次は空間データのインポートから始めます。