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"))

几何图形是 Pythonic 的

GEOSGeometry 对象是“Pythonic”的,换句话说,可以使用标准的 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)[source]
参数:
  • geo_input – 几何图形输入值(字符串或 memoryview

  • srid (int) – 空间参考标识符

这是所有 GEOS 几何图形对象的基类。它根据给定的 geo_input 参数进行初始化,然后假定正确的几何图形子类(例如,GEOSGeometry('POINT(1 1)') 将创建一个 Point 对象)。

如果提供 srid 参数,则如果 geo_input 没有 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

将几何体的坐标作为元组返回。

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(密钥孔标记语言)表示形式。这仅应用于 SRID 为 4326(WGS84)的几何体,但此限制未强制执行。

GEOSGeometry.ogr

返回与 GEOS 几何体相对应的OGRGeometry对象。

GEOSGeometry.wkb

返回此几何图形的 WKB(Well-Known Binary)表示形式,作为 Python 缓冲区。SRID 值不包含在内,请改用 GEOSGeometry.ewkb 属性。

GEOSGeometry.ewkb

返回此几何图形的 EWKB 表示形式,作为 Python 缓冲区。这是 WKB 规范的扩展,包括作为此几何图形一部分的任何 SRID 值。

GEOSGeometry.wkt

返回几何图形的 Well-Known Text(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(一个由九个字符组成的字符串,来自字母表:{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,表示构成此几何图形但不构成 other 的点。

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

给定一个距离(浮点数),返回几何图形(LineStringMultiLineString)中该距离处的点(或最接近的点)。标准化版本将距离作为 0(起点)到 1(终点)之间的浮点数。

GEOSGeometry.project() 的反向操作。

GEOSGeometry.intersection(other)

返回一个 GEOSGeometry,表示此几何图形和 other 共享的点。

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

返回从几何图形(LineStringMultiLineString)的起点到投影到几何图形上的点的距离(浮点数)(即到最接近给定点的线上的点的距离)。标准化版本返回 0(起点)到 1(终点)之间的浮点数距离。

GEOSGeometry.interpolate() 的反向操作。

GEOSGeometry.relate(other)

返回 DE-9IM 交集矩阵(字符串),表示此几何图形与 other 之间的拓扑关系。

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

返回一个新的 GEOSGeometry,使用道格拉斯-普克算法简化为指定的容差。较高的容差值意味着输出中的点数较少。如果未提供容差,则默认为 0。

默认情况下,此函数不保留拓扑。例如,Polygon 对象可以被分割、折叠成线或消失。Polygon 孔可以创建或消失,线条可能会交叉。通过指定 preserve_topology=True,结果将与输入具有相同的维度和组件数量;但是,这会大大降低速度。

GEOSGeometry.sym_difference(other)

返回一个 GEOSGeometry,组合此几何图形中不在 other 中的点,以及 other 中不在此几何图形中的点。

GEOSGeometry.union(other)

返回一个 GEOSGeometry,表示此几何图形和 other 中的所有点。

拓扑属性

GEOSGeometry.boundary

返回边界作为新分配的 Geometry 对象。

GEOSGeometry.centroid

返回一个 Point 对象,表示几何图形的几何中心。该点不保证位于几何图形的内部。

GEOSGeometry.convex_hull

返回包含几何图形中所有点的最小 Polygon

GEOSGeometry.envelope

返回一个 Polygon,表示此几何图形的边界范围。请注意,如果输入几何图形是点,它也可以返回 Point

GEOSGeometry.point_on_surface

计算并返回一个 Point,保证位于此几何图形的内部。

GEOSGeometry.unary_union

计算此几何图形所有元素的并集。

结果遵循以下约定

  • 对一组 LineString 进行并集运算,将完全对线段进行节点化和融合。

  • 对一组 Polygon 进行并集运算,将始终返回 PolygonMultiPolygon 几何图形(与 GEOSGeometry.union() 不同,如果发生拓扑折叠,后者可能会返回较低维度的几何图形)。

其他属性和方法

GEOSGeometry.area

此属性返回几何图形的面积。

GEOSGeometry.extent

此属性返回此几何图形的范围,表示为一个包含 (xmin, ymin, xmax, ymax) 的 4 元组。

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)[source]

Point 对象使用表示点组件坐标的参数或使用单个坐标序列进行实例化。例如,以下等效

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

可以通过不传递任何参数或传递空序列来实例化空 Point 对象。以下等效

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

LineString

class LineString(*args, **kwargs)[source]

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)[source]

LinearRing 对象的构造方式与 LineString 对象完全相同,但是坐标必须是闭合的,换句话说,第一个坐标必须与最后一个坐标相同。例如

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

请注意,(0, 0) 是第一个和最后一个坐标——如果它们不相等,则会引发错误。

is_counterclockwise[source]

返回此 LinearRing 是否为逆时针方向。

Polygon

class Polygon(*args, **kwargs)[source]

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)[source]

根据给定的边界框返回一个多边形对象,边界框是一个包含 (xmin, ymin, xmax, ymax) 的 4 元组。

num_interior_rings[source]

返回此几何图形中内部环的数量。

比较多边形

请注意,可以使用 <> 直接比较 Polygon 对象,但由于比较是通过 Polygon 的 LineString 进行的,因此意义不大(但一致且快速)。您可以始终使用 area 属性强制进行比较。

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

几何图形集合

MultiPoint

class MultiPoint(*args, **kwargs)[source]

MultiPoint 对象可以通过传入 Point 对象作为参数,或传入单个 Point 对象序列来实例化。

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

MultiLineString

class MultiLineString(*args, **kwargs)[source]

MultiLineString 对象可以通过传入 LineString 对象作为参数,或传入单个 LineString 对象序列来实例化。

>>> 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)[source]

MultiPolygon 对象可以通过传入 Polygon 对象作为参数,或传入单个 Polygon 对象序列来实例化。

>>> 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)[source]

GeometryCollection 对象可以通过传入其他 GEOSGeometry 作为参数,或传入单个 GEOSGeometry 对象序列来实例化。

>>> 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 维基页面上的预处理几何图形

例如

>>> 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)[source]
参数:

file_h (Python file 对象或文件的字符串路径) – 包含空间数据的输入文件。

返回类型:

与文件中的空间数据相对应的 GEOSGeometry

示例

>>> from django.contrib.gis.geos import fromfile
>>> g = fromfile("/home/bob/geom.wkt")
fromstr(string, srid=None)[source]
参数:
  • 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[source]

示例

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

示例

>>> 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)[source]

WKBWriter 对其输出提供了最大的控制。默认情况下,当调用其 write 方法时,它会返回符合 OGC 标准的 WKB。但是,它具有允许创建 EWKB 的属性,EWKB 是 WKB 标准的超集,其中包含其他信息。有关 dim 参数的更多详细信息,请参阅 WKBWriter.outdim 文档。

write(geom)[source]

将给定几何图形的 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)[source]

以十六进制形式返回几何图形的 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[source]

可以设置此属性以更改几何图形表示的输出维度。换句话说,如果您有 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[source]

使用布尔值设置此属性以指示是否应将几何图形的 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)[source]

此类允许输出几何图形的 WKT 表示。有关构造函数参数的详细信息,请参阅 WKBWriter.outdimtrimprecision 属性。

write(geom)[source]

返回给定几何图形的 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[source]

请参阅 WKBWriter.outdim

trim[source]

此属性用于启用或禁用不必要的小数的修剪。

>>> 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[source]

此属性控制坐标的舍入精度;如果设置为 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[source]

GEOS 基本异常,表示与 GEOS 相关的错误。

返回顶部