GeoDjango Model API

本文档探讨了GeoDjango Model API的详细信息。 在本节中,我们将使用邮政编码数字高程模型的以下地理模型作为示例:

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()

空间字段类型

空间字段由一系列几何字段类型和一个栅格字段类型组成。 每个几何字段类型都对应于OpenGIS简单特征规范[1] 栅格数据没有这样的标准。

GeometryField

GeometryField T0> ¶ T1>

PointField

PointField T0> ¶ T1>

LineStringField

LineStringField T0> ¶ T1>

PolygonField

PolygonField T0> ¶ T1>

MultiPointField

MultiPointField T0> ¶ T1>

MultiLineStringField

MultiLineStringField T0> ¶ T1>

MultiPolygonField

MultiPolygonField T0> ¶ T1>

GeometryCollectionField

GeometryCollectionField T0> ¶ T1>

RasterField

RasterField T0> ¶ T1>

RasterField目前仅适用于PostGIS后端。

空间字段选项

除了可用于Django模型字段的常规Field options之外,空间字段还具有以下附加选项。 所有都是可选的。

srid

BaseSpatialField。 SRID T0> ¶ T1>

将几何字段的SRID [2](空间参考系统标识)设置为给定值。 默认为4326(也称为WGS84,单位为经度和纬度度数)。

Selecting an SRID

为模型选择合适的SRID是开发人员应仔细考虑的重要决定。 SRID是对应于将用于解释空间数据库中的数据的投影系统的整数指示符。 [3]投影系统将上下文赋予指定位置的坐标。 虽然大地测量的细节超出了本文档的范围,但一般的问题是地球是球面的,地球的表示(例如纸质地图,Web地图)不是。

大多数人都熟悉使用纬度和经度来引用地球表面上的位置。 但是,纬度和经度是角度,而不是距离。 In other words, while the shortest path between two points on a flat surface is a straight line, the shortest path between two points on a curved surface (such as the earth) is an arc of a great circle. [4]因此,需要额外的计算来获得平面单位(例如公里和英里)的距离。 使用地理坐标系统可以为开发人员稍后引入复杂性。 例如,SpatiaLite无法使用地理坐标系进行几何之间的距离计算,例如,构建一个查询,以查找存储为WGS84的县边界5英里内的所有点。 [5]

地球表面的一部分可以投影到二维或笛卡尔平面上。 投影坐标系统对于特定区域的应用程序特别方便,例如,如果您知道您的数据库只覆盖North Kansas中的几何图形,那么您可以考虑使用特定于该区域的投影系统。 此外,投影坐标系以笛卡尔单位(例如米或英尺)定义,简化距离计算。

如果您希望在PostGIS中使用WGS84中的非点几何体执行任意距离查询,并且希望获得良好的性能,请启用GeometryField.geography关键字,以便使用geography database type代替。

其他资源:

  • spatialreference.org:一个由Django提供的空间参考系统数据库。
  • 国家平面坐标系:覆盖美国各种投影系统的网站。 遇到的大多数美国空间数据将在这些坐标系中的一个中,而不是在诸如WGS84的地理坐标系中。

spatial_index

BaseSpatialField。 SPATIAL_INDEX T0> ¶ T1>

默认为True 为给定的几何字段创建空间索引。

这与db_index字段选项不同,因为空间索引的创建方式与常规数据库索引不同。 具体来说,通常使用R树的变体来创建空间索引,而常规数据库索引通常使用B树。

Geometry Field Options

“几何”字段还有其他选项。 所有以下选项都是可选的。

dim

GeometryField。暗淡 T0> ¶ T1>

此选项可用于自定义几何字段的坐标尺寸。 默认情况下,它设置为2,用于表示二维几何。 对于支持它的空间后端,可以将其设置为3以进行三维支持。

此时3D支持仅限于PostGIS空间后端。

geography

GeometryField。地理 T0> ¶ T1>

如果设置为True,此选项将创建类型为geography的数据库列,而不是几何。 有关详情,请参阅下面的geography type部分。

地理支持仅限于PostGIS,并且将强制SRID为4326。

Geography Type

地理类型为用地理坐标(例如,WGS84经度/纬度)表示的空间特征提供原生支持。 [6]与几何类型使用的平面不同,地理类型使用其数据的球面表示。 在地理列上执行的距离和测量操作自动采用大​​圆弧计算和返回线性单位。 换句话说,当在两个地理位置上调用ST_Distance时,返回一个以米为单位的值(如果在WGS84中的几何列上调用,则返回度数)。

因为地理计算涉及更多的数学,所以只有一部分PostGIS空间查找可用于地理类型。 实际上,这意味着除了distance lookups,只有以下附加的spatial lookups可用于地理列:

如果您需要使用不支持地理类型作为输入的空间查找或聚合,则可以使用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文档包含有关确定何时使用几何数据类型上的地理位置数据类型的有用部分。

GeoManager

的GeoManager T0> ¶ T1>

需要GeoManager才能使用传统的GeoQuerySet Methods

自1.9版以来已弃用 All GeoQuerySet methods have been deprecated and replaced by equivalent database functions. 一旦您的代码中替换了遗留方法,您就可以从启用GIS的类中删除特殊的GeoManager

脚注

[1]OpenGIS Consortium,Inc.,SQL的简单功能规范
[2]见id。 在Ch。 2.3.8,p。几何值和空间参考系统。
[3]通常,SRID整数对应于EPSG(European Petroleum Survey Group)标识符。 但是,它也可以与在空间数据库的空间参考系统表中定义的自定义投影相关联。
[4]Terry A. Slocum,Robert B. McMaster,Fritz C. Kessler,&Hugh H. Howard,Thematic Cartography and Geographic Visualization(Prentice Hall,第2版) 7.1.3.
[5]此限制不适用于PostGIS。
[6]有关详细信息,请参阅PostGIS地理位置类型文档。