本文档探讨了GeoDjango Model API的详细信息。在本节中,我们将使用邮政编码的以下地理模型作为示例:
from django.contrib.gis.db import models
class Zipcode(models.Model):
code = models.CharField(max_length=5)
poly = models.PolygonField()
objects = models.GeoManager()
除了可用于Django模型字段的常规Field options之外,几何字段还具有以下附加选项。所有都是可选的。
将几何字段的SRID [2](空间参考系统标识)设置为给定值。默认为4326(也称为WGS84,单位为经度和纬度度数)。
为模型选择合适的SRID是开发人员应仔细考虑的重要决定。SRID是对应于将用于解释空间数据库中的数据的投影系统的整数指示符。[3]投影系统将上下文赋予指定位置的坐标。虽然大地测量的细节超出了本文档的范围,但一般的问题是地球是球面的,地球的表示(例如纸质地图,Web地图)不是。
大多数人都熟悉使用纬度和经度来引用地球表面上的位置。但是,纬度和经度是角度,而不是距离。[4]换句话说,平面上两点之间的最短路径为直线,曲面(如地球)上两点之间的最短路径为 大圆的圆弧。[5]因此,需要额外的计算来获得平面单位(例如,公里和英里)的距离。使用地理坐标系统可以为开发人员稍后引入复杂性。例如,Spatialite不具有使用地理坐标系在几何之间执行距离计算的能力,例如,构造查询以查找存储为WGS84的县边界5英里内的所有点。[6]
地球表面的一部分可以投影到二维或笛卡尔平面上。投影坐标系统对于特定区域的应用程序特别方便,例如,如果您知道您的数据库只覆盖North Kansas中的几何图形,那么您可以考虑使用特定于该区域的投影系统。此外,投影坐标系以笛卡尔单位(例如米或英尺)定义,简化距离计算。
注意
如果您希望在PostGIS中使用WGS84中的非点几何体执行任意距离查询,并且希望获得良好的性能,请启用GeometryField.geography关键字,以便使用geography database type代替。
其他资源:
默认为True。为给定的几何字段创建空间索引。
注意
这与db_index字段选项不同,因为空间索引的创建方式与常规数据库索引不同。具体来说,通常使用R树的变体来创建空间索引,而常规数据库索引通常使用B树。
此选项可用于自定义几何字段的坐标尺寸。默认情况下,它设置为2,用于表示二维几何。对于支持它的空间后端,可以将其设置为3以进行三维支持。
注意
此时3D支持仅限于PostGIS空间后端。
如果设置为True,此选项将创建类型为geography的数据库列,而不是几何。有关详情,请参阅下面的geography type部分。
注意
地理支持仅限于PostGIS,并且将强制SRID为4326。
地理类型为用地理坐标(例如,WGS84经度/纬度)表示的空间特征提供原生支持。[7]与几何类型使用的平面不同,地理类型使用其数据的球形表示。在地理列上执行的距离和测量操作自动采用大圆弧计算和返回线性单位。换句话说,当在两个地理位置上调用ST_Distance时,返回一个以米为单位的值(如果在WGS84中的几何列上调用,则返回度数)。
因为地理计算涉及更多的数学,所以只有一部分PostGIS空间查找可用于地理类型。实际上,这意味着除了distance lookups,只有以下附加的spatial lookups可用于地理列:
有关详细信息,PostGIS文档包含有关确定何时使用几何数据类型上的地理位置数据类型的有用部分。
为了进行地理查询,每个地理模型都需要一个GeoManager模型管理器。这个管理器允许对地理查询进行适当的SQL构造;因此,没有它,所有地理过滤器将失败。It should also be noted that GeoManager is required even if the model does not have a geographic field itself, e.g., in the case of a ForeignKey relation to a model with a geographic field. 例如,如果我们有一个Address模型,其中包含ForeignKey到我们的Zipcode模型:
from django.contrib.gis.db import models
class Address(models.Model):
num = models.IntegerField()
street = models.CharField(max_length=100)
city = models.CharField(max_length=100)
state = models.CharField(max_length=2)
zipcode = models.ForeignKey(Zipcode)
objects = models.GeoManager()
需要地理管理员对相关Zipcode对象执行空间查询,例如:
qs = Address.objects.filter(zipcode__poly__contains='POINT(-104.590948 38.319914)')
脚注
[1] | OpenGIS Consortium,Inc.,SQL的简单功能规范。 |
[2] | 请参阅id。在Ch。2.3.8,p。几何值和空间参考系统。 |
[3] | 通常,SRID整数对应于EPSG(European Petroleum Survey Group)标识符。但是,它也可以与在空间数据库的空间参考系统表中定义的自定义投影相关联。 |
[4] | 哈佛大学设计研究生院大地测量学和地理参考系统概述。这是一个优秀的资源,用于概述与地理和笛卡尔坐标系相关的原理。 |
[5] | Terry A. Slocum,Robert B. McMaster,Fritz C. Kessler,&Hugh H. Howard,Thematic Cartography and Geographic Visualization(Prentice Hall,第2版)7.1.3. |
[6] | 此限制不适用于PostGIS。 |
[7] | 有关详细信息,请参阅PostGIS地理位置类型文档。 |
2015年5月13日