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_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¶
将几何体的坐标作为元组返回。
- 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.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
(一个由九个字符组成的字符串,来自字母表:{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
,表示构成此几何图形但不构成 other 的点。
- GEOSGeometry.interpolate(distance)¶
- GEOSGeometry.interpolate_normalized(distance)¶
给定一个距离(浮点数),返回几何图形(
LineString
或MultiLineString
)中该距离处的点(或最接近的点)。标准化版本将距离作为 0(起点)到 1(终点)之间的浮点数。是
GEOSGeometry.project()
的反向操作。
- GEOSGeometry.intersection(other)¶
返回一个
GEOSGeometry
,表示此几何图形和 other 共享的点。
- GEOSGeometry.project(point)¶
- GEOSGeometry.project_normalized(point)¶
返回从几何图形(
LineString
或MultiLineString
)的起点到投影到几何图形上的点的距离(浮点数)(即到最接近给定点的线上的点的距离)。标准化版本返回 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.unary_union¶
计算此几何图形所有元素的并集。
结果遵循以下约定
对一组
LineString
进行并集运算,将完全对线段进行节点化和融合。对一组
Polygon
进行并集运算,将始终返回Polygon
或MultiPolygon
几何图形(与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
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)[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)
是第一个和最后一个坐标——如果它们不相等,则会引发错误。
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))
比较多边形
请注意,可以使用 <
或 >
直接比较 Polygon
对象,但由于比较是通过 Polygon 的 LineString
进行的,因此意义不大(但一致且快速)。您可以始终使用 area
属性强制进行比较。
>>> if poly_1.area > poly_2.area:
... pass
...
几何图形集合¶
MultiPoint
¶
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
¶
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
¶
几何图形工厂¶
- 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]¶
- 参数:
- 返回类型:
与字符串中的空间数据相对应的
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)[source]¶
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)[source]¶
此类允许输出几何图形的 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[source]¶
请参阅
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
。