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
を参考にしてみてはいかがですか?