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

前提

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

とします。


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


空間検索

まずshellモードでDjangoを立ち上げます。

C:\geodjango>manage.py shell

経度-95.3385, 緯度29.7245のポイントを使ってみましょう。
ちなみにこの場所は、University of Houston Law Centerです。
WKT形式で調べてみましょう。
この場合、"contains"を使います。

In [1]: pnt_wkt='POINT(-95.3385 29.7245)'
In [2]: from world.models import WorldBorders
In [3]: qs=WorldBorders.objects.filter(mpoly__contains=pnt_wkt)
In [4]: qs
Out[4]: [<WorldBorders: United States>]

University of Houston Law Centerアメリカにあることがわかります。
次に、GEOS geometry objectを使って調べてみましょう。
"intersects"を使用して所在地を調べます。

In [5]: from django.contrib.gis.geos import Point
In [6]: pnt=Point(12.4604, 43.9420)
In [7]: sm=WorldBorders.objects.get(mpoly__intersects=pnt)
In [8]: sm
Out[8]: <WorldBorders: San Marino>

経度12.4604, 緯度43.9420はサン・マリノということがわかります。


空間変換

GeoDjangoは異なる座標系でも自動的にジオメトリを変換し問い合わせを行います。

In [9]: from django.contrib.gis.geos import *
In [10]: pnt=Point(954158.1, 4215137.1, srid=32140)

EPSG SRID 32140はアメリテキサス州サウス・セントラルを指します。
第1,2引数は度ではなくメートルで問い合わせています。
SQLを表示してみましょう。

In [11]: qs=WorldBorders.objects.filter(mpoly__intersects=pnt)
In [12]: qs.query.as_sql()
Out[12]:
('SELECT "world_worldborders"."id", "world_worldborders"."fips", "world_worldbor
ders"."iso2", "world_worldborders"."iso3", "world_worldborders"."un", "world_wor
ldborders"."name", "world_worldborders"."area", "world_worldborders"."pop2005",
"world_worldborders"."region", "world_worldborders"."subregion", "world_worldbor
ders"."lon", "world_worldborders"."lat", "world_worldborders"."mpoly" FROM "worl
d_worldborders" WHERE ST_Intersects("world_worldborders"."mpoly", ST_Transform(%
s, 4326))',
 (<django.contrib.gis.db.backend.postgis.adaptor.PostGISAdaptor object at 0x0222
59B0>,))
In [13]: qs
Out[13]: [<WorldBorders: United States>]

次にEWKT形式で実行してみます。

In [14]: pnt=GEOSGeometry('SRID=32140;POINT(954158.1 4215137.1)')
In [15]: qs=WorldBorders.objects.filter(mpoly__intersects=pnt)
In [16]: qs.query.as_sql()
Out[16]:
('SELECT "world_worldborders"."id", "world_worldborders"."fips", "world_worldbor
ders"."iso2", "world_worldborders"."iso3", "world_worldborders"."un", "world_wor
ldborders"."name", "world_worldborders"."area", "world_worldborders"."pop2005",
"world_worldborders"."region", "world_worldborders"."subregion", "world_worldbor
ders"."lon", "world_worldborders"."lat", "world_worldborders"."mpoly" FROM "worl
d_worldborders" WHERE ST_Intersects("world_worldborders"."mpoly", ST_Transform(%
s, 4326))',
 (<django.contrib.gis.db.backend.postgis.adaptor.PostGISAdaptor object at 0x021F
93B0>,))
In [17]: qs
Out[17]: [<WorldBorders: United States>]


少し省略した部分や順番を入れ替えたりしましたが、
GeoDjangoの雰囲気をお伝えすることが少しでも出来たでしょうか。
Django勉強会 Disc7で@tmatsuoさんが発表したスライド(geodjango tutorial - Google Docs)を併せてみると良いかもしれません。


MacOSXなひとは、
GeoDjango on Mac OSX
GeoDjango on MacOSX Part2
を参考にしてみてはいかがですか?