地理資料庫函式

此頁面上記載的函式允許使用者在 Django 中存取地理資料庫函式,以用於註釋、聚合或篩選。

範例

>>> from django.contrib.gis.db.models.functions import Length
>>> Track.objects.annotate(length=Length("line")).filter(length__gt=100)

並非所有後端都支援所有函式,因此請參閱每個函式的文件,以查看您的資料庫後端是否支援您想要使用的函式。如果您在不支援該函式的後端上呼叫地理函式,則會收到 NotImplementedError 例外狀況。

函式摘要

測量

關係

運算

編輯器

輸入格式

輸出格式

其他

面積

方位角

差異

ForcePolygonCW

AsGeoJSON

IsEmpty

距離

BoundingCircle

交集

MakeValid

AsGML

IsValid

GeometryDistance

重心

SymDifference

反轉

AsKML

MemSize

長度

ClosestPoint

聯集

縮放

AsSVG

NumGeometries

周長

Envelope LineLocatePoint PointOnSurface

SnapToGrid Transform Translate

FromWKB FromWKT

AsWKB AsWKT GeoHash

NumPoints

Area

class Area(expression, **extra)[原始碼]

可用性:MariaDB、MySQL、Oracle、PostGIS、SpatiaLite

接受單一地理欄位或運算式,並以 Area 測量值傳回欄位的面積。

沒有 LWGEOM/RTTOPO 的 MySQL 和 SpatiaLite 不支援地理 SRSes 的面積計算。

AsGeoJSON

class AsGeoJSON(expression, bbox=False, crs=False, precision=8, **extra)[原始碼]

可用性:MariaDB、MySQL、Oracle、PostGIS、SpatiaLite

接受單一地理欄位或運算式,並傳回幾何的 GeoJSON 表示法。請注意,結果不是完整的 GeoJSON 結構,而只是 GeoJSON 結構的 geometry 索引鍵內容。另請參閱 GeoJSON 序列化器

範例

>>> City.objects.annotate(json=AsGeoJSON("point")).get(name="Chicago").json
{"type":"Point","coordinates":[-87.65018,41.85039]}

關鍵字引數

描述

bbox

如果您想要將邊界框包含在傳回的 GeoJSON 中,請將此設定為 True。在 Oracle 上會忽略。

crs

如果您想要將座標參考系統包含在傳回的 GeoJSON 中,請將此設定為 True。在 MySQL 和 Oracle 上會忽略。

precision

可用於指定 GeoJSON 表示法中座標的有效位數 - 預設值為 8。在 Oracle 上會忽略。

AsGML

class AsGML(expression, version=2, precision=8, **extra)[原始碼]

可用性:Oracle、PostGIS、SpatiaLite

接受單一地理欄位或運算式,並傳回幾何的地理標記語言 (GML) 表示法。

範例

>>> qs = Zipcode.objects.annotate(gml=AsGML("poly"))
>>> print(qs[0].gml)
<gml:Polygon srsName="EPSG:4326"><gml:OuterBoundaryIs>-147.78711,70.245363 ...
-147.78711,70.245363</gml:OuterBoundaryIs></gml:Polygon>

關鍵字引數

描述

precision

指定 GML 表示法中座標的有效位數 - 預設值為 8。在 Oracle 上會忽略。

version

指定要使用的 GML 版本:2(預設)或 3。

AsKML

class AsKML(expression, precision=8, **extra)[原始碼]

可用性PostGIS、SpatiaLite

接受單一地理欄位或運算式,並傳回幾何的 Keyhole 標記語言 (KML) 表示法。

範例

>>> qs = Zipcode.objects.annotate(kml=AsKML("poly"))
>>> print(qs[0].kml)
<Polygon><outerBoundaryIs><LinearRing><coordinates>-103.04135,36.217596,0 ...
-103.04135,36.217596,0</coordinates></LinearRing></outerBoundaryIs></Polygon>

關鍵字引數

描述

precision

此關鍵字可用於指定 KML 表示法中座標的有效位數 - 預設值為 8。

