GIS QuerySet API 参考

空间查找

本节中的空间查找适用于 GeometryFieldRasterField

有关介绍,请参见 空间查找介绍。有关与特定空间后端兼容的查找概述,请参阅 空间查找兼容性表

栅格查找

下面参考中的所有示例都针对几何字段和输入给出,但是查找可以以相同的方式用于两侧的栅格。每当查找不支持栅格输入时,系统会根据需要使用 ST_Polygon 函数自动将输入转换为几何图形。另请参见 栅格查找介绍

查找使用的数据库运算符可以分为三类

  • 原生栅格支持 N:运算符原生接受查找两侧的栅格,并且可以将栅格输入与几何输入混合。

  • 双边栅格支持 B:只有当查找的两侧都接收栅格输入时,运算符才支持栅格。对于混合查找,栅格数据会自动转换为几何图形。

  • 几何转换支持 C:查找没有原生栅格支持,所有栅格数据都会自动转换为几何图形。

以下示例显示了不同类型栅格支持下查找的 SQL 等效项。相同的模式适用于所有空间查找。

情况

查找

SQL 等效项

N, B

rast__contains=rst

ST_Contains(rast, rst)

N, B

rast__1__contains=(rst, 2)

ST_Contains(rast, 1, rst, 2)

B, C

rast__contains=geom

ST_Contains(ST_Polygon(rast), geom)

B, C

rast__1__contains=geom

ST_Contains(ST_Polygon(rast, 1), geom)

B, C

poly__contains=rst

ST_Contains(poly, ST_Polygon(rst))

B, C

poly__contains=(rst, 1)

ST_Contains(poly, ST_Polygon(rst, 1))

C

rast__crosses=rst

ST_Crosses(ST_Polygon(rast), ST_Polygon(rst))

C

rast__1__crosses=(rst, 2)

ST_Crosses(ST_Polygon(rast, 1), ST_Polygon(rst, 2))

C

rast__crosses=geom

ST_Crosses(ST_Polygon(rast), geom)

C

poly__crosses=rst

ST_Crosses(poly, ST_Polygon(rst))

栅格的空间查找仅支持 PostGIS 后端(在本节中称为 PGRaster)。

bbcontains

可用性PostGIS、MariaDB、MySQL、SpatiaLite、PGRaster(原生)

测试几何图形或栅格字段的边界框是否完全包含查找几何图形的边界框。

示例

Zipcode.objects.filter(poly__bbcontains=geom)

后端

SQL 等效项

PostGIS

poly ~ geom

MariaDB

MBRContains(poly, geom)

MySQL

MBRContains(poly, geom)

SpatiaLite

MbrContains(poly, geom)

bboverlaps

可用性PostGIS、MariaDB、MySQL、SpatiaLite、PGRaster(原生)

测试几何字段的边界框是否与查找几何图形的边界框重叠。

示例

Zipcode.objects.filter(poly__bboverlaps=geom)

后端

SQL 等效项

PostGIS

poly && geom

MariaDB

MBROverlaps(poly, geom)

MySQL

MBROverlaps(poly, geom)

SpatiaLite

MbrOverlaps(poly, geom)

contained

可用性PostGIS、MariaDB、MySQL、SpatiaLite、PGRaster(原生)

测试几何字段的边界框是否完全包含在查找几何图形的边界框中。

示例

Zipcode.objects.filter(poly__contained=geom)

后端

SQL 等效项

PostGIS

poly @ geom

MariaDB

MBRWithin(poly, geom)

MySQL

MBRWithin(poly, geom)

SpatiaLite

MbrWithin(poly, geom)

contains

可用性PostGIS、Oracle、MariaDB、MySQL、SpatiaLite、PGRaster(双边)

测试几何字段是否在空间上包含查找几何图形。

示例

Zipcode.objects.filter(poly__contains=geom)

后端

SQL 等效项

PostGIS

ST_Contains(poly, geom)

Oracle

SDO_CONTAINS(poly, geom)

MariaDB

ST_Contains(poly, geom)

MySQL

ST_Contains(poly, geom)

SpatiaLite

Contains(poly, geom)

contains_properly

可用性PostGIS、PGRaster(双边)

如果查找几何图形与几何字段的内部相交,但不与边界(或外部)相交,则返回 true。

示例

Zipcode.objects.filter(poly__contains_properly=geom)

后端

SQL 等效项

PostGIS

ST_ContainsProperly(poly, geom)

coveredby

可用性PostGIS、Oracle、PGRaster(双边)、SpatiaLite

测试几何字段中没有任何点位于查找几何图形之外。[3]

示例

Zipcode.objects.filter(poly__coveredby=geom)

后端

SQL 等效项

PostGIS

ST_CoveredBy(poly, geom)

Oracle

SDO_COVEREDBY(poly, geom)

SpatiaLite

CoveredBy(poly, geom)

covers

