GeoDjango 模型 API¶
本文探討 GeoDjango 模型 API 的細節。在本節中,我們將使用以下地理模型,例如 郵遞區號 和 數位高程模型 作為範例。
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 Simple Features 規範 [1]。柵格資料沒有這樣的標準。
GeometryField
¶
幾何欄位的基底類別。
PointField
¶
儲存 Point
。
LineStringField
¶
儲存 LineString
。
PolygonField
¶
儲存 Polygon
。
MultiPointField
¶
儲存 MultiPoint
。
MultiLineStringField
¶
儲存 MultiLineString
。
MultiPolygonField
¶
儲存 MultiPolygon
。
GeometryCollectionField
¶
RasterField
¶
儲存 GDALRaster
。
RasterField
目前僅針對 PostGIS 後端實作。
空間欄位選項¶
除了 Django 模型欄位可用的常規 欄位選項 之外,空間欄位還有以下其他選項。所有選項都是可選的。
srid
¶
- BaseSpatialField.srid¶
將幾何欄位的 SRID [2](空間參考系統識別碼)設定為給定的值。預設為 4326(也稱為 WGS84,單位為經度和緯度)。
選擇 SRID¶
為模型選擇合適的 SRID 是開發人員應仔細考慮的重要決定。SRID 是一個整數指定符,對應於將用於解釋空間資料庫中資料的投影系統。[3]投影系統為指定位置的座標提供內容。儘管 大地測量學 的細節超出本文件的範圍,但一般問題是地球是球形的,而地球的表示(例如,紙質地圖、網路地圖)不是。
大多數人習慣使用經度和緯度來參考地球表面上的位置。但是,經度和緯度是角度,而不是距離。換句話說,雖然平面上兩點之間的最短路徑是一條直線,但曲面(如地球)上兩點之間的最短路徑是 大圓 的弧。[4]因此,需要額外的計算才能獲得平面單位(例如,公里和英里)的距離。使用地理座標系統可能會在以後給開發人員帶來複雜性。例如,SpatiaLite 無法使用地理座標系統執行幾何圖形之間的距離計算,例如建構一個查詢以找出所有在 5 英里範圍內,並以 WGS84 儲存的縣邊界內的所有點。[5]
地球表面的部分可以投影到二維或笛卡爾平面上。投影座標系統對於特定區域的應用程式特別方便,例如,如果您知道資料庫僅涵蓋 北堪薩斯州的幾何圖形,則可以考慮使用特定於該區域的投影系統。此外,投影座標系統以笛卡爾單位(例如,公尺或英尺)定義,從而簡化了距離計算。
注意
如果您希望在 PostGIS 中使用 WGS84 的非點幾何圖形執行任意距離查詢,並且希望獲得良好的效能,請啟用 GeometryField.geography
關鍵字,以便改用 地理資料庫類型。
其他資源
spatialreference.org:一個由 Django 驅動的空間參考系統資料庫。
州平面座標系統:一個涵蓋美國使用的各種投影系統的網站。遇到的大部分美國空間資料將採用這些座標系統之一,而不是採用諸如 WGS84 的地理座標系統。
spatial_index
¶
- BaseSpatialField.spatial_index¶
預設為 True
。為給定的幾何欄位建立空間索引。
注意
這與 db_index
欄位選項不同,因為空間索引的建立方式與常規資料庫索引不同。具體而言,空間索引通常是使用 R-Tree 的變體建立的,而常規資料庫索引通常使用 B-Tree。
幾何欄位選項¶
幾何欄位還有其他選項可用。以下所有選項都是可選的。
dim
¶
- GeometryField.dim¶
此選項可用於自訂幾何欄位的座標維度。預設值為 2,表示二維幾何。對於支援的空間後端,可以設定為 3 以支援三維。
注意
目前 3D 支援僅限於 PostGIS 和 SpatiaLite 後端。
geography
¶
- GeometryField.geography¶
如果設定為 True
,此選項將建立一個地理類型 (geography) 的資料庫欄位,而非幾何類型 (geometry)。請參考下方 地理類型 章節以獲取更多詳細資訊。
注意
地理支援僅限於 PostGIS,並會強制 SRID 為 4326。
地理類型¶
地理類型提供對以地理座標(例如,WGS84 經度/緯度)表示的空間特徵的原生支援。[6] 與幾何類型使用的平面不同,地理類型使用其資料的球形表示。在地理欄位上執行的距離和測量操作會自動採用大圓弧計算並返回線性單位。換句話說,當在兩個地理位置上呼叫 ST_Distance
時,會返回以公尺為單位的值(如果是在 WGS84 中的幾何欄位上呼叫,則會返回以度為單位的值)。
由於地理計算涉及更多的數學運算,因此只有 PostGIS 空間查詢的一個子集可用於地理類型。實際上,這表示除了 距離查詢 之外,只有下列額外的 空間查詢 可用於地理欄位:
如果您需要使用不支援地理類型作為輸入的空間查詢或彙總,您可以使用 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 文件包含一個有用的章節,說明 何時使用地理資料類型而非幾何資料類型。
腳註