本文档探讨了geodjango模型API的详细信息。在本节中,我们将使用以下地理模型 `ZIP code`_ 和A `Digital Elevation Model`_ _例如:
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
¶几何图形字段的基类。
PointField
¶商店A Point
.
LineStringField
¶商店A LineString
.
PolygonField
¶商店A Polygon
.
MultiPointField
¶商店A MultiPoint
.
MultiLineStringField
¶商店A MultiLineString
.
MultiPolygonField
¶商店A MultiPolygon
.
GeometryCollectionField
¶商店A GeometryCollection
.
RasterField
¶商店A GDALRaster
.
RasterField
目前仅为PostGIS后端实现。
除了常规的 字段选项 对于django模型字段,空间字段有以下附加选项。所有都是可选的。
srid
¶设置SRID [2] 几何字段的(空间参考系统标识)到给定值。默认为4326(也称为 `WGS84`_ _单位是经度和纬度)。
为您的模型选择适当的SRID是开发人员应该仔细考虑的重要决策。SRID是一个整数说明符,对应于将用于解释空间数据库中的数据的投影系统。 [3] 投影系统为指定位置的坐标提供上下文。虽然详细的信息 `geodesy`__ 都超出了本文的范围,但普遍的问题是,地球是球形的,而地球的表示(例如,纸质地图、网络地图)不是。
大多数人都熟悉使用纬度和经度来参考地球表面的一个位置。然而,纬度和经度是角度,而不是距离。换句话说,虽然平面上两点之间的最短路径是直线,但曲面上两点(如地球)之间的最短路径是 arc A的 `great circle`_ _. [4] 因此,需要额外的计算来获得以平面单位表示的距离(例如公里和英里)。使用地理坐标系统可能会给开发人员带来一些麻烦。例如,空间陨石不具备使用地理坐标系统进行几何体之间距离计算的能力,例如,构建查询以查找存储为wgs84的县边界5英里内的所有点。 [5]
地球表面的一部分可以投射到二维或笛卡尔平面上。投影坐标系对于特定区域的应用特别方便,例如,如果您知道您的数据库将只涵盖 `North Kansas`_ _然后,您可以考虑使用特定于该区域的投影系统。此外,投影坐标系以笛卡尔单位(如米或英尺)定义,从而简化了距离计算。
备注
如果希望使用PostGIS中的wgs84中的非点几何图形执行任意距离查询,并且希望获得良好的性能,请启用 GeometryField.geography
关键字使 geography database type 而是使用。
其他资源:
`spatialreference.org`__: 以Django为动力的空间参考系统数据库。
`The State Plane Coordinate System`__: 介绍美国使用的各种投影系统的网站。所遇到的大部分美国空间数据将位于其中一个坐标系中,而不是地理坐标系(如WGS84)。
spatial_index
¶默认为 True
. 为给定的几何图形字段创建空间索引。
备注
这和 db_index
字段选项,因为空间索引的创建方式与常规数据库索引不同。具体来说,空间索引通常使用R树的变体创建,而常规数据库索引通常使用B树。
几何图形字段还有其他可用选项。以下所有选项都是可选的。
dim
¶此选项可用于自定义几何图形字段的坐标尺寸。默认情况下,它设置为2,用于表示二维几何图形。对于支持它的空间后端,三维支持可以设置为3。
备注
目前,3D支持仅限于Post地理信息系统和SpatiaLite后台。
geography
¶如果设置为 True
,此选项将创建地理类型的数据库列,而不是几何类型的数据库列。请参阅 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文档包含一个关于确定 when to use geography data type over geometry data type .
脚注
7月 22, 2024