geodjango目前提供以下空间数据库后端:
django.contrib.gis.db.backends.postgis
django.contrib.gis.db.backends.mysql
django.contrib.gis.db.backends.oracle
django.contrib.gis.db.backends.spatialite
Django支持在现代MySQL版本中提供的真实几何图形上操作空间函数。然而,空间功能不如PostGIS等其他后台丰富。
RasterField
目前仅为PostGIS后端实现。空间查找可用于栅格字段,但空间数据库功能和聚合没有用于栅格字段。
以下是如何创建几何对象的示例(假设 Zipcode
型号):
>>> from zipcode.models import Zipcode
>>> z = Zipcode(code=77096, poly="POLYGON(( 10 10, 10 20, 20 20, 20 15, 10 10))")
>>> z.save()
GEOSGeometry
对象也可用于保存几何模型:
>>> from django.contrib.gis.geos import GEOSGeometry
>>> poly = GEOSGeometry("POLYGON(( 10 10, 10 20, 20 20, 20 15, 10 10))")
>>> z = Zipcode(code=77096, poly=poly)
>>> z.save()
此外,如果 GEOSGeometry
与字段的坐标系不同(具有不同的SRID值),则它将使用空间数据库的转换过程隐式转换为模型的字段的SRID:
>>> poly_3084 = GEOSGeometry(
... "POLYGON(( 10 10, 10 20, 20 20, 20 15, 10 10))", srid=3084
... ) # SRID 3084 is 'NAD83(HARN) / Texas Centric Lambert Conformal'
>>> z = Zipcode(code=78212, poly=poly_3084)
>>> z.save()
>>> from django.db import connection
>>> print(
... connection.queries[-1]["sql"]
... ) # printing the last SQL statement executed (requires DEBUG=True)
INSERT INTO "geoapp_zipcode" ("code", "poly") VALUES (78212, ST_Transform(ST_GeomFromWKB('\\001 ... ', 3084), 4326))
因此,可以使用 GEOSGeometry
对象,WKT(众所周知的文本 [1]) 、HEXEWKB(PostGIS特定--十六进制WKB几何体 [2]) ,和GeoJackson(请参阅 RFC 7946 ).本质上,如果输入不是 GEOSGeometry
对象时,几何字段将尝试创建 GEOSGeometry
来自输入的实例。
有关更多信息,请创建 GEOSGeometry
对象,请参阅 GEOS tutorial .
创建栅格模型时,栅格字段将隐式地将输入转换为 GDALRaster
使用懒惰的评估。因此,栅格字段将接受 GDALRaster
建造师。
以下是如何从栅格文件创建栅格对象的示例 volcano.tif
(假设 Elevation
型号):
>>> from elevation.models import Elevation
>>> dem = Elevation(name="Volcano", rast="/path/to/raster/volcano.tif")
>>> dem.save()
GDALRaster
对象也可用于保存栅格模型:
>>> from django.contrib.gis.gdal import GDALRaster
>>> rast = GDALRaster(
... {
... "width": 10,
... "height": 10,
... "name": "Canyon",
... "srid": 4326,
... "scale": [0.1, -0.1],
... "bands": [{"data": range(100)}],
... }
... )
>>> dem = Elevation(name="Canyon", rast=rast)
>>> dem.save()
请注意,这相当于:
>>> dem = Elevation.objects.create(
... name="Canyon",
... rast={
... "width": 10,
... "height": 10,
... "name": "Canyon",
... "srid": 4326,
... "scale": [0.1, -0.1],
... "bands": [{"data": range(100)}],
... },
... )
geodjango的查找类型可以用于任何管理器方法,如 filter()
, exclude()
等等。但是,geodjango特有的查找类型仅在空间字段上可用。
“正常”字段上的筛选器(例如 CharField
)可能与地理区域上的链接在一起。地理查找接受两侧的几何图形和栅格输入,输入类型可以自由混合。
地理查找的一般结构如下所述。完整的参考资料可在 spatial lookup reference .
使用几何进行地理查询的一般形式如下(假设 Zipcode
中使用的型号 geodjango型号API ):
>>> qs = Zipcode.objects.filter(<field>__<lookup_type>=<parameter>)
>>> qs = Zipcode.objects.exclude(...)
例如:
>>> qs = Zipcode.objects.filter(poly__contains=pnt)
>>> qs = Elevation.objects.filter(poly__contains=rst)
在这种情况下, poly
是地理区域, contains
是空间查找类型, pnt
是参数(可能是 GEOSGeometry
对象或一组geojson、wkt或hexewkb),以及 rst
是一个 GDALRaster
对象。
栅格查找语法类似于几何图形的语法。唯一的区别是,可以将带区索引指定为附加输入。如果未指定波段索引,则默认使用第一个波段(索引 0
)在这种情况下,语法与几何查找的语法相同。
要指定带区索引,可以在查找的两侧指定其他参数。在左侧,使用双下划线语法传递带区索引。在右侧,可以指定栅格和带区索引的元组。
这将导致涉及栅格的查找的一般形式如下(假设 Elevation
中使用的型号 geodjango型号API ):
>>> qs = Elevation.objects.filter(<field>__<lookup_type>=<parameter>)
>>> qs = Elevation.objects.filter(<field>__<band_index>__<lookup_type>=<parameter>)
>>> qs = Elevation.objects.filter(<field>__<lookup_type>=(<raster_input, <band_index>)
例如:
>>> qs = Elevation.objects.filter(rast__contains=geom)
>>> qs = Elevation.objects.filter(rast__contains=rst)
>>> qs = Elevation.objects.filter(rast__1__contains=geom)
>>> qs = Elevation.objects.filter(rast__contains=(rst, 1))
>>> qs = Elevation.objects.filter(rast__1__contains=(rst, 1))
在示例的左侧, rast
是地理栅格场 contains
是空间查找类型。在右手边, geom
是几何输入,并且 rst
是一个 GDALRaster
对象。波段索引默认为 0
在前两个查询中,并设置为 1
其他的。
虽然所有空间查找都可以用于两侧的栅格对象,但并非所有底层的操作符都接受栅格输入。对于操作员希望输入几何图形的情况,栅格将自动转换为几何图形。在解释查找结果时,一定要记住这一点。
栅格支持的类型列出了 compatibility table . 涉及raster的查找目前仅可用于PostGIS后端。
用空间数据计算距离很困难,因为不幸的是,地球并不平坦。由于PostGIS的局限性,某些带有地理坐标系中字段的距离查询可能必须以不同的方式表示。请看 选择SRID 节中 geodjango型号API 有关详细信息的文档。
Availability :Post地理信息系统、MariaDB、SQL、Oracle、SpatiaLite、PGRAaster(原生)
以下距离查找可用:
dwithin
(除了MariaDB和SQL)
备注
为了 测量 ,而不是查询距离,请使用 Distance
功能。
距离查找采用一个tuple参数,该参数包括:
从中进行计算的几何图形或栅格;以及
一个数字或 Distance
包含距离的对象。
如果A Distance
使用对象时,它可以用任何单位表示(生成的SQL将使用转换为字段单位的单位);否则,数字参数假定为字段单位。
备注
在PostGIS, ST_Distance_Sphere
做 not 限制几何图形类型使用执行地理距离查询。 [3] 但是,这些查询可能需要很长时间,因为必须动态计算大圆距离 每一个 查询中的行。这是因为无法使用传统几何字段上的空间索引。
为了在wgs84距离查询上获得更好的性能,请考虑使用 geography columns 而是在数据库中,因为它们能够在距离查询中使用空间索引。您可以通过设置来告诉geodjango使用地理列 geography=True
在您的字段定义中。
例如,假设我们有一个 SouthTexasCity
模型(从 GeoDjango distance tests ) 投影 坐标系适用于德克萨斯州南部城市:
from django.contrib.gis.db import models
class SouthTexasCity(models.Model):
name = models.CharField(max_length=30)
# A projected coordinate system (only valid for South Texas!)
# is used, units are in meters.
point = models.PointField(srid=32140)
则可按如下方式执行距离查询:
>>> from django.contrib.gis.geos import GEOSGeometry
>>> from django.contrib.gis.measure import D # ``D`` is a shortcut for ``Distance``
>>> from geoapp.models import SouthTexasCity
# Distances will be calculated from this point, which does not have to be projected.
>>> pnt = GEOSGeometry("POINT(-96.876369 29.905320)", srid=4326)
# If numeric parameter, units of field (meters in this case) are assumed.
>>> qs = SouthTexasCity.objects.filter(point__distance_lte=(pnt, 7000))
# Find all Cities within 7 km, > 20 miles away, and > 100 chains away (an obscure unit)
>>> qs = SouthTexasCity.objects.filter(point__distance_lte=(pnt, D(km=7)))
>>> qs = SouthTexasCity.objects.filter(point__distance_gte=(pnt, D(mi=20)))
>>> qs = SouthTexasCity.objects.filter(point__distance_gte=(pnt, D(chain=100)))
栅格查询的工作方式与替换几何字段的方式相同 point
使用栅格字段,或 pnt
对象和/或包含栅格对象。要指定右侧栅格输入的标注栏索引,可以按如下方式将一个三元组传递给查找:
>>> qs = SouthTexasCity.objects.filter(point__distance_gte=(rst, 2, D(km=7)))
其中带栅格索引2(第三个带)的带 rst
将用于查找。
下表提供了每个空间数据库后端可用的空间查找的摘要。Postgis栅格(PGRASTER)查找分为以下三类: raster lookup details :本机支持 N
双边本土支持 B
和几何转换支持 C
.
查找类型 |
PostGIS |
甲骨文公司 |
马里亚布 |
MySQL [4] |
SpatiaLite |
PGRaster |
---|---|---|---|---|---|---|
X |
X |
X |
X |
N |
||
X |
X |
X |
X |
N |
||
X |
X |
X |
X |
N |
||
X |
X |
X |
X |
X |
B |
|
X |
B |
|||||
X |
X |
X |
B |
|||
X |
X |
X |
B |
|||
X |
X |
X |
X |
C |
||
X |
X |
X |
X |
X |
B |
|
X |
X |
X |
X |
X |
N |
|
X |
X |
X |
X |
X |
N |
|
X |
X |
X |
X |
X |
N |
|
X |
X |
X |
X |
X |
N |
|
X |
X |
X |
B |
|||
X |
X |
X |
X |
X |
C |
|
X |
X |
X |
X |
X |
B |
|
X |
X |
X |
X |
X |
B |
|
X |
||||||
X |
X |
X |
X |
|||
X |
X |
X |
X |
X |
B |
|
X |
X |
X |
X |
C |
||
X |
X |
X |
X |
X |
B |
|
X |
X |
X |
X |
X |
B |
|
X |
X |
X |
X |
X |
B |
|
X |
C |
|||||
X |
C |
|||||
X |
B |
|||||
X |
B |
|||||
X |
C |
|||||
X |
C |
|||||
X |
C |
|||||
X |
C |
下表提供了每个空间后端上可用的特定于地理位置的数据库功能的摘要。
功能 |
PostGIS |
甲骨文公司 |
马里亚布 |
MySQL |
SpatiaLite |
---|---|---|---|---|---|
X |
X |
X |
X |
X |
|
X |
X |
X |
X |
X |
|
X |
X |
X |
|||
X |
X |
||||
X |
X |
||||
X |
X |
X |
X |
X |
|
X |
X |
X |
X |
X |
|
X |
X(LWGEOM/RTTOPO) |
||||
X |
X |
X(≥5.1) |
|||
X |
X |
X |
X |
X |
|
X |
X |
||||
X |
X |
X |
X |
X |
|
X |
X |
X |
X |
X |
|
X |
X |
X |
X |
X |
|
X |
X |
||||
X |
X |
X |
X |
X |
|
X |
X |
X |
X |
X |
|
X |
X |
X(LWGEOM/RTTOPO) |
|||
X |
X |
X |
X |
X |
|
X |
|||||
X |
X |
X |
X |
||
X |
X |
X |
X |
X |
|
X |
X |
||||
X |
X(LWGEOM/RTTOPO) |
||||
X |
|||||
X |
X |
X |
X |
X |
|
X |
X |
X |
X |
X |
|
X |
X |
X |
|||
X |
X |
X |
X |
||
X |
X |
X |
|||
X |
X |
||||
X |
X |
||||
X |
X |
X |
X |
X |
|
X |
X |
X |
|||
X |
X |
||||
X |
X |
X |
X |
X |
The following table provides a summary of what GIS-specific aggregate functions are available on each spatial backend. Please note that MariaDB does not support any of these aggregates, and is thus excluded from the table.
骨料 |
PostGIS |
甲骨文公司 |
MySQL |
SpatiaLite |
---|---|---|---|---|
X |
X(≥8.0.24) |
X |
||
X |
X |
X |
||
X |
||||
X |
X |
|||
X |
X |
X |
脚注
7月 22, 2024