GEOS API

背景

什麼是 GEOS?

GEOS 代表 Geometry Engine - Open Source (幾何引擎 - 開放原始碼),是一個 C++ 函式庫,從 Java Topology Suite 移植而來。GEOS 實作了 OpenGIS Simple Features for SQL 空間謂詞函數和空間運算符。GEOS 現在是一個 OSGeo 專案,最初由加拿大維多利亞的 Refractions Research 開發和維護。

特性

GeoDjango 實作了 GEOS 函式庫的高階 Python 包裝器,其特性包括:

  • 一個以 BSD 授權的 GEOS 幾何常式介面,完全使用 ctypes 在 Python 中實作。

  • 與 GeoDjango 鬆散耦合。例如,GEOSGeometry 物件可以在 Django 專案/應用程式之外使用。換句話說,不需要設定 DJANGO_SETTINGS_MODULE 環境變數或使用資料庫等等。

  • 可變性:GEOSGeometry 物件可以修改。

  • 跨平台且經過測試;與 Windows、Linux、Solaris 和 macOS 平台相容。

教學

本節包含使用 GEOSGeometry 物件的簡短介紹和教學。

建立幾何

可以透過幾種方式建立 GEOSGeometry 物件。第一種方法是簡單地以一些空間輸入來實例化物件 — 以下是從 WKT、HEX、WKB 和 GeoJSON 建立相同幾何的範例

>>> from django.contrib.gis.geos import GEOSGeometry
>>> pnt = GEOSGeometry("POINT(5 23)")  # WKT
>>> pnt = GEOSGeometry("010100000000000000000014400000000000003740")  # HEX
>>> pnt = GEOSGeometry(
...     memoryview(
...         b"\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x007@"
...     )
... )  # WKB
>>> pnt = GEOSGeometry(
...     '{ "type": "Point", "coordinates": [ 5.000000, 23.000000 ] }'
... )  # GeoJSON

另一種選擇是使用您想要建立的特定幾何類型的建構函式。例如,可以將 X 和 Y 座標傳遞到其建構函式中來建立 Point 物件。

>>> from django.contrib.gis.geos import Point
>>> pnt = Point(5, 23)

所有這些建構函式都接受關鍵字引數 srid。例如:

>>> from django.contrib.gis.geos import GEOSGeometry, LineString, Point
>>> print(GEOSGeometry("POINT (0 0)", srid=4326))
SRID=4326;POINT (0 0)
>>> print(LineString((0, 0), (1, 1), srid=4326))
SRID=4326;LINESTRING (0 0, 1 1)
>>> print(Point(0, 0, srid=32140))
SRID=32140;POINT (0 0)

最後,還有 fromfile() 工廠方法,該方法會從檔案中傳回 GEOSGeometry 物件。

>>> from django.contrib.gis.geos import fromfile
>>> pnt = fromfile("/path/to/pnt.wkt")
>>> pnt = fromfile(open("/path/to/pnt.wkt"))

幾何是 Python 式的

GEOSGeometry 物件是「Python 式」的,換句話說,可以使用標準的 Python 約定來存取、修改和迭代元件。例如,您可以迭代 Point 中的座標

>>> pnt = Point(5, 23)
>>> [coord for coord in pnt]
[5.0, 23.0]

對於任何幾何物件,可以使用 GEOSGeometry.coords 屬性將幾何座標作為 Python 元組取得。

>>> pnt.coords
(5.0, 23.0)

您可以使用標準的 Python 索引技術來取得/設定幾何元件。但是,傳回的內容取決於物件的幾何類型。例如,對 LineString 進行索引會傳回座標元組

>>> from django.contrib.gis.geos import LineString
>>> line = LineString((0, 0), (0, 50), (50, 50), (50, 0), (0, 0))
>>> line[0]
(0.0, 0.0)
>>> line[-2]
(50.0, 0.0)

而對 Polygon 進行索引將傳回與索引相對應的環 ( LinearRing 物件)

>>> from django.contrib.gis.geos import Polygon
>>> poly = Polygon(((0.0, 0.0), (0.0, 50.0), (50.0, 50.0), (50.0, 0.0), (0.0, 0.0)))
>>> poly[0]
<LinearRing object at 0x1044395b0>
>>> poly[0][-2]  # second-to-last coordinate of external ring
(50.0, 0.0)

