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_input
和 srid
參數提供了不同的 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 |
|
HEX / HEXEWKB |
|
WKB / EWKB |
|
|
對於 GeoJSON 格式,SRID 是根據 crs
成員設定的。如果未提供 crs
,則 SRID 預設為 4326。
- classmethod GEOSGeometry.from_gml(gml_string)¶
從給定的 GML 字串建構
GEOSGeometry
。
屬性¶
- GEOSGeometry.coords¶
以 tuple 形式回傳幾何的座標。
- GEOSGeometry.dims¶
回傳幾何的維度
0
代表Point
和MultiPoint
1
代表LineString
和MultiLineString
2
代表Polygon
和MultiPolygon
-1
代表空的GeometryCollection
非空
GeometryCollection
中元素的最大維度
- 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
物件與自身相交,則不是簡單的。因此,LinearRing
和Polygon
物件始終是簡單的,因為根據定義它們不能與自身相交。
- 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 的新增功能。
如果兩個幾何圖形在點對點上等效,方法是檢查所有維度中所有頂點的結構、順序和值是否相同,則返回
True
。NaN
值被認為等於其他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
相符(該模式是來自字母 {T
、F
、*
、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)¶
給定一個距離(浮點數),返回幾何圖形(
LineString
或MultiLineString
)內該距離處的點(或最近的點)。正規化版本將距離視為 0(起點)到 1(終點)之間的浮點數。與
GEOSGeometry.project()
相反。
- GEOSGeometry.intersection(other)¶
返回一個
GEOSGeometry
,表示此幾何圖形與另一個幾何圖形共享的點。
- GEOSGeometry.project(point)¶
- GEOSGeometry.project_normalized(point)¶
返回從幾何圖形(
LineString
或MultiLineString
)的原點到投影到幾何圖形上的點(即到最靠近給定點的線上點)的距離(浮點數)。正規化版本返回的距離是介於 0(起點)和 1(終點)之間的浮點數。
- 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.unary_union¶
計算此幾何圖形所有元素的聯集。
結果遵循以下合約
聯集一組
LineString
會產生完全節點化和溶解線條的效果。聯集一組
Polygon
將始終返回一個Polygon
或MultiPolygon
幾何圖形(與GEOSGeometry.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
PreparedGeometry
。PreparedGeometry
物件針對 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
¶
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)
是第一個和最後一個座標 – 如果它們不相等,則會引發錯誤。
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))
多邊形比較
請注意,可以直接使用 <
或 >
來比較 Polygon
物件,但由於比較是透過 Polygon 的 LineString
進行,因此意義不大 (但它是一致且快速的)。 您始終可以使用 area
屬性來強制比較。
>>> if poly_1.area > poly_2.area:
... pass
...
幾何圖形集合¶
MultiPoint
¶
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
¶
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
¶
幾何圖形工廠¶
- 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)[原始碼]¶
- 參數:
- 返回類型:
對應於字串中空間資料的
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
實例。
寫入器物件¶
所有寫入器物件都有一個 write(geom)
方法,該方法會傳回給定幾何的 WKB 或 WKT。此外,WKBWriter
物件還具有可用於變更位元組順序和/或包含 SRID 值(換句話說,EWKB)的屬性。
- class WKBWriter(dim=2)[原始碼]¶
WKBWriter
提供對其輸出的最大控制。預設情況下,當呼叫其write
方法時,它會傳回符合 OGC 的 WKB。但是,它具有允許建立 EWKB 的屬性,EWKB 是 WKB 標準的超集合,其中包含其他資訊。有關dim
引數的更多詳細資訊,請參閱WKBWriter.outdim
文件。將給定幾何的 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>
以十六進位格式傳回幾何的 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'
可以設定此屬性來變更幾何表示法的輸出維度。換句話說,如果您有 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 與 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.outdim
、trim
和precision
屬性。傳回給定幾何的 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
。
此屬性用於啟用或停用修剪不必要的小數位數。
>>> 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)'
此屬性控制座標的捨入精確度;如果設定為
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
。