AsSVG

class AsSVG(expression, relative=False, precision=8, **extra)[原始碼]

可用性PostGIS、SpatiaLite

接受單一地理欄位或運算式,並傳回幾何的 可縮放向量圖形 (SVG) 表示法。

關鍵字引數

描述

relative

如果設定為 True,則路徑資料將以相對移動的方式實作。預設值為 False,表示改用絕對移動。

precision

此關鍵字可用於指定 SVG 表示法中座標的有效位數 - 預設值為 8。

AsWKB

class AsWKB(expression, **extra)[原始碼]

可用性:MariaDB、MySQL、Oracle、PostGIS、SpatiaLite

接受單一地理欄位或運算式,並傳回幾何的 知名二進位 (WKB) 表示法。

範例

>>> bytes(City.objects.annotate(wkb=AsWKB("point")).get(name="Chelyabinsk").wkb)
b'\x01\x01\x00\x00\x00]3\xf9f\x9b\x91K@\x00X\x1d9\xd2\xb9N@'

AsWKT

class AsWKT(expression, **extra)[原始碼]

可用性:MariaDB、MySQL、Oracle、PostGIS、SpatiaLite

接受單一地理欄位或運算式,並傳回幾何的Well-known text (WKT)表示法。

範例

>>> City.objects.annotate(wkt=AsWKT("point")).get(name="Chelyabinsk").wkt
'POINT (55.137555 61.451728)'

Azimuth

class Azimuth(point_a, point_b, **extra)[原始碼]

可用性PostGIS、SpatiaLite (LWGEOM/RTTOPO)

傳回由給定點幾何定義的線段的方位角(以弧度為單位),如果兩個點重合則傳回 None。方位角是以北方為參考的角度,並以順時針方向為正:北方 = 0;東方 = π/2;南方 = π;西方 = 3π/2

BoundingCircle

class BoundingCircle(expression, num_seg=48, **extra)[原始碼]

可用性PostGISOracle、SpatiaLite 5.1+

接受單一地理欄位或運算式,並傳回可以完全包含該幾何的最小圓形多邊形。

num_seg 參數僅在 PostGIS 上使用。

在 Django 5.1 中變更

新增了 SpatiaLite 5.1+ 的支援。

Centroid

class Centroid(expression, **extra)[原始碼]

可用性:MariaDB、MySQLPostGIS、Oracle、SpatiaLite

接受單一地理欄位或運算式,並傳回幾何的 centroid 值。

ClosestPoint

在 Django 5.0 中新增。
class ClosestPoint(expr1, expr2, **extra)[原始碼]

可用性PostGIS、SpatiaLite

接受兩個地理欄位或運算式,並傳回幾何 A 上最接近幾何 B 的二維點。

Difference

class Difference(expr1, expr2, **extra)[原始碼]

可用性:MariaDB、MySQLPostGIS、Oracle、SpatiaLite

接受兩個地理欄位或運算式,並傳回幾何差,即幾何 A 中不與幾何 B 相交的部分。

Distance

class Distance(expr1, expr2, spheroid=None, **extra)[原始碼]

可用性:MariaDB、MySQLPostGIS、Oracle、SpatiaLite

接受兩個地理欄位或運算式,並以 Distance 物件的形式傳回它們之間的距離。在 MySQL 上,當座標為測地座標時,會傳回原始浮點數值。

在支援測地座標距離計算的後端上,會根據幾何圖形的 SRID 值自動選擇適當的後端函數(例如,PostGIS 上的 ST_DistanceSphere)。

當使用測地(角度)座標計算距離時(預設 WGS84 (4326) SRID 即為這種情況),您可以設定 spheroid 關鍵字引數,以決定計算應該基於簡單的球體(精確度較低、資源密集度較低)還是基於橢球體(精確度較高、資源密集度較高)。

在以下範例中,會計算從霍巴特市到 AustraliaCity 查詢集中每個其他PointField的距離