此外,幾何的座標/元件可以像 Python 列表一樣新增或修改

>>> line[0] = (1.0, 1.0)
>>> line.pop()
(0.0, 0.0)
>>> line.append((1.0, 1.0))
>>> line.coords
((1.0, 1.0), (0.0, 50.0), (50.0, 50.0), (50.0, 0.0), (1.0, 1.0))

幾何支援類似集合的運算符

>>> from django.contrib.gis.geos import LineString
>>> ls1 = LineString((0, 0), (2, 2))
>>> ls2 = LineString((1, 1), (3, 3))
>>> print(ls1 | ls2)  # equivalent to `ls1.union(ls2)`
MULTILINESTRING ((0 0, 1 1), (1 1, 2 2), (2 2, 3 3))
>>> print(ls1 & ls2)  # equivalent to `ls1.intersection(ls2)`
LINESTRING (1 1, 2 2)
>>> print(ls1 - ls2)  # equivalent to `ls1.difference(ls2)`
LINESTRING(0 0, 1 1)
>>> print(ls1 ^ ls2)  # equivalent to `ls1.sym_difference(ls2)`
MULTILINESTRING ((0 0, 1 1), (2 2, 3 3))

相等運算符不檢查空間相等性

GEOSGeometry 相等運算符使用 equals_exact(),而不是 equals(),也就是說,它要求比較幾何在相同位置具有相同座標和相同的 SRID。

>>> from django.contrib.gis.geos import LineString
>>> ls1 = LineString((0, 0), (1, 1))
>>> ls2 = LineString((1, 1), (0, 0))
>>> ls3 = LineString((1, 1), (0, 0), srid=4326)
>>> ls1.equals(ls2)
True
>>> ls1 == ls2
False
>>> ls3 == ls2  # different SRIDs
False

幾何物件

GEOSGeometry

