本文档探讨了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()
除了可用于Django模型字段的常规Field options之外,空间字段还具有以下附加选项。 所有都是可选的。
srid
¶BaseSpatialField。
SRID T0> ¶ T1>
将几何字段的SRID [2](空间参考系统标识)设置为给定值。 默认为4326(也称为WGS84,单位为经度和纬度度数)。
为模型选择合适的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代替。
其他资源:
“几何”字段还有其他选项。 所有以下选项都是可选的。
dim
¶GeometryField。
暗淡 T0> ¶ T1>
此选项可用于自定义几何字段的坐标尺寸。 默认情况下,它设置为2,用于表示二维几何。 对于支持它的空间后端,可以将其设置为3以进行三维支持。
注
此时3D支持仅限于PostGIS空间后端。
geography
¶GeometryField。
地理 T0> ¶ T1>
如果设置为True
,此选项将创建类型为geography的数据库列,而不是几何。 有关详情,请参阅下面的geography type部分。
注
地理支持仅限于PostGIS,并且将强制SRID为4326。
地理类型为用地理坐标(例如,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地理位置类型文档。 |
2017年9月6日