>>> from django.contrib.gis.db.models.functions import Distance
>>> pnt = AustraliaCity.objects.get(name="Hobart").point
>>> for city in AustraliaCity.objects.annotate(distance=Distance("point", pnt)):
...     print(city.name, city.distance)
...
Wollongong 990071.220408 m
Shellharbour 972804.613941 m
Thirroul 1002334.36351 m
...

請注意

由於 distance 屬性是 Distance 物件,因此您可以輕鬆地以您選擇的單位來表示該值。例如,city.distance.mi 是以英里為單位的距離值,而 city.distance.km 是以公里為單位的距離值。如需使用詳情和支援的單位清單,請參閱測量物件

Envelope

class Envelope(expression, **extra)[原始碼]

可用性:MariaDB、MySQLOraclePostGIS、SpatiaLite

接受單一地理欄位或運算式,並傳回表示該幾何圖形邊界框的幾何圖形。

ForcePolygonCW

class ForcePolygonCW(expression, **extra)[原始碼]

可用性PostGIS、SpatiaLite

接受單一地理欄位或運算式,並傳回多邊形/多重多邊形的修改版本,其中所有外環都以順時針方向定向,所有內環都以逆時針方向定向。非多邊形幾何圖形會保持不變。

FromWKB

class FromWKB(expression, srid=0, **extra)[原始碼]

可用性:MariaDB、MySQL、Oracle、PostGIS、SpatiaLite

Well-known binary (WKB) 表示法建立幾何圖形。可選的 srid 引數允許指定產生的幾何圖形的 SRID。srid 在 Oracle 上會被忽略。

在 Django 5.1 中變更

新增了 srid 引數。

FromWKT

class FromWKT(expression, srid=0, **extra)[原始碼]

可用性: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite

Well-known text (WKT) 表示法建立幾何圖形。選用的 srid 引數允許指定結果幾何圖形的 SRID。srid 在 Oracle 上會被忽略。

在 Django 5.1 中變更

新增了 srid 引數。

GeoHash

class GeoHash(expression, precision=None, **extra)[原始碼]

可用性: MySQL, PostGIS, SpatiaLite (LWGEOM/RTTOPO)

接受單一地理欄位或表達式,並傳回幾何圖形的GeoHash表示法。

precision 關鍵字引數控制結果中的字元數。

GeometryDistance

class GeometryDistance(expr1, expr2, **extra)[原始碼]

可用性: PostGIS

接受兩個地理欄位或表達式,並傳回它們之間的距離。當在 order_by() 子句中使用時,它會提供索引輔助的最近鄰結果集。

Intersection

class Intersection(expr1, expr2, **extra)[原始碼]

可用性: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite

接受兩個地理欄位或表達式,並傳回它們之間的幾何交集。

IsEmpty

class IsEmpty(expr)[原始碼]

可用性: PostGIS

接受地理欄位或表達式,並測試該值是否為空幾何圖形。如果其值為空,則傳回 True,否則傳回 False

IsValid

class IsValid(expr)[原始碼]

可用性: MySQL, PostGIS, Oracle, SpatiaLite

接受地理欄位或表達式,並測試該值是否格式正確。如果其值為有效幾何圖形,則傳回 True,否則傳回 False

Length

class Length(expression, spheroid=True, **extra)[原始碼]

可用性: MariaDB, MySQL, Oracle, PostGIS, SpatiaLite

接受單一地理線字串或多線字串欄位或表達式,並以 Distance 測量值傳回其長度。

在 PostGIS 和 SpatiaLite 上,當座標為大地測量 (角度) 時,您可以使用 spheroid 關鍵字引數指定計算應基於簡單球體(較不精確,資源密集度較低)還是基於橢球體(較精確,資源密集度較高)。

MySQL 不支援地理 SRS 上的長度計算。

LineLocatePoint

class LineLocatePoint(linestring, point, **extra)[原始碼]

可用性: PostGIS, SpatiaLite

傳回介於 0 和 1 之間的浮點數,表示 linestring 上最接近指定 point 的點的位置,以 2D 線長度的分數表示。