class GEOSGeometry(geo_input, srid=None)[原始碼]
參數:
  • geo_input – 幾何輸入值(字串或 memoryview

  • srid (int) – 空間參考識別符

這是所有 GEOS 幾何物件的基底類別。它使用給定的 geo_input 引數進行初始化,然後假設適當的幾何子類別(例如,GEOSGeometry('POINT(1 1)') 將建立 Point 物件)。

如果 geo_input 沒有 SRID,則 srid 參數(如果給定)會設定為所建立幾何的 SRID。如果透過 geo_inputsrid 參數提供了不同的 SRID,則會引發 ValueError

>>> from django.contrib.gis.geos import GEOSGeometry
>>> GEOSGeometry("POINT EMPTY", srid=4326).ewkt
'SRID=4326;POINT EMPTY'
>>> GEOSGeometry("SRID=4326;POINT EMPTY", srid=4326).ewkt
'SRID=4326;POINT EMPTY'
>>> GEOSGeometry("SRID=1;POINT EMPTY", srid=4326)
Traceback (most recent call last):
...
ValueError: Input geometry already has SRID: 1.

接受以下輸入格式及其對應的 Python 類型

格式

輸入類型

WKT / EWKT

str

HEX / HEXEWKB

str

WKB / EWKB

memoryview

GeoJSON

str

對於 GeoJSON 格式,SRID 是根據 crs 成員設定的。如果未提供 crs,則 SRID 預設為 4326。

classmethod GEOSGeometry.from_gml(gml_string)

從給定的 GML 字串建構 GEOSGeometry

屬性

GEOSGeometry.coords

以 tuple 形式回傳幾何的座標。

GEOSGeometry.dims

回傳幾何的維度

GEOSGeometry.empty

回傳幾何中的點集合是否為空。

GEOSGeometry.geom_type

回傳對應幾何類型的字串。例如

>>> pnt = GEOSGeometry("POINT(5 23)")
>>> pnt.geom_type
'Point'
GEOSGeometry.geom_typeid

回傳 GEOS 幾何類型識別碼。下表顯示每個幾何類型的值

幾何

ID

0

線串

1

線性環

2

多邊形

3

多點

4

多線串

5

多多邊形

6

幾何集合

7

GEOSGeometry.num_coords

回傳幾何中的座標數量。

GEOSGeometry.num_geom

回傳此幾何中的幾何數量。換句話說,除了幾何集合之外,任何東西都將回傳 1。

GEOSGeometry.hasz

回傳一個布林值,指示幾何是否為三維。

GEOSGeometry.ring

回傳一個布林值,指示幾何是否為 LinearRing

GEOSGeometry.simple

回傳一個布林值,指示幾何是否為「簡單」。一個幾何如果沒有與自身相交(除了邊界點之外),則為簡單的。例如,如果 LineString 物件與自身相交,則不是簡單的。因此,LinearRingPolygon 物件始終是簡單的,因為根據定義它們不能與自身相交。

GEOSGeometry.valid

回傳一個布林值,指示幾何是否有效。

GEOSGeometry.valid_reason

回傳一個字串,描述幾何無效的原因。

GEOSGeometry.srid

可用於檢索或設定與幾何相關聯的 SRID 的屬性。例如

>>> pnt = Point(5, 23)
>>> print(pnt.srid)
None
>>> pnt.srid = 4326
>>> pnt.srid
4326

輸出屬性

此部分中的屬性將 GEOSGeometry 物件匯出為不同的形式。此輸出可以是字串、緩衝區,甚至是另一個物件的形式。

GEOSGeometry.ewkt

回傳幾何的「擴展」已知文字。此表示法是 PostGIS 特有的,並且是 OGC WKT 標準的超集。[1] 基本上,SRID 會預先附加到 WKT 表示法,例如 SRID=4326;POINT(5 23)

注意

此屬性的輸出不包含 PostGIS 在其 EWKT 表示法中支援的 3dm、3dz 和 4d 資訊。

GEOSGeometry.hex

以十六進位形式回傳此幾何的 WKB。請注意,此表示法中不包含 SRID 值,因為它不是 OGC 規範的一部分(請改用 GEOSGeometry.hexewkb 屬性)。

GEOSGeometry.hexewkb

以十六進位形式回傳此幾何的 EWKB。這是 WKB 規範的擴展,其中包含此幾何中的 SRID 值。

GEOSGeometry.json

回傳幾何的 GeoJSON 表示法。請注意,結果不是完整的 GeoJSON 結構,而只是 GeoJSON 結構的 geometry 金鑰內容。另請參閱 GeoJSON 序列化器

GEOSGeometry.geojson

GEOSGeometry.json 的別名。

GEOSGeometry.kml

回傳幾何的 KML (Keyhole Markup Language) 表示法。這應該僅用於 SRID 為 4326 (WGS84) 的幾何,但此限制並未強制執行。

GEOSGeometry.ogr

回傳對應於 GEOS 幾何的 OGRGeometry 物件。

GEOSGeometry.wkb

以 Python 緩衝區形式回傳此幾何的 WKB (Well-Known Binary) 表示法。不包含 SRID 值,請改用 GEOSGeometry.ewkb 屬性。

GEOSGeometry.ewkb

以 Python 緩衝區形式回傳此幾何的 EWKB 表示法。這是 WKB 規範的擴展,其中包含此幾何中的任何 SRID 值。

GEOSGeometry.wkt

回傳幾何的已知文字(OGC 標準)。

空間謂詞方法

以下所有空間謂詞方法都採用另一個 GEOSGeometry 實例 (other) 作為參數,並回傳一個布林值。

GEOSGeometry.contains(other)

如果 other.within(this) 返回 True,則返回 True

GEOSGeometry.covers(other)

如果此幾何圖形覆蓋指定的幾何圖形,則返回 True

covers 謂詞具有以下等效定義:

  • 其他幾何圖形的每個點都是此幾何圖形的點。

  • 兩個幾何圖形的 DE-9IM 交集矩陣為 T*****FF**T****FF****T**FF*****T*FF*

如果任一幾何圖形為空,則返回 False

此謂詞類似於 GEOSGeometry.contains(),但更具包容性(即在更多情況下返回 True)。 特別是,與 contains() 不同,它不區分幾何圖形邊界和內部的點。 在大多數情況下,應優先選擇 covers() 而不是 contains()。 作為額外的好處,covers() 更適合最佳化,因此效能應優於 contains()

GEOSGeometry.crosses(other)

如果兩個幾何圖形的 DE-9IM 交集矩陣為 T*T******(對於點和曲線、點和區域或線和區域)0********(對於兩條曲線),則返回 True

GEOSGeometry.disjoint(other)

如果兩個幾何圖形的 DE-9IM 交集矩陣為 FF*FF****,則返回 True

GEOSGeometry.equals(other)

如果兩個幾何圖形的 DE-9IM 交集矩陣為 T*F**FFF*,則返回 True

GEOSGeometry.equals_exact(other, tolerance=0)

如果兩個幾何圖形完全相等,達到指定的容差,則返回 true。tolerance 值應為浮點數,表示比較中的誤差容差,例如,poly1.equals_exact(poly2, 0.001) 會將相等性比較到千分之一單位以內。

GEOSGeometry.equals_identical(other)
Django 5.0 的新增功能。

如果兩個幾何圖形在點對點上等效,方法是檢查所有維度中所有頂點的結構、順序和值是否相同,則返回 TrueNaN 值被認為等於其他 NaN 值。 需要 GEOS 3.12。

GEOSGeometry.intersects(other)

如果 GEOSGeometry.disjoint()False,則返回 True

GEOSGeometry.overlaps(other)

如果兩個幾何圖形的 DE-9IM 交集矩陣為 T*T***T**(對於兩個點或兩個表面)1*T***T**(對於兩條曲線),則返回 true。

GEOSGeometry.relate_pattern(other, pattern)

如果此幾何圖形和其他幾何圖形的 DE-9IM 交集矩陣中的元素與給定的 pattern 相符(該模式是來自字母 {TF*0} 的九個字元字串),則返回 True

GEOSGeometry.touches(other)

如果兩個幾何圖形的 DE-9IM 交集矩陣為 FT*******F**T*****F***T****,則返回 True

GEOSGeometry.within(other)

如果兩個幾何圖形的 DE-9IM 交集矩陣為 T*F**F***,則返回 True

拓撲方法

GEOSGeometry.buffer(width, quadsegs=8)

返回一個 GEOSGeometry,表示距離此幾何圖形的距離小於或等於給定 width 的所有點。 選用的 quadsegs 關鍵字設定用於近似四分之一圓的線段數(預設為 8)。

GEOSGeometry.buffer_with_style(width, quadsegs=8, end_cap_style=1, join_style=1, mitre_limit=5.0)

buffer() 相同,但允許自訂緩衝區的樣式。

  • end_cap_style 可以是圓形 (1)、平面 (2) 或方形 (3)。

  • join_style 可以是圓形 (1)、斜接 (2) 或斜角 (3)。

  • 斜接比率限制 (mitre_limit) 只影響斜接連接樣式。

GEOSGeometry.difference(other)

返回一個 GEOSGeometry,表示組成此幾何圖形但不組成其他幾何圖形的點。

GEOSGeometry.interpolate(distance)
GEOSGeometry.interpolate_normalized(distance)

給定一個距離(浮點數),返回幾何圖形(LineStringMultiLineString)內該距離處的點(或最近的點)。正規化版本將距離視為 0(起點)到 1(終點)之間的浮點數。

GEOSGeometry.project() 相反。

GEOSGeometry.intersection(other)

返回一個 GEOSGeometry,表示此幾何圖形與另一個幾何圖形共享的點。

GEOSGeometry.project(point)
GEOSGeometry.project_normalized(point)

返回從幾何圖形(LineStringMultiLineString)的原點到投影到幾何圖形上的點(即到最靠近給定點的線上點)的距離(浮點數)。正規化版本返回的距離是介於 0(起點)和 1(終點)之間的浮點數。

GEOSGeometry.interpolate() 相反。

GEOSGeometry.relate(other)

返回 DE-9IM 交集矩陣(字串),表示此幾何圖形與另一個幾何圖形之間的拓撲關係。

GEOSGeometry.simplify(tolerance=0.0, preserve_topology=False)

使用 Douglas-Peucker 演算法簡化到指定的容差,返回一個新的 GEOSGeometry。容差值越高,輸出中的點就越少。如果未提供容差,則預設為 0。

預設情況下,此函數不會保留拓撲結構。例如,Polygon 物件可能會被分割、塌陷成線,或消失。Polygon 的孔洞可能會被創建或消失,並且線條可能會交叉。透過指定 preserve_topology=True,結果將具有與輸入相同的維度和元件數量;但是,這會明顯較慢。

GEOSGeometry.sym_difference(other)

返回一個 GEOSGeometry,結合此幾何圖形中不在另一個幾何圖形中的點,以及另一個幾何圖形中不在這個幾何圖形中的點。

GEOSGeometry.union(other)

返回一個 GEOSGeometry,表示此幾何圖形和另一個幾何圖形中的所有點。

拓撲屬性

GEOSGeometry.boundary

以新配置的幾何物件形式返回邊界。

GEOSGeometry.centroid

返回一個 Point 物件,表示幾何圖形的幾何中心。不能保證該點位於幾何圖形的內部。

GEOSGeometry.convex_hull

返回包含幾何圖形中所有點的最小 Polygon

GEOSGeometry.envelope

返回一個 Polygon,表示此幾何圖形的邊界範圍。請注意,如果輸入幾何圖形是一個點,它也可以返回一個 Point

GEOSGeometry.point_on_surface

計算並返回一個保證位於此幾何圖形內部的 Point

GEOSGeometry.unary_union

計算此幾何圖形所有元素的聯集。

結果遵循以下合約

其他屬性和方法

GEOSGeometry.area

此屬性返回幾何圖形的面積。

GEOSGeometry.extent

此屬性以 4 元組形式返回此幾何圖形的範圍,包括 (xmin, ymin, xmax, ymax)

GEOSGeometry.clone()

此方法會回傳一個 GEOSGeometry,它是原始幾何的複製。

GEOSGeometry.distance(geom)

回傳此幾何圖形與給定的 geom(另一個 GEOSGeometry 物件)之間最近點的距離。

注意

GEOS 的距離計算是線性的 — 換句話說,即使 SRID 指定了地理坐標系統,GEOS 也不會執行球面計算。

GEOSGeometry.length

回傳此幾何圖形的長度(例如,Point 為 0,LineString 的長度,或 Polygon 的周長)。

GEOSGeometry.prepared

回傳此幾何圖形內容的 GEOS PreparedGeometryPreparedGeometry 物件針對 contains、intersects、covers、crosses、disjoint、overlaps、touches 和 within 操作進行了最佳化。有關詳細資訊,請參閱 準備好的幾何圖形 文件。

GEOSGeometry.srs

回傳對應於幾何圖形 SRID 的 SpatialReference 物件,或 None

GEOSGeometry.transform(ct, clone=False)

根據給定的座標轉換參數(ct)轉換幾何圖形,該參數可以是整數 SRID、空間參考 WKT 字串、PROJ 字串、SpatialReference 物件或 CoordTransform 物件。 預設情況下,幾何圖形會就地轉換,並且不回傳任何值。 但是,如果設定了 clone 關鍵字,則不會修改幾何圖形,而是回傳轉換後的幾何圖形副本。

注意

如果 GDAL 不可用,或幾何圖形的 SRID 為 None 或小於 0,則會引發 GEOSException。 如果使用 CoordTransform 物件呼叫,則不會對幾何圖形的 SRID 施加任何限制。

GEOSGeometry.make_valid()

回傳等效的有效 GEOSGeometry,並盡量不遺失任何輸入頂點。 如果幾何圖形已經有效,則會原封不動地回傳。 這類似於 MakeValid 資料庫函數。 需要 GEOS 3.8。

GEOSGeometry.normalize(clone=False)

將此幾何圖形轉換為標準形式。 如果設定了 clone 關鍵字,則不會修改幾何圖形,而是回傳標準化的幾何圖形副本。

>>> g = MultiPoint(Point(0, 0), Point(2, 2), Point(1, 1))
>>> print(g)
MULTIPOINT (0 0, 2 2, 1 1)
>>> g.normalize()
>>> print(g)
MULTIPOINT (2 2, 1 1, 0 0)

Point

class Point(x=None, y=None, z=None, srid=None)[原始碼]

可以使用代表點的組成座標的引數,或使用單一座標序列來例項化 Point 物件。 例如,以下是等效的

>>> pnt = Point(5, 23)
>>> pnt = Point([5, 23])

可以透過不傳遞任何引數或傳遞空序列來例項化空的 Point 物件。 以下是等效的

>>> pnt = Point()
>>> pnt = Point([])

LineString

class LineString(*args, **kwargs)[原始碼]

LineString 物件可以使用座標序列或 Point 物件的引數來例項化。 例如,以下是等效的

>>> ls = LineString((0, 0), (1, 1))
>>> ls = LineString(Point(0, 0), Point(1, 1))

此外,也可以透過傳遞單一座標序列或 Point 物件來建立 LineString 物件

>>> ls = LineString(((0, 0), (1, 1)))
>>> ls = LineString([Point(0, 0), Point(1, 1)])

可以透過不傳遞任何引數或傳遞空序列來例項化空的 LineString 物件。 以下是等效的

>>> ls = LineString()
>>> ls = LineString([])
closed

回傳此 LineString 是否已關閉。

LinearRing

class LinearRing(*args, **kwargs)[原始碼]

LinearRing 物件的建構方式與 LineString 物件完全相同,但是座標必須是封閉的,換句話說,第一個座標必須與最後一個座標相同。 例如

>>> ls = LinearRing((0, 0), (0, 1), (1, 1), (0, 0))

請注意,(0, 0) 是第一個和最後一個座標 – 如果它們不相等,則會引發錯誤。

is_counterclockwise[原始碼]

回傳此 LinearRing 是否為逆時針方向。

Polygon

class Polygon(*args, **kwargs)[原始碼]

可以透過傳遞代表多邊形環的參數來例項化 Polygon 物件。 參數必須是 LinearRing 實例,或可用於建構 LinearRing 的序列

>>> ext_coords = ((0, 0), (0, 1), (1, 1), (1, 0), (0, 0))
>>> int_coords = ((0.4, 0.4), (0.4, 0.6), (0.6, 0.6), (0.6, 0.4), (0.4, 0.4))
>>> poly = Polygon(ext_coords, int_coords)
>>> poly = Polygon(LinearRing(ext_coords), LinearRing(int_coords))
classmethod from_bbox(bbox)[原始碼]

從給定的邊界框返回一個多邊形物件,該邊界框是一個包含 (xmin, ymin, xmax, ymax) 的 4 元組。

num_interior_rings[原始碼]

返回此幾何圖形中的內部環數量。

多邊形比較

請注意,可以直接使用 <> 來比較 Polygon 物件,但由於比較是透過 Polygon 的 LineString 進行,因此意義不大 (但它是一致且快速的)。 您始終可以使用 area 屬性來強制比較。

>>> if poly_1.area > poly_2.area:
...     pass
...

幾何圖形集合

MultiPoint

class MultiPoint(*args, **kwargs)[原始碼]

可以透過傳入 Point 物件作為引數,或傳入單個 Point 物件序列來實例化 MultiPoint 物件。

>>> mp = MultiPoint(Point(0, 0), Point(1, 1))
>>> mp = MultiPoint((Point(0, 0), Point(1, 1)))

MultiLineString

class MultiLineString(*args, **kwargs)[原始碼]

可以透過傳入 LineString 物件作為引數,或傳入單個 LineString 物件序列來實例化 MultiLineString 物件。

>>> ls1 = LineString((0, 0), (1, 1))
>>> ls2 = LineString((2, 2), (3, 3))
>>> mls = MultiLineString(ls1, ls2)
>>> mls = MultiLineString([ls1, ls2])
merged

返回一個 LineString,表示此 MultiLineString 中所有元件的線合併。

closed

當且僅當所有元素都是封閉的時,才返回 True

MultiPolygon

class MultiPolygon(*args, **kwargs)[原始碼]

可以透過傳入 Polygon 物件作為引數,或傳入單個 Polygon 物件序列來實例化 MultiPolygon 物件。

>>> p1 = Polygon(((0, 0), (0, 1), (1, 1), (0, 0)))
>>> p2 = Polygon(((1, 1), (1, 2), (2, 2), (1, 1)))
>>> mp = MultiPolygon(p1, p2)
>>> mp = MultiPolygon([p1, p2])

GeometryCollection

class GeometryCollection(*args, **kwargs)[原始碼]

可以透過傳入其他 GEOSGeometry 作為引數,或傳入單個 GEOSGeometry 物件序列來實例化 GeometryCollection 物件。

>>> poly = Polygon(((0, 0), (0, 1), (1, 1), (0, 0)))
>>> gc = GeometryCollection(Point(0, 0), MultiPoint(Point(0, 0), Point(1, 1)), poly)
>>> gc = GeometryCollection((Point(0, 0), MultiPoint(Point(0, 0), Point(1, 1)), poly))

已準備好的幾何圖形

為了取得已準備好的幾何圖形,請存取 GEOSGeometry.prepared 屬性。 一旦您有一個 PreparedGeometry 實例,即可將其空間謂詞方法 (如下所列) 與其他 GEOSGeometry 物件搭配使用。 使用已準備好的幾何圖形進行操作可以快幾個數量級 – 準備好的幾何圖形越複雜,操作的速度提升就越大。 如需詳細資訊,請參閱 GEOS wiki 頁面上關於已準備好的幾何圖形的內容。

例如

>>> from django.contrib.gis.geos import Point, Polygon
>>> poly = Polygon.from_bbox((0, 0, 5, 5))
>>> prep_poly = poly.prepared
>>> prep_poly.contains(Point(2.5, 2.5))
True

PreparedGeometry

class PreparedGeometry

PreparedGeometry 上的所有方法都接受一個 other 引數,該引數必須是 GEOSGeometry 實例。

contains(other)
contains_properly(other)
covers(other)
crosses(other)
disjoint(other)
intersects(other)
overlaps(other)
touches(other)
within(other)

幾何圖形工廠

fromfile(file_h)[原始碼]
參數:

file_h (Python file 物件或檔案的字串路徑) – 包含空間資料的輸入檔案

返回類型:

對應於檔案中空間資料的 GEOSGeometry

範例

>>> from django.contrib.gis.geos import fromfile
>>> g = fromfile("/home/bob/geom.wkt")
fromstr(string, srid=None)[原始碼]
參數:
  • string (str) – 包含空間資料的字串

  • srid (int) – 空間參考識別符

返回類型:

對應於字串中空間資料的 GEOSGeometry 物件

fromstr(string, srid) 等同於 GEOSGeometry(string, srid)

範例

>>> from django.contrib.gis.geos import fromstr
>>> pnt = fromstr("POINT(-90.5 29.5)", srid=4326)

I/O 物件

讀取器物件

讀取器 I/O 類別會從傳遞給其 read(geom) 方法的 WKB 和/或 WKT 輸入中傳回 GEOSGeometry 實例。

class WKBReader[原始碼]

範例

>>> from django.contrib.gis.geos import WKBReader
>>> wkb_r = WKBReader()
>>> wkb_r.read("0101000000000000000000F03F000000000000F03F")
<Point object at 0x103a88910>
class WKTReader[原始碼]

範例

>>> from django.contrib.gis.geos import WKTReader
>>> wkt_r = WKTReader()
>>> wkt_r.read("POINT(1 1)")
<Point object at 0x103a88b50>

寫入器物件

所有寫入器物件都有一個 write(geom) 方法,該方法會傳回給定幾何的 WKB 或 WKT。此外,WKBWriter 物件還具有可用於變更位元組順序和/或包含 SRID 值(換句話說,EWKB)的屬性。

class WKBWriter(dim=2)[原始碼]

WKBWriter 提供對其輸出的最大控制。預設情況下,當呼叫其 write 方法時,它會傳回符合 OGC 的 WKB。但是,它具有允許建立 EWKB 的屬性,EWKB 是 WKB 標準的超集合,其中包含其他資訊。有關 dim 引數的更多詳細資訊,請參閱 WKBWriter.outdim 文件。

write(geom)[原始碼]

將給定幾何的 WKB 以 Python buffer 物件的形式傳回。範例

>>> from django.contrib.gis.geos import Point, WKBWriter
>>> pnt = Point(1, 1)
>>> wkb_w = WKBWriter()
>>> wkb_w.write(pnt)
<read-only buffer for 0x103a898f0, size -1, offset 0 at 0x103a89930>
write_hex(geom)[原始碼]

以十六進位格式傳回幾何的 WKB。範例

>>> from django.contrib.gis.geos import Point, WKBWriter
>>> pnt = Point(1, 1)
>>> wkb_w = WKBWriter()
>>> wkb_w.write_hex(pnt)
'0101000000000000000000F03F000000000000F03F'
byteorder

可以設定此屬性來變更幾何表示法的位元組順序。

位元組順序值

描述

0

大端序 (例如,與 RISC 系統相容)

1

小端序 (例如,與 x86 系統相容)

範例

>>> from django.contrib.gis.geos import Point, WKBWriter
>>> wkb_w = WKBWriter()
>>> pnt = Point(1, 1)
>>> wkb_w.write_hex(pnt)
'0101000000000000000000F03F000000000000F03F'
>>> wkb_w.byteorder = 0
'00000000013FF00000000000003FF0000000000000'
outdim[原始碼]

可以設定此屬性來變更幾何表示法的輸出維度。換句話說,如果您有 3D 幾何,則設定為 3,以便將 Z 值包含在 WKB 中。

Outdim 值

描述

2

預設值,輸出 2D WKB。

3

輸出 3D WKB。

範例

>>> from django.contrib.gis.geos import Point, WKBWriter
>>> wkb_w = WKBWriter()
>>> wkb_w.outdim
2
>>> pnt = Point(1, 1, 1)
>>> wkb_w.write_hex(pnt)  # By default, no Z value included:
'0101000000000000000000F03F000000000000F03F'
>>> wkb_w.outdim = 3  # Tell writer to include Z values
>>> wkb_w.write_hex(pnt)
'0101000080000000000000F03F000000000000F03F000000000000F03F'
srid[原始碼]

設定此屬性的布林值,以表示是否應將幾何的 SRID 與 WKB 表示法一起包含。範例

>>> from django.contrib.gis.geos import Point, WKBWriter
>>> wkb_w = WKBWriter()
>>> pnt = Point(1, 1, srid=4326)
>>> wkb_w.write_hex(pnt)  # By default, no SRID included:
'0101000000000000000000F03F000000000000F03F'
>>> wkb_w.srid = True  # Tell writer to include SRID
>>> wkb_w.write_hex(pnt)
'0101000020E6100000000000000000F03F000000000000F03F'
class WKTWriter(dim=2, trim=False, precision=None)[原始碼]

此類別允許輸出幾何的 WKT 表示法。有關建構函式引數的詳細資訊,請參閱 WKBWriter.outdimtrimprecision 屬性。

write(geom)[原始碼]

傳回給定幾何的 WKT。範例

>>> from django.contrib.gis.geos import Point, WKTWriter
>>> pnt = Point(1, 1)
>>> wkt_w = WKTWriter()
>>> wkt_w.write(pnt)
'POINT (1.0000000000000000 1.0000000000000000)'
outdim[原始碼]

請參閱 WKBWriter.outdim

trim[原始碼]

此屬性用於啟用或停用修剪不必要的小數位數。

>>> from django.contrib.gis.geos import Point, WKTWriter
>>> pnt = Point(1, 1)
>>> wkt_w = WKTWriter()
>>> wkt_w.trim
False
>>> wkt_w.write(pnt)
'POINT (1.0000000000000000 1.0000000000000000)'
>>> wkt_w.trim = True
>>> wkt_w.write(pnt)
'POINT (1 1)'
precision[原始碼]

此屬性控制座標的捨入精確度;如果設定為 None,則停用捨入。

>>> from django.contrib.gis.geos import Point, WKTWriter
>>> pnt = Point(1.44, 1.66)
>>> wkt_w = WKTWriter()
>>> print(wkt_w.precision)
None
>>> wkt_w.write(pnt)
'POINT (1.4399999999999999 1.6599999999999999)'
>>> wkt_w.precision = 0
>>> wkt_w.write(pnt)
'POINT (1 2)'
>>> wkt_w.precision = 1
>>> wkt_w.write(pnt)
'POINT (1.4 1.7)'

註腳

設定

GEOS_LIBRARY_PATH

指定 GEOS C 程式庫位置的字串。通常,只有當 GEOS C 程式庫位於非標準位置時才使用此設定(例如,/home/bob/lib/libgeos_c.so)。

注意

此設定必須是 C 共用程式庫的完整路徑;換句話說,您想要使用 libgeos_c.so,而不是 libgeos.so

例外狀況

exception GEOSException[原始碼]

基本 GEOS 例外狀況,表示與 GEOS 相關的錯誤。

返回頂部