GeoDjangoモデルAPI
このドキュメントでは、GeoDjango ModelAPIの詳細について説明します。 このセクションでは、例として ZIPコードと数値標高モデルの次の地理モデルを使用します。
from django.contrib.gis.db import models
class Zipcode(models.Model):
code = models.CharField(max_length=5)
poly = models.PolygonField()
class Elevation(models.Model):
name = models.CharField(max_length=100)
rast = models.RasterField()
空間フィールドタイプ
空間フィールドは、一連のジオメトリフィールドタイプと1つのラスターフィールドタイプで構成されます。 各ジオメトリフィールドタイプは、OpenGIS SimpleFeatures仕様 1 に対応しています。 ラスターデータにはそのような標準はありません。
GeometryField
- class GeometryField
ジオメトリフィールドの基本クラス。
空間フィールドオプション
Djangoモデルフィールドで使用できる通常のフィールドオプションに加えて、空間フィールドには次の追加オプションがあります。 すべてオプションです。
srid
- BaseSpatialField.srid
ジオメトリフィールドのSRID 2 (空間参照系ID)を指定された値に設定します。 デフォルトは4326です( WGS84 とも呼ばれ、単位は経度と緯度です)。
SRIDの選択
モデルに適切なSRIDを選択することは、開発者が慎重に検討する必要がある重要な決定です。 SRIDは、空間データベース内のデータを解釈するために使用される射影システムに対応する整数指定子です。 3 投影システムは、場所を指定する座標にコンテキストを提供します。 geodesy の詳細はこのドキュメントの範囲を超えていますが、一般的な問題は、地球が球形であり、地球の表現(たとえば、紙の地図、Webマップ)が球形ではないことです。
ほとんどの人は、緯度と経度を使用して地表上の場所を参照することに慣れています。 ただし、緯度と経度は角度であり、距離ではありません。 つまり、平面上の2点間の最短経路は直線ですが、曲面(地球など)上の2点間の最短経路はのアークです。大圏。 4 したがって、平面単位(キロメートルやマイルなど)で距離を取得するには、追加の計算が必要です。 地理座標系を使用すると、後で開発者が複雑になる可能性があります。 たとえば、SpatiaLiteには、地理座標系を使用してジオメトリ間の距離計算を実行する機能がありません。 WGS84として保存されている郡の境界から5マイル以内のすべてのポイントを検索するクエリを作成します。 5
地球の表面の一部は、2次元またはデカルト平面に投影される場合があります。 投影座標系は、地域固有のアプリケーションに特に便利です。たとえば、データベースが北カンザスのジオメトリのみをカバーすることがわかっている場合は、その地域に固有の投影システムの使用を検討できます。 さらに、投影座標系はデカルト単位(メートルやフィートなど)で定義されるため、距離の計算が容易になります。
ノート
PostGISのWGS84で非ポイントジオメトリを使用して任意の距離クエリを実行し、適切なパフォーマンスが必要な場合は、 GeometryField.geography キーワードを有効にして、代わりに地理データベースタイプが使用されるようにします。
追加リソース:
- Spatialreference.org :Djangoを利用した空間参照系のデータベース。
- State Plane Coordinate System :米国で使用されているさまざまな投影システムをカバーするWebサイト。 米国の多く 検出される空間データは、WGS84などの地理座標系ではなく、これらの座標系の1つになります。
spatial_index
- BaseSpatialField.spatial_index
デフォルトはTrue
です。 指定されたジオメトリフィールドの空間インデックスを作成します。
ノート
これは、db_index
フィールドオプションとは異なります。これは、空間インデックスが通常のデータベースインデックスとは異なる方法で作成されるためです。 具体的には、空間インデックスは通常Rツリーのバリアントを使用して作成されますが、通常のデータベースインデックスは通常Bツリーを使用します。
ジオメトリフィールドオプション
ジオメトリフィールドで使用できる追加のオプションがあります。 以下のオプションはすべてオプションです。
dim
- GeometryField.dim
このオプションは、ジオメトリフィールドの座標寸法をカスタマイズするために使用できます。 デフォルトでは、2次元ジオメトリを表すために2に設定されています。 それをサポートする空間バックエンドの場合、3次元サポートの場合は3に設定できます。
ノート
現時点では、3DサポートはPostGISおよびSpatiaLiteバックエンドに限定されています。
geography
- GeometryField.geography
True
に設定すると、このオプションは、geometryではなくgeographyタイプのデータベース列を作成します。 詳細については、以下の地理タイプセクションを参照してください。
ノート
地理的サポートはPostGISに限定されており、SRIDを4326にする必要があります。
地理タイプ
地理タイプは、地理座標(WGS84経度/緯度など)で表される空間フィーチャのネイティブサポートを提供します。 6 ジオメトリタイプで使用される平面とは異なり、ジオメトリタイプはデータの球形表現を使用します。 地理列で実行される距離および測定操作は、大圏アーク計算を自動的に採用し、線形単位を返します。 つまり、ST_Distance
が2つのジオメトリで呼び出されると、メートル単位の値が返されます(WGS84のジオメトリ列で呼び出された場合の度とは対照的です)。
地理計算にはより多くの数学が含まれるため、地理タイプで使用できるのはPostGIS空間ルックアップのサブセットのみです。 実際には、これは、距離ルックアップに加えて、次の追加の空間ルックアップのみが地理列に使用できることを意味します。
入力として地理タイプをサポートしない空間ルックアップまたは集計を使用する必要がある場合は、 Cast データベース関数を使用して、クエリで地理列をジオメトリタイプに変換できます。
from django.contrib.gis.db.models import PointField
from django.db.models.functions import Cast
Zipcode.objects.annotate(
geom=Cast('geography_field', PointField())
).filter(geom__within=poly)
詳細については、PostGISドキュメントには、ジオメトリデータ型よりも地理データ型をいつ使用するかを決定するための役立つセクションが含まれています。
脚注
- 1
- OpenGIS Consortium、Inc。、 SQLの単純な機能仕様。
- 2
- Ch。のid。を参照してください。 2.3.8、p。 39(ジオメトリ値と空間参照系)。
- 3
- 通常、SRID整数はEPSG( European Petroleum Survey Group )識別子に対応します。 ただし、空間データベースの空間参照系テーブルで定義されたカスタム投影に関連付けることもできます。
- 4
- テリーA。 Slocum、RobertB。 マクマスター、フリッツC。 ケスラー&ヒューH。 ハワード、主題図作成と地理的視覚化(Prentice Hall、第2版)、Ch。 7.1.3.
- 5
- この制限はPostGISには適用されません。
- 6
- 詳細については、 PostGIS Geography Type のドキュメントを参照してください。