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

GeoDjango For Windows チュートリアル編その2の続きから
前回空間データのインポートと予告しましたが、モジュールから空間データを操作する方法に変更します。

前提

  • 自分の環境ではIPythonがインストールされています。便利なのでインストールしてみてはいかがでしょうか。
  • Python: C:\Python25
  • GeoDjango: C:\Program Files\GeoDjango
  • Project: C:\geodjango

とします。


専門用語等説明で怪しい部分があるので間違えている部分がありましたらご指摘下さい。


空間データを操作

まずはシェルモードでGeoDjangoにアクセスできるようにします。

C:\Documents and Settings\USER>cd c:\geodjango
C:\geodjango>manage.py shell

シェイプファイルのPathを生成します。

In [1]: import os
In [2]: from geodjango import world
In [3]: world_shp=os.path.abspath(os.path.join(os.path.dirname(world.__file__),'data/TM_WORLD_BORDERS-0.3.shp'))
In [4]: world_shp
Out[4]: 'C:\\geodjango\\world\\data\\TM_WORLD_BORDERS-0.3.shp'

Out[4]の結果が実際のファイルの位置と同じ位置であることを確認してください。
次に空間データのインスタンスを作成します。

In [5]: from django.contrib.gis.gdal import *
In [6]: ds = DataSource(world_shp)
In [7]: print ds
C:\geodjango\world\data\TM_WORLD_BORDERS-0.3.shp (ESRI Shapefile)

Pythonから空間データを操作してみましょう。
レイヤー数を調べてみましょう。

In [8]: print len(ds)
1

レイヤー名を表示してみます。

In [9]: lyr = ds[0]
In [10]: print lyr
TM_WORLD_BORDERS-0.3

次にGeometoryとFeature項目を取得してみます。

In [11]: print lyr.geom_type
Polygon
In [12]: print len(lyr)
246

空間参照系情報を表示してみます。

In [13]: srs=lyr.srs
In [14]: print srs
GEOGCS["GCS_WGS_1984",
    DATUM["WGS_1984",
        SPHEROID["WGS_1984",6378137.0,298.257223563]],
    PRIMEM["Greenwich",0.0],
    UNIT["Degree",0.0174532925199433]]
In [15]: print srs.proj4
+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs

フィールド名を取得します。

In [16]: print lyr.fields
['FIPS', 'ISO2', 'ISO3', 'UN', 'NAME', 'AREA', 'POP2005', 'REGION', 'SUBREGION', 'LON', 'LAT']

次に各フィールドの型を表示してみます。

In [17]: [fld.__name__ for fld in lyr.field_types]
Out[17]:
['OFTString', 'OFTString', 'OFTString', 'OFTInteger', 'OFTString', 'OFTInteger', 'OFTInteger', 'OFTInteger', 'OFTInteger', 'OFTReal', 'OFTReal']

地域と地理番号を表示してみましょう。

In [20]: for feat in lyr:
   ....:     print feat.get('NAME'), feat.geom.num_points
…
India 5626
Iran (Islamic Republic of) 2193
Israel 281
Italy 2317
Cote d'Ivoire 906
Iraq 648
Japan 4450
…
Saint Martin 15
Saint Barthelemy 14
Guernsey 18
Jersey 26
South Georgia South Sandwich Islands 338
Taiwan 363

レイヤーオブジェクトをスライスすることも可能です。

In [22]: lyr[0:2]
Out[22]:
[<django.contrib.gis.gdal.feature.Feature object at 0x022D7470>,
 <django.contrib.gis.gdal.feature.Feature object at 0x022D72D0>]

地域IDから地域名を取得することも可能です。

In [25]: feat=lyr[245]
In [26]: print feat.get('NAME')
Taiwan

日本はというと

In [27]: for n, feat in enumerate(lyr):
   ....:     if feat.get('NAME')=='Japan':
   ....:         print n, feat.get('NAME')
   ....:
   ....:
88 Japan
In [28]: feat=lyr[88]
In [29]: print feat.get('NAME')
Japan

となります。
引き続き国境のデータを表示してみます。出力形式はWKTとGEOJSONです。

In [38]: geom=feat.geom
In [39]: MULTIPOLYGON (((153.95858799999996 24.294997999999964,…
In [40]: geom=feat.json
In [41]: { "type": "MultiPolygon", "coordinates": [ [ [ [ 153.958588, 24.294998 ], …

次回こそ空間データのインポートを行います。