GEOS API

背景

什么是 GEOS?

GEOS 代表几何引擎 - 开源,是一个 C++ 库,移植自 Java 拓扑套件。GEOS 实现了 OpenGIS SQL 简单要素 空间谓词函数和空间运算符。GEOS 现在是 OSGeo 项目,最初由加拿大维多利亚的 Refractions Research 开发和维护。

功能

GeoDjango 为 GEOS 库实现了高级 Python 封装,其功能包括

  • 使用 ctypes 纯 Python 实现的、面向 GEOS 几何例程的 BSD 许可接口。
  • 与 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)
参数
  • geo_input – 几何输入值(字符串或 memoryview
  • srid (int) – 空间参考标识符

这是所有 GEOS 几何对象的基类。它在给定的 geo_input 参数上初始化,然后假定适当的几何子类(例如,GEOSGeometry('POINT(1 1)') 将创建一个 Point 对象)。

如果给出了 srid 参数,则将其设置为创建的几何的 SRID(如果 geo_input 没有 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(Keyhole 标记语言)表示形式。这仅应用于 SRID 为 4326(WGS84)的几何图形,但未强制执行此限制。

GEOSGeometry.ogr

返回与 GEOS 几何图形对应的 OGRGeometry 对象。

GEOSGeometry.wkb

返回此几何图形的 WKB(已知二进制)表示形式,作为 Python 缓冲区。不包括 SRID 值,请改用 GEOSGeometry.ewkb 属性。

GEOSGeometry.ewkb

返回此几何图形的 EWKB 表示形式,作为 Python 缓冲区。这是 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 匹配,则返回 True,该模式是由字母表中的九个字符组成的字符串:{T, F, *, 0}。

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,表示此几何图形和 other 共有的点。

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)

返回一个新的 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 对象针对包含、相交、覆盖、交叉、不相交、重叠、相切和在内部操作进行了优化。有关更多信息,请参阅 已准备几何图形 文档。

GEOSGeometry.srs

返回一个SpatialReference对象,该对象对应于几何的 SRID 或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))

此外,LineString 对象还可以通过传入坐标序列或 Point 对象的单个序列来创建

>>> 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 对象,但由于比较是通过多边形的 LineString 进行的,因此意义不大(但一致且快速)。您始终可以使用 area 属性强制比较

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

几何图形集合

MultiPoint

class MultiPoint(*args, **kwargs)

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

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

MultiLineString

class MultiLineString(*args, **kwargs)

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

多边形(*参数, **关键字参数)

多边形对象可以通过传递 多边形 对象作为参数,或 多边形 对象的单个序列来实例化

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

几何集合

几何集合(*参数, **关键字参数)

几何集合对象可以通过传递其他 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 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

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 类从 WKB 和/或 WKT 输入返回一个 GEOSGeometry 实例,该输入提供给其 read(geom) 方法。

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>

写入器对象

所有 writer 对象都具有 write(geom) 方法,该方法返回给定几何的 WKB 或 WKT。此外,WKBWriter 对象还具有可用于更改字节顺序或包含 SRID 值(即 EWKB)的属性。

class WKBWriter(dim=2)

WKBWriter 可以最大程度地控制其输出。默认情况下,在调用其 write 方法时,它会返回符合 OGC 的 WKB。但是,它具有允许创建 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)'

脚注

[1]参见 PostGIS EWKB、EWKT 和规范形式,PostGIS 文档第 4.1.2 章。

设置

GEOS_LIBRARY_PATH

指定 GEOS C 库位置的字符串。通常,仅当 GEOS C 库位于非标准位置(例如,/home/bob/lib/libgeos_c.so)时才使用此设置。

注意

该设置必须是C 共享库的完整路径;换句话说,您希望使用 libgeos_c.so,而不是 libgeos.so

异常

exception GEOSException

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

返回顶部