可用性PostGIS、Oracle、PGRaster(双边)、SpatiaLite

测试查找几何图形中没有任何点位于几何字段之外。[3]

示例

Zipcode.objects.filter(poly__covers=geom)

后端

SQL 等效项

PostGIS

ST_Covers(poly, geom)

Oracle

SDO_COVERS(poly, geom)

SpatiaLite

Covers(poly, geom)

crosses

可用性PostGIS、MariaDB、MySQL、SpatiaLite、PGRaster(转换)

测试几何字段是否在空间上与查找几何图形交叉。

示例

Zipcode.objects.filter(poly__crosses=geom)

后端

SQL 等效项

PostGIS

ST_Crosses(poly, geom)

MariaDB

ST_Crosses(poly, geom)

MySQL

ST_Crosses(poly, geom)

SpatiaLite

Crosses(poly, geom)

disjoint

可用性PostGIS、Oracle、MariaDB、MySQL、SpatiaLite、PGRaster(双边)

测试几何字段是否在空间上与查找几何图形不相交。

示例

Zipcode.objects.filter(poly__disjoint=geom)

后端

SQL 等效项

PostGIS

ST_Disjoint(poly, geom)

Oracle

SDO_GEOM.RELATE(poly, 'DISJOINT', geom, 0.05)

MariaDB

ST_Disjoint(poly, geom)

MySQL

ST_Disjoint(poly, geom)

SpatiaLite

Disjoint(poly, geom)

equals

可用性PostGIS、Oracle、MariaDB、MySQL、SpatiaLite、PGRaster(转换)

测试几何字段是否在空间上等于查找几何图形。

示例

Zipcode.objects.filter(poly__equals=geom)

后端

SQL 等效项

PostGIS

ST_Equals(poly, geom)

Oracle

SDO_EQUAL(poly, geom)

MariaDB

ST_Equals(poly, geom)

MySQL

ST_Equals(poly, geom)

SpatiaLite

Equals(poly, geom)

exactsame_as

可用性PostGIS、Oracle、MariaDB、MySQL、SpatiaLite、PGRaster(双边)

测试几何字段是否“等于”查找几何图形。在 Oracle、MySQL 和 SpatiaLite 上,它测试空间相等性,而在 PostGIS 上,它测试边界框的相等性。

示例

Zipcode.objects.filter(poly=geom)

后端

SQL 等效项

PostGIS

poly ~= geom

Oracle

SDO_EQUAL(poly, geom)

MariaDB

ST_Equals(poly, geom)

MySQL

ST_Equals(poly, geom)

SpatiaLite

Equals(poly, geom)

intersects

可用性PostGIS、Oracle、MariaDB、MySQL、SpatiaLite、PGRaster(双边)

测试几何字段是否在空间上与查找几何图形相交。

示例

Zipcode.objects.filter(poly__intersects=geom)

后端

SQL 等效项

PostGIS

ST_Intersects(poly, geom)

Oracle

SDO_OVERLAPBDYINTERSECT(poly, geom)

MariaDB

ST_Intersects(poly, geom)

MySQL

ST_Intersects(poly, geom)

SpatiaLite

Intersects(poly, geom)

isempty

可用性PostGIS

测试几何图形是否为空。

示例

Zipcode.objects.filter(poly__isempty=True)

isvalid

可用性:MySQL,PostGIS,Oracle,SpatiaLite

测试几何图形是否有效。

示例

Zipcode.objects.filter(poly__isvalid=True)

后端

SQL 等效项

MySQL、PostGIS、SpatiaLite

ST_IsValid(poly)

Oracle

SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(poly, 0.05) = 'TRUE'

overlaps

可用性PostGIS,Oracle,MariaDB,MySQL,SpatiaLite,PGRaster(双向)

测试几何图形字段是否在空间上与查找几何图形重叠。

后端

SQL 等效项

PostGIS

ST_Overlaps(poly, geom)

Oracle

SDO_OVERLAPS(poly, geom)

MariaDB

ST_Overlaps(poly, geom)

MySQL

ST_Overlaps(poly, geom)

SpatiaLite

Overlaps(poly, geom)

relate

可用性PostGIS,MariaDB,Oracle,SpatiaLite,PGRaster(转换)

测试几何图形字段是否根据给定模式中的值在空间上与查找几何图形相关。此查找需要一个元组参数,(geom, pattern)pattern 的形式将取决于空间后端。

MariaDB、PostGIS 和 SpatiaLite

在这些空间后端上,交集模式是由九个字符组成的字符串,这些字符定义了几何图形字段的内部、边界和外部与查找几何图形之间的交集。交集模式矩阵只能使用以下字符:12TF*。此查找类型允许用户“微调”与 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

这里的关联模式至少包含九个关联字符串中的一个:TOUCHOVERLAPBDYDISJOINTOVERLAPBDYINTERSECTEQUALINSIDECOVEREDBYCONTAINSCOVERSONANYINTERACT。可以使用逻辑布尔运算符 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

