GIS QuerySet API 参考¶
空间查找¶
本节中的空间查找适用于 GeometryField
和 RasterField
。
有关介绍,请参见 空间查找介绍。有关与特定空间后端兼容的查找概述,请参阅 空间查找兼容性表。
栅格查找¶
下面参考中的所有示例都针对几何字段和输入给出,但是查找可以以相同的方式用于两侧的栅格。每当查找不支持栅格输入时,系统会根据需要使用 ST_Polygon 函数自动将输入转换为几何图形。另请参见 栅格查找介绍。
查找使用的数据库运算符可以分为三类
原生栅格支持
N
:运算符原生接受查找两侧的栅格,并且可以将栅格输入与几何输入混合。双边栅格支持
B
:只有当查找的两侧都接收栅格输入时,运算符才支持栅格。对于混合查找,栅格数据会自动转换为几何图形。几何转换支持
C
:查找没有原生栅格支持,所有栅格数据都会自动转换为几何图形。
以下示例显示了不同类型栅格支持下查找的 SQL 等效项。相同的模式适用于所有空间查找。
情况 |
查找 |
SQL 等效项 |
---|---|---|
N, B |
|
|
N, B |
|
|
B, C |
|
|
B, C |
|
|
B, C |
|
|
B, C |
|
|
C |
|
|
C |
|
|
C |
|
|
C |
|
|
栅格的空间查找仅支持 PostGIS 后端(在本节中称为 PGRaster)。
bbcontains
¶
可用性:PostGIS、MariaDB、MySQL、SpatiaLite、PGRaster(原生)
测试几何图形或栅格字段的边界框是否完全包含查找几何图形的边界框。
示例
Zipcode.objects.filter(poly__bbcontains=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
bboverlaps
¶
可用性:PostGIS、MariaDB、MySQL、SpatiaLite、PGRaster(原生)
测试几何字段的边界框是否与查找几何图形的边界框重叠。
示例
Zipcode.objects.filter(poly__bboverlaps=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
contained
¶
可用性:PostGIS、MariaDB、MySQL、SpatiaLite、PGRaster(原生)
测试几何字段的边界框是否完全包含在查找几何图形的边界框中。
示例
Zipcode.objects.filter(poly__contained=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
contains
¶
可用性:PostGIS、Oracle、MariaDB、MySQL、SpatiaLite、PGRaster(双边)
测试几何字段是否在空间上包含查找几何图形。
示例
Zipcode.objects.filter(poly__contains=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
contains_properly
¶
可用性:PostGIS、PGRaster(双边)
如果查找几何图形与几何字段的内部相交,但不与边界(或外部)相交,则返回 true。
示例
Zipcode.objects.filter(poly__contains_properly=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
coveredby
¶
可用性:PostGIS、Oracle、PGRaster(双边)、SpatiaLite
测试几何字段中没有任何点位于查找几何图形之外。[3]
示例
Zipcode.objects.filter(poly__coveredby=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
Oracle |
|
SpatiaLite |
|
covers
¶
可用性:PostGIS、Oracle、PGRaster(双边)、SpatiaLite
测试查找几何图形中没有任何点位于几何字段之外。[3]
示例
Zipcode.objects.filter(poly__covers=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
Oracle |
|
SpatiaLite |
|
crosses
¶
可用性:PostGIS、MariaDB、MySQL、SpatiaLite、PGRaster(转换)
测试几何字段是否在空间上与查找几何图形交叉。
示例
Zipcode.objects.filter(poly__crosses=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
disjoint
¶
可用性:PostGIS、Oracle、MariaDB、MySQL、SpatiaLite、PGRaster(双边)
测试几何字段是否在空间上与查找几何图形不相交。
示例
Zipcode.objects.filter(poly__disjoint=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
equals
¶
可用性:PostGIS、Oracle、MariaDB、MySQL、SpatiaLite、PGRaster(转换)
测试几何字段是否在空间上等于查找几何图形。
示例
Zipcode.objects.filter(poly__equals=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
exact
、same_as
¶
可用性:PostGIS、Oracle、MariaDB、MySQL、SpatiaLite、PGRaster(双边)
测试几何字段是否“等于”查找几何图形。在 Oracle、MySQL 和 SpatiaLite 上,它测试空间相等性,而在 PostGIS 上,它测试边界框的相等性。
示例
Zipcode.objects.filter(poly=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
intersects
¶
可用性:PostGIS、Oracle、MariaDB、MySQL、SpatiaLite、PGRaster(双边)
测试几何字段是否在空间上与查找几何图形相交。
示例
Zipcode.objects.filter(poly__intersects=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
isempty
¶
可用性:PostGIS
测试几何图形是否为空。
示例
Zipcode.objects.filter(poly__isempty=True)
isvalid
¶
可用性:MySQL,PostGIS,Oracle,SpatiaLite
测试几何图形是否有效。
示例
Zipcode.objects.filter(poly__isvalid=True)
后端 |
SQL 等效项 |
---|---|
MySQL、PostGIS、SpatiaLite |
|
Oracle |
|
overlaps
¶
可用性:PostGIS,Oracle,MariaDB,MySQL,SpatiaLite,PGRaster(双向)
测试几何图形字段是否在空间上与查找几何图形重叠。
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
Oracle |
|
MariaDB |
|
MySQL |
|
SpatiaLite |
|
relate
¶
可用性:PostGIS,MariaDB,Oracle,SpatiaLite,PGRaster(转换)
测试几何图形字段是否根据给定模式中的值在空间上与查找几何图形相关。此查找需要一个元组参数,(geom, pattern)
;pattern
的形式将取决于空间后端。
MariaDB、PostGIS 和 SpatiaLite¶
在这些空间后端上,交集模式是由九个字符组成的字符串,这些字符定义了几何图形字段的内部、边界和外部与查找几何图形之间的交集。交集模式矩阵只能使用以下字符:1
、2
、T
、F
或 *
。此查找类型允许用户“微调”与 DE-9IM 模型一致的特定几何关系。[1]
几何示例
# A tuple lookup parameter is used to specify the geometry and
# the intersection pattern (the pattern here is for 'contains').
Zipcode.objects.filter(poly__relate=(geom, "T*T***FF*"))
PostGIS 和 MariaDB SQL 等效语句
SELECT ... WHERE ST_Relate(poly, geom, 'T*T***FF*')
SpatiaLite SQL 等效语句
SELECT ... WHERE Relate(poly, geom, 'T*T***FF*')
栅格示例
Zipcode.objects.filter(poly__relate=(rast, 1, "T*T***FF*"))
Zipcode.objects.filter(rast__2__relate=(rast, 1, "T*T***FF*"))
PostGIS SQL 等效语句
SELECT ... WHERE ST_Relate(poly, ST_Polygon(rast, 1), 'T*T***FF*')
SELECT ... WHERE ST_Relate(ST_Polygon(rast, 2), ST_Polygon(rast, 1), 'T*T***FF*')
Oracle¶
这里的关联模式至少包含九个关联字符串中的一个:TOUCH
、OVERLAPBDYDISJOINT
、OVERLAPBDYINTERSECT
、EQUAL
、INSIDE
、COVEREDBY
、CONTAINS
、COVERS
、ON
和 ANYINTERACT
。可以使用逻辑布尔运算符 OR 组合多个字符串,例如 'inside+touch'
。[2] 关联字符串不区分大小写。
示例
Zipcode.objects.filter(poly__relate=(geom, "anyinteract"))
Oracle SQL 等效语句
SELECT ... WHERE SDO_RELATE(poly, geom, 'anyinteract')
touches
¶
可用性:PostGIS,Oracle,MariaDB,MySQL,SpatiaLite
测试几何图形字段是否在空间上与查找几何图形相切。
示例
Zipcode.objects.filter(poly__touches=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
within
¶
可用性:PostGIS,Oracle,MariaDB,MySQL,SpatiaLite,PGRaster(双向)
测试几何图形字段是否在空间上位于查找几何图形内。
示例
Zipcode.objects.filter(poly__within=geom)
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
left
¶
可用性:PostGIS,PGRaster(转换)
测试几何图形字段的边界框是否严格位于查找几何图形的边界框左侧。
示例
Zipcode.objects.filter(poly__left=geom)
PostGIS 等效语句
SELECT ... WHERE poly << geom
right
¶
可用性:PostGIS,PGRaster(转换)
测试几何图形字段的边界框是否严格位于查找几何图形的边界框右侧。
示例
Zipcode.objects.filter(poly__right=geom)
PostGIS 等效语句
SELECT ... WHERE poly >> geom
overlaps_left
¶
可用性:PostGIS,PGRaster(双向)
测试几何图形字段的边界框是否与查找几何图形的边界框重叠或位于其左侧。
示例
Zipcode.objects.filter(poly__overlaps_left=geom)
PostGIS 等效语句
SELECT ... WHERE poly &< geom
overlaps_right
¶
可用性:PostGIS,PGRaster(双向)
测试几何图形字段的边界框是否与查找几何图形的边界框重叠或位于其右侧。
示例
Zipcode.objects.filter(poly__overlaps_right=geom)
PostGIS 等效语句
SELECT ... WHERE poly &> geom
overlaps_above
¶
可用性:PostGIS,PGRaster(转换)
测试几何图形字段的边界框是否与查找几何图形的边界框重叠或位于其上方。
示例
Zipcode.objects.filter(poly__overlaps_above=geom)
PostGIS 等效语句
SELECT ... WHERE poly |&> geom
overlaps_below
¶
可用性:PostGIS,PGRaster(转换)
测试几何图形字段的边界框是否与查找几何图形的边界框重叠或位于其下方。
示例
Zipcode.objects.filter(poly__overlaps_below=geom)
PostGIS 等效语句
SELECT ... WHERE poly &<| geom
strictly_above
¶
可用性:PostGIS,PGRaster(转换)
测试几何图形字段的边界框是否严格位于查找几何图形的边界框上方。
示例
Zipcode.objects.filter(poly__strictly_above=geom)
PostGIS 等效语句
SELECT ... WHERE poly |>> geom
strictly_below
¶
可用性:PostGIS,PGRaster(转换)
测试几何图形字段的边界框是否严格位于查找几何图形的边界框下方。
示例
Zipcode.objects.filter(poly__strictly_below=geom)
PostGIS 等效语句
SELECT ... WHERE poly <<| geom
距离查找¶
可用性:PostGIS、Oracle、MariaDB、MySQL、SpatiaLite、PGRaster(原生)
有关执行距离查询的概述,请参阅距离查询简介。
距离查找采用以下形式
<field>__<distance lookup>=(<geometry/raster>, <distance value>[, "spheroid"])
<field>__<distance lookup>=(<raster>, <band_index>, <distance value>[, "spheroid"])
<field>__<band_index>__<distance lookup>=(<raster>, <band_index>, <distance value>[, "spheroid"])
传递到距离查找中的值是一个元组;前两个值是必填的,分别是计算距离到的几何图形和距离值(字段单位的数字、Distance
对象或查询表达式)。要将波段索引传递到查找中,请使用 3 元组,其中第二个条目是波段索引。
在除dwithin
之外的所有距离查找中,都可以包含一个可选元素'spheroid'
,以便对具有大地坐标系的字段使用更精确的球体距离计算函数。
在 PostgreSQL 上,“spheroid”选项使用ST_DistanceSpheroid而不是ST_DistanceSphere。更简单的ST_Distance函数用于投影坐标系。栅格将转换为几何图形以进行基于球体的查找。
distance_gt
¶
返回模型,其中查找几何图形到几何图形字段的距离大于给定的距离值。
示例
Zipcode.objects.filter(poly__distance_gt=(geom, D(m=5)))
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
distance_gte
¶
返回模型,其中查找几何图形到几何图形字段的距离大于或等于给定的距离值。
示例
Zipcode.objects.filter(poly__distance_gte=(geom, D(m=5)))
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
distance_lt
¶
返回模型,其中查找几何图形到几何图形字段的距离小于给定的距离值。
示例
Zipcode.objects.filter(poly__distance_lt=(geom, D(m=5)))
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
distance_lte
¶
返回模型,其中查找几何图形到几何图形字段的距离小于或等于给定的距离值。
示例
Zipcode.objects.filter(poly__distance_lte=(geom, D(m=5)))
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
MariaDB |
|
MySQL |
|
Oracle |
|
SpatiaLite |
|
dwithin
¶
返回模型,其中查找几何图形与几何字段之间的距离彼此在给定距离内。请注意,只有当目标几何图形位于投影系统中时,才能提供Distance
对象。对于地理几何图形,应使用几何字段的单位(例如,WGS84
的度数)。
示例
Zipcode.objects.filter(poly__dwithin=(geom, D(m=5)))
后端 |
SQL 等效项 |
---|---|
PostGIS |
|
Oracle |
|
SpatiaLite |
|
聚合函数¶
Django 提供一些特定于 GIS 的聚合函数。有关如何使用这些聚合函数的详细信息,请参阅关于聚合的主题指南。
关键字参数 |
描述 |
---|---|
|
此关键字仅适用于 Oracle。它是 |
示例
>>> from django.contrib.gis.db.models import Extent, Union
>>> WorldBorder.objects.aggregate(Extent("mpoly"), Union("mpoly"))
Collect
¶
可用性:PostGIS、MySQL、SpatiaLite
从几何列返回 GEOMETRYCOLLECTION
或 MULTI
几何对象。这类似于 Union
聚合的简化版本,但它可能比执行联合快几个数量级,因为它将几何图形卷曲成集合或多对象,而不关心边界溶解。
添加了对使用 filter
参数的支持。
添加了 MySQL 8.0.24+ 支持。
Extent
¶
可用性:PostGIS、Oracle、SpatiaLite
将 QuerySet
中所有 geo_field
的范围作为 4 元组返回,包括左下角坐标和右上角坐标。
示例
>>> qs = City.objects.filter(name__in=("Houston", "Dallas")).aggregate(Extent("poly"))
>>> print(qs["poly__extent"])
(-96.8016128540039, 29.7633724212646, -95.3631439208984, 32.782058715820)
添加了对使用 filter
参数的支持。
Extent3D
¶
可用性:PostGIS
将 QuerySet
中所有 geo_field
的 3D 范围作为 6 元组返回,包括左下角坐标和右上角坐标(每个都有 x、y 和 z 坐标)。
示例
>>> qs = City.objects.filter(name__in=("Houston", "Dallas")).aggregate(Extent3D("poly"))
>>> print(qs["poly__extent3d"])
(-96.8016128540039, 29.7633724212646, 0, -95.3631439208984, 32.782058715820, 0)
添加了对使用 filter
参数的支持。
MakeLine
¶
可用性:PostGIS、SpatiaLite
返回由 QuerySet
中点字段几何图形构建的 LineString
。目前,对查询集进行排序无效。
示例
>>> qs = City.objects.filter(name__in=("Houston", "Dallas")).aggregate(MakeLine("poly"))
>>> print(qs["poly__makeline"])
LINESTRING (-95.3631510000000020 29.7633739999999989, -96.8016109999999941 32.7820570000000018)
添加了对使用 filter
参数的支持。
Union
¶
可用性:PostGIS、Oracle、SpatiaLite
此方法返回一个 GEOSGeometry
对象,该对象包含查询集中每个几何图形的并集。请注意,使用 Union
是处理器密集型的,并且在大型查询集上可能需要大量时间。
注意
如果使用此方法的计算时间过长,请考虑改用 Collect
。
示例
>>> u = Zipcode.objects.aggregate(Union(poly)) # This may take a long time.
>>> u = Zipcode.objects.filter(poly__within=bbox).aggregate(
... Union(poly)
... ) # A more sensible approach.
添加了对使用 filter
参数的支持。
脚注