GeoDjangoチュートリアル
イントロダクション
GeoDjangoは、Djangoに含まれているcontribモジュールであり、Djangoをワールドクラスの地理的Webフレームワークに変えます。 GeoDjangoは、ロケーションベースのサービスなどの地理的なWebアプリケーションをできるだけ簡単に作成できるように努めています。 その機能は次のとおりです。
- OGC ジオメトリとラスターデータのDjangoモデルフィールド。
- 空間データをクエリおよび操作するためのDjangoのORMの拡張。
- GISジオメトリとラスター操作、およびさまざまな形式でのデータ操作のための、緩く結合された高レベルのPythonインターフェース。
- 管理者からのジオメトリフィールドの編集。
このチュートリアルは、Djangoに精通していることを前提としています。 したがって、Djangoを初めて使用する場合は、通常のチュートリアルを読んで、最初にDjangoに慣れてください。
このチュートリアルでは、世界の境界線を表示するための地理的なWebアプリケーションの作成について説明します。 1 このチュートリアルで使用されているコードの一部は、 GeoDjango基本アプリプロジェクトから取得またはインスピレーションを得ています。 2
ノート
ステップバイステップの手順については、チュートリアルセクションを順番に進んでください。
セットアップ
空間データベースを作成する
通常、特別な設定は必要ないため、他のプロジェクトの場合と同じようにデータベースを作成できます。 選択したデータベースに関するいくつかのヒントを提供します。
新しいプロジェクトを作成する
標準のdjango-admin
スクリプトを使用して、geodjango
というプロジェクトを作成します。
これにより、新しいプロジェクトが初期化されます。 次に、geodjango
プロジェクト内にworld
Djangoアプリケーションを作成します。
settings.pyを構成します
geodjango
プロジェクトの設定はgeodjango/settings.py
ファイルに保存されます。 設定に一致するようにデータベース接続設定を編集します。
さらに、:setting: `INSTALLED_APPS` 設定を変更して、 django.contrib.admin 、 django.contrib.gis 、およびworld
を含めます。 ](新しく作成したアプリケーション):
地理データ
世界の国境
世界の国境データは、この zipファイルで入手できます。 world
アプリケーションにdata
ディレクトリを作成し、国境データをダウンロードして解凍します。 GNU / Linuxプラットフォームでは、次のコマンドを使用します。
世界と国境を接するZIPファイルには、最も一般的な地理空間データ形式の1つである ESRI Shapefile と総称されるデータファイルのセットが含まれています。 解凍すると、世界の境界データセットには次の拡張子のファイルが含まれます。
.shp
:世界の境界ジオメトリのベクトルデータを保持します。.shx
:.shp
に保存されているジオメトリの空間インデックスファイル。.dbf
:非幾何学的属性データ(整数および文字フィールドなど)を保持するためのデータベースファイル。.prj
:シェープファイルに保存されている地理データの空間参照情報が含まれています。
ogrinfoを使用して空間データを調べます
GDAL ogrinfo
ユーティリティを使用すると、シェープファイルまたはその他のベクターデータソースのメタデータを調べることができます。
ogrinfo
は、シェープファイルに1つのレイヤーがあり、このレイヤーにポリゴンデータが含まれていることを示しています。 詳細については、レイヤー名を指定し、-so
オプションを使用して、重要な要約情報のみを取得します。
この詳細な要約情報は、レイヤー内のフィーチャの数(246)、データの地理的境界、空間参照系( "SRS WKT")、および各属性フィールドのタイプ情報を示します。 たとえば、FIPS: String (2.0)
は、FIPS
文字フィールドの最大長が2であることを示します。 同様に、LON: Real (8.3)
は、小数点以下3桁までの最大8桁を保持する浮動小数点フィールドです。
地理モデル
地理モデルの定義
ogrinfo
を使用してデータセットを調べたので、このデータを表すGeoDjangoモデルを作成します。
models
モジュールはdjango.contrib.gis.db
からインポートされることに注意してください。
ジオメトリフィールドのデフォルトの空間参照系はWGS84です( SRID が4326であることを意味します)。つまり、フィールド座標は経度、緯度のペアは度単位です。 別の座標系を使用するには、srid
引数を使用してジオメトリフィールドのSRIDを設定します。 座標系のEPSGコードを表す整数を使用します。
migrateを実行します
モデルを定義したら、データベースと同期する必要があります。 まず、データベース移行を作成します。
WorldBorder
モデルのテーブルを生成するSQLを見てみましょう。
このコマンドは、次の出力を生成するはずです。
これが正しいと思われる場合は、:djadmin: `migrate` を実行して、データベースに次のテーブルを作成します。
空間データのインポート
このセクションでは、 LayerMappingデータインポートユーティリティを使用してGeoDjangoモデルを介してワールドボーダーシェープファイルをデータベースにインポートする方法を示します。
空間データベースにデータをインポートするには、さまざまな方法があります。GeoDjangoに含まれているツールの他に、次のものを使用することもできます。
- ogr2ogr :GDALに含まれているコマンドラインユーティリティで、PostGIS、MySQL、およびOracleデータベースに多くのベクターデータ形式をインポートできます。
- shp2pgsql :PostGISに含まれているこのユーティリティは、ESRIシェープファイルをPostGISにインポートします。
GDALインターフェース
以前は、ogrinfo
を使用して、ワールドボーダーシェープファイルの内容を調べました。 GeoDjangoには、OGRがサポートするすべてのベクトルデータソースで動作できるGDALの強力なOGRライブラリへのPythonicインターフェイスも含まれています。
まず、Djangoシェルを呼び出します。
チュートリアルの前半で World Borders データをダウンロードした場合は、Pythonの組み込みos
モジュールを使用してそのパスを決定できます。
次に、GeoDjangoの DataSource インターフェイスを使用して、ワールドボーダーシェープファイルを開きます。
データソースオブジェクトは、地理空間フィーチャのさまざまなレイヤーを持つことができます。 ただし、シェープファイルには次の1つのレイヤーしか含めることができません。
レイヤーのジオメトリタイプと、レイヤーに含まれるフィーチャの数を確認できます。
ノート
残念ながら、シェープファイルのデータ形式では、ジオメトリタイプに関してより具体的にすることはできません。 このシェープファイルには、他の多くのシェープファイルと同様に、実際にはポリゴンではなくMultiPolygon
ジオメトリが含まれています。 モデルでは、より一般的なフィールドタイプを使用することが重要です。GeoDjangoMultiPolygonField
はPolygon
ジオメトリを受け入れますが、PolygonField
はMultiPolygon
タイプを受け入れません。ジオメトリ。 これが、上記で定義されたWorldBorder
モデルがMultiPolygonField
を使用する理由です。
Layer には、空間参照系が関連付けられている場合もあります。 含まれている場合、srs
属性は SpatialReference オブジェクトを返します。
このシェープファイルは、一般的なWGS84空間参照系にあります。つまり、データは度単位の経度と緯度のペアを使用します。
さらに、シェープファイルは、追加データを含む可能性のある属性フィールドもサポートします。 WorldBordersレイヤーのフィールドは次のとおりです。
次のコードを使用すると、OGRタイプを調べることができます(例: 各フィールドに関連付けられた整数または文字列):
レイヤー内の各フィーチャを反復処理し、フィーチャのジオメトリ(geom
属性を介してアクセス)とフィーチャの属性フィールド(値がget()
メソッド):
Layer オブジェクトはスライスされる可能性があります。
また、個々の機能は、機能IDによって取得できます。
境界ジオメトリは、WKTおよびGeoJSONとしてエクスポートできます。
LayerMapping
データをインポートするには、PythonスクリプトでLayerMappingを使用します。 次のコードを使用して、world
アプリケーション内にload.py
というファイルを作成します。
何が起こっているかについてのいくつかのメモ:
world_mapping
ディクショナリの各キーは、WorldBorder
モデルのフィールドに対応しています。 値は、データのロード元のシェープファイルフィールドの名前です。- ジオメトリフィールドのキー
mpoly
はMULTIPOLYGON
で、ジオメトリタイプGeoDjangoはフィールドをとしてインポートします。 シェープファイル内の単純なポリゴンでさえ、データベースに挿入する前に自動的にコレクションに変換されます。 - シェープファイルへのパスは絶対的なものではありません。つまり、
world
アプリケーション(data
サブディレクトリを含む)を別の場所に移動しても、スクリプトは引き続き機能します。 transform
キーワードはFalse
に設定されています。これは、シェープファイル内のデータを変換する必要がないためです。すでにWGS84(SRID = 4326)にあります。
その後、geodjango
プロジェクトディレクトリからDjangoシェルを呼び出します。
次に、load
モジュールをインポートし、run
ルーチンを呼び出して、LayerMapping
が動作するのを確認します。
ogrinspectをお試しください
LayerMappingデータインポートユーティリティを使用して地理モデルを定義し、データをインポートする方法を確認したので、:djadmin: `ogrinspect` を使用してこのプロセスをさらに自動化することができます。管理コマンド。 :djadmin: `ogrinspect` コマンドは、GDALでサポートされているベクターデータソース(シェープファイルなど)をイントロスペクトし、モデル定義とLayerMapping
ディクショナリを自動的に生成します。
コマンドの一般的な使用法は次のとおりです。
data_source
はGDALでサポートされているデータソースへのパスであり、model_name
はモデルに使用する名前です。 コマンドラインオプションを使用して、モデルの生成方法をさらに定義できます。
たとえば、次のコマンドは、上記で作成したWorldBorder
モデルとマッピング辞書をほぼ自動的に再現します。
上記のコマンドラインオプションに関する注意事項:
--srid=4326
オプションは、地理フィールドのSRIDを設定します。--mapping
オプションは、ogrinspect
に、 LayerMapping で使用するマッピング辞書も生成するように指示します。--multi
オプションは、地理フィールドが PolygonField ではなく MultiPolygonField になるように指定されています。
このコマンドは次の出力を生成します。これらの出力は、GeoDjangoアプリケーションのmodels.py
に直接コピーできます。
空間クエリ
空間ルックアップ
GeoDjangoは、DjangoORMに空間ルックアップを追加します。 たとえば、特定のポイントを含むWorldBorder
テーブルで国を見つけることができます。 まず、管理シェルを起動します。
ここで、関心のあるポイント 3 を定義します。
pnt_wkt
文字列は、経度-95.3385度、緯度29.7245度のポイントを表します。 ジオメトリは、Open Geospatial Consortium(OGC)によって発行された標準であるWell Know Text(WKT)として知られている形式です。 4 WorldBorder
モデルをインポートし、pnt_wkt
をパラメーターとして使用してcontains
ルックアップを実行します。
ここでは、QuerySet
を、米国の国境(まさにあなたが期待するもの)という1つのモデルだけで取得しました。
同様に、 GEOSジオメトリオブジェクトを使用することもできます。 ここでは、intersects
空間ルックアップをget
メソッドと組み合わせて、クエリセットの代わりにSanMarinoのWorldBorder
インスタンスのみを取得できます。
contains
およびintersects
ルックアップは、使用可能なクエリのサブセットにすぎません。 GeoDjangoデータベースAPI のドキュメントにはさらに多くのものがあります。
自動空間変換
空間クエリを実行するとき、GeoDjangoは、ジオメトリが別の座標系にある場合、ジオメトリを自動的に変換します。 次の例では、座標は EPSG SRID 32140 で表されます。これは、テキサス南部のみに固有の座標系であり、度ではなくメートルの単位で表されます。
pnt
は、SRIDを含むWKTの「拡張」形式であるEWKTを使用して構築することもできることに注意してください。
GeoDjangoのORMは、ジオメトリ値を変換SQLで自動的にラップし、開発者がより高いレベルの抽象化で作業できるようにします。
生のクエリ
生のクエリを使用する場合、フィールド値がGEOSによって認識されるように、ジオメトリフィールドをラップする必要があります。
何をしているかを正確に理解している場合にのみ、生のクエリを使用する必要があります。
怠惰な幾何学
GeoDjangoは、標準化されたテキスト表現でジオメトリをロードします。 ジオメトリフィールドに最初にアクセスすると、GeoDjangoは GEOSGeometry オブジェクトを作成し、一般的な地理空間形式のシリアル化プロパティなどの強力な機能を公開します。
これには、GEOSライブラリによって提供されるすべての高度な幾何学的操作へのアクセスが含まれます。
データを地図に載せる
地理管理者
GeoDjangoは、 Djangoの管理アプリケーションを拡張してジオメトリフィールドの編集をサポートします。
基本
GeoDjangoは、ユーザーがJavaScriptの滑りやすいマップ( OpenLayers を利用)でジオメトリを作成および変更できるようにすることで、Django管理者を補完します。
すぐに飛び込みましょう。 次のコードを使用して、world
アプリケーション内にadmin.py
というファイルを作成します。
次に、geodjango
アプリケーションフォルダのurls.py
を次のように編集します。
管理者ユーザーを作成します。
次に、Django開発サーバーを起動します。
最後に、http://localhost:8000/admin/
を参照し、作成したユーザーでログインします。 WorldBorder
エントリのいずれかを参照します。ポリゴンをクリックして頂点を目的の位置にドラッグすることで、境界線を編集できます。
OSMGeoAdmin
OSMGeoAdmin を使用すると、GeoDjangoは管理者で Open Street Map レイヤーを使用します。 これにより、 GeoModelAdmin ( OSGeo でホストされている Vector Map Level 0 WMSデータセットを使用)で利用できるよりも多くのコンテキスト(通りや道の詳細を含む)が提供されます。
PROJ.4データムシフトファイルをインストールする必要があります(詳細については、 PROJ.4インストール手順を参照してください)。
この要件を満たしている場合は、admin.py
ファイルのOSMGeoAdmin
オプションクラスを置き換えるだけです。
脚注
- 1
- このデータセットを提供および保守してくれた thematicmapping.org のBjørnSandvikに特に感謝します。
- 2
- GeoDjangoの基本的なアプリは、Dane Springmeyer、Josh Livni、およびChristopherSchmidtによって作成されました。
- 3
- ここがヒューストン大学ローセンターです。
- 4
- Open Geospatial Consortium、Inc。、 SQL用のOpenGISシンプル機能仕様。