MakeValid

class MakeValid(expr)[原始碼]

可用性: PostGIS, SpatiaLite (LWGEOM/RTTOPO)

接受地理欄位或表達式,並嘗試將該值轉換為有效的幾何圖形,而不會遺失任何輸入頂點。已經有效的幾何圖形會以不變的方式傳回。簡單多邊形可能會變成多邊形,且結果的維度可能低於輸入。

MemSize

class MemSize(expression, **extra)[原始碼]

可用性: PostGIS

接受單一地理欄位或表達式,並傳回幾何欄位所佔用的記憶體大小(以位元組為單位)。

NumGeometries

class NumGeometries(expression, **extra)[原始碼]

可用性:MariaDB、MySQLPostGIS、Oracle、SpatiaLite

接受單一地理欄位或表達式,如果幾何欄位是集合(例如 GEOMETRYCOLLECTIONMULTI* 欄位),則傳回幾何的數量。單一幾何則傳回 1。

在 MySQL 上,單一幾何會傳回 None

NumPoints

class NumPoints(expression, **extra)[原始碼]

可用性:MariaDB、MySQLPostGIS、Oracle、SpatiaLite

接受單一地理欄位或表達式,並傳回幾何中的點數。

在 MySQL 上,任何非 LINESTRING 幾何都會傳回 None

Perimeter

class Perimeter(expression, **extra)[原始碼]

可用性PostGIS、Oracle、SpatiaLite

接受單一地理欄位或表達式,並將幾何欄位的周長以 Distance 物件傳回。

PointOnSurface

class PointOnSurface(expression, **extra)[原始碼]

可用性PostGIS、MariaDB、Oracle、SpatiaLite

接受單一地理欄位或表達式,並傳回保證位於欄位表面的 Point 幾何;否則傳回 None

Reverse

class Reverse(expression, **extra)[原始碼]

可用性PostGIS、Oracle、SpatiaLite

接受單一地理欄位或表達式,並傳回具有反轉座標的幾何。

Scale

class Scale(expression, x, y, z=0.0, **extra)[原始碼]

可用性PostGIS、SpatiaLite

接受單一地理欄位或表達式,並傳回透過將座標乘以 xy,以及可選的 z 參數縮放後的幾何。

SnapToGrid

class SnapToGrid(expression, *args, **extra)[原始碼]

可用性PostGIS、SpatiaLite

接受單一地理欄位或表達式,並傳回所有點都貼齊到指定網格的幾何。幾何如何貼齊網格取決於給定的數值(浮點數、整數或長整數)引數數量。

引數數量

描述

1

單一尺寸,用於貼齊 X 和 Y 網格。

2

X 和 Y 尺寸,用於貼齊網格。

4

X、Y 尺寸以及對應的 X、Y 原點。

SymDifference

class SymDifference(expr1, expr2, **extra)[原始碼]

可用性:MariaDB、MySQLPostGIS、Oracle、SpatiaLite

接受兩個地理欄位或表達式,並傳回給定參數之間的幾何對稱差(聯集但不包含交集)。

Transform

class Transform(expression, srid, **extra)[原始碼]

可用性PostGIS、Oracle、SpatiaLite

接受地理欄位或表達式和 SRID 整數代碼,並傳回轉換為 srid 參數指定的空間參考系統的幾何。

請注意

整數 SRID 對應的空間參考系統可能取決於所使用的空間資料庫。換句話說,用於 Oracle 的 SRID 數字不一定與 PostGIS 使用的數字相同。

Translate

class Translate(expression, x, y, z=0.0, **extra)[原始碼]

可用性PostGIS、SpatiaLite

接受單一地理欄位或表達式,並傳回其座標由 xy,以及可選的 z 數值參數偏移的幾何。

Union

class Union(expr1, expr2, **extra)[原始碼]

可用性: MariaDB, MySQL, PostGIS, Oracle, SpatiaLite

接受兩個地理欄位或表達式,並返回兩個幾何圖形的聯集。

返回頂部