ST_Touches(poly, geom)

MariaDB

ST_Touches(poly, geom)

MySQL

ST_Touches(poly, geom)

Oracle

SDO_TOUCH(poly, geom)

SpatiaLite

Touches(poly, geom)

within

可用性PostGIS,Oracle,MariaDB,MySQL,SpatiaLite,PGRaster(双向)

测试几何图形字段是否在空间上位于查找几何图形内。

示例

Zipcode.objects.filter(poly__within=geom)

后端

SQL 等效项

PostGIS

ST_Within(poly, geom)

MariaDB

ST_Within(poly, geom)

MySQL

ST_Within(poly, geom)

Oracle

SDO_INSIDE(poly, geom)

SpatiaLite

Within(poly, geom)

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

ST_Distance/ST_Distance_Sphere(poly, geom) > 5

MariaDB

ST_Distance(poly, geom) > 5

MySQL

ST_Distance(poly, geom) > 5

Oracle

SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) > 5

SpatiaLite

Distance(poly, geom) > 5

distance_gte

返回模型,其中查找几何图形到几何图形字段的距离大于或等于给定的距离值。

示例

Zipcode.objects.filter(poly__distance_gte=(geom, D(m=5)))

后端

SQL 等效项

PostGIS

ST_Distance/ST_Distance_Sphere(poly, geom) >= 5

MariaDB

ST_Distance(poly, geom) >= 5

MySQL

ST_Distance(poly, geom) >= 5

Oracle

SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) >= 5

SpatiaLite

Distance(poly, geom) >= 5

distance_lt

返回模型,其中查找几何图形到几何图形字段的距离小于给定的距离值。

示例

Zipcode.objects.filter(poly__distance_lt=(geom, D(m=5)))

后端

SQL 等效项

PostGIS

ST_Distance/ST_Distance_Sphere(poly, geom) < 5

MariaDB

ST_Distance(poly, geom) < 5

MySQL

ST_Distance(poly, geom) < 5

Oracle

SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) < 5

SpatiaLite

Distance(poly, geom) < 5

distance_lte

返回模型,其中查找几何图形到几何图形字段的距离小于或等于给定的距离值。

示例

Zipcode.objects.filter(poly__distance_lte=(geom, D(m=5)))

后端

SQL 等效项

PostGIS

ST_Distance/ST_Distance_Sphere(poly, geom) <= 5

MariaDB

ST_Distance(poly, geom) <= 5

MySQL

ST_Distance(poly, geom) <= 5

Oracle

SDO_GEOM.SDO_DISTANCE(poly, geom, 0.05) <= 5

SpatiaLite

Distance(poly, geom) <= 5

dwithin

返回模型,其中查找几何图形与几何字段之间的距离彼此在给定距离内。请注意,只有当目标几何图形位于投影系统中时,才能提供Distance 对象。对于地理几何图形,应使用几何字段的单位(例如,WGS84 的度数)。

示例

Zipcode.objects.filter(poly__dwithin=(geom, D(m=5)))

后端

SQL 等效项

PostGIS

ST_DWithin(poly, geom, 5)

Oracle

SDO_WITHIN_DISTANCE(poly, geom, 5)

SpatiaLite

PtDistWithin(poly, geom, 5)

聚合函数

Django 提供一些特定于 GIS 的聚合函数。有关如何使用这些聚合函数的详细信息,请参阅关于聚合的主题指南

关键字参数

描述

容差

此关键字仅适用于 Oracle。它是 SDOAGGRTYPE 过程使用的容差值;Oracle 文档 包含更多详细信息。

示例

>>> from django.contrib.gis.db.models import Extent, Union
>>> WorldBorder.objects.aggregate(Extent("mpoly"), Union("mpoly"))

Collect

class Collect(geo_field, filter=None)[source]

可用性PostGIS、MySQL、SpatiaLite

从几何列返回 GEOMETRYCOLLECTIONMULTI 几何对象。这类似于 Union 聚合的简化版本,但它可能比执行联合快几个数量级,因为它将几何图形卷曲成集合或多对象,而不关心边界溶解。

Django 5.0 中的更改

添加了对使用 filter 参数的支持。

Django 5.1 中的更改

添加了 MySQL 8.0.24+ 支持。

Extent

class Extent(geo_field, filter=None)[source]

可用性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)
Django 5.0 中的更改

添加了对使用 filter 参数的支持。

Extent3D

class Extent3D(geo_field, filter=None)[source]

可用性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)
Django 5.0 中的更改

添加了对使用 filter 参数的支持。

MakeLine

class MakeLine(geo_field, filter=None)[source]

可用性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)
Django 5.0 中的更改

添加了对使用 filter 参数的支持。

Union

class Union(geo_field, filter=None)[source]

可用性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.
Django 5.0 中的更改

添加了对使用 filter 参数的支持。

脚注

返回顶部