跳转到主要内容

__geo_interface__的基本实现

项目描述

简介

PyGeoIf提供了一个类似于GeoJSON的协议,用于地理空间(GIS)矢量数据。

您可能听说过的其他实现此协议的Python程序和包

当您想要编写支持此协议的自己的地理空间库时,可以使用pygeoif作为起点,并在其基础上构建功能。它没有超出Python标准库的要求,因此易于集成到您的项目中。它已在CPython和PyPy上进行了测试,但也应该在实现语言规范>=3.8的替代Python实现上工作。

PyGeoIf可以被看作是一种“轻量级shapely”,它允许您构建几何形状并执行一些基本操作,例如从WKT中读取和写入几何形状、从点构建线字符串、从线性环构建多边形、从多边形构建多边形等。它受到shapely的启发,并以一种方式实现了几何形状,当您熟悉PyGeoIf时,您会感觉在shapely中非常自在,反之亦然。它为所有几何形状提供Hypothesis策略,以进行基于属性的测试,使用Hypothesis

它被编写来为fastkml提供干净且仅使用Python的几何形状。

Documentation GitHub Actions Codecov Tested with Hypothesis Black Mypy Openhub CodeFactor pre-commit Supported Python versions Supported Python implementations Latest Version License Downloads

安装

您可以使用pip从PyPI安装PyGeoIf。

pip install pygeoif

示例

>>> from pygeoif import geometry
>>> p = geometry.Point(1,1)
>>> p.__geo_interface__
{'type': 'Point', 'bbox': (1, 1, 1, 1), 'coordinates': (1, 1)}
>>> print(p)
POINT (1 1)
>>> p
Point(1, 1)
>>> l = geometry.LineString([(0.0, 0.0), (1.0, 1.0)])
>>> l.bounds
(0.0, 0.0, 1.0, 1.0)
>>> print(l)
LINESTRING (0.0 0.0, 1.0 1.0)

您可以在tests目录中找到更多示例,该目录涵盖了PyGeoIf的各个方面,或者在fastkml中。

所有类都实现了属性

  • __geo_interface__:如上所述,一个用于GeoJSON的接口。

所有几何类都实现了属性

  • geom_type:返回一个指定对象几何类型的字符串

  • bounds:返回一个(minx, miny, maxx, maxy)元组,该元组定义了对象的边界。

  • wkt:返回对象的“已知文本”表示形式

对于二维几何形状,实现了以下方法

  • convex_hull:返回包含对象中所有点的最小凸多边形的表示形式,除非对象中的点数少于三个。对于两个点,凸包折叠为LineString;对于1个点,为Point。对于三维对象,仅考虑其在xy平面上的投影。没有坐标的空对象返回None作为凸包。

Point

零维几何形状

一个点没有长度和面积。一个点不能为空。

属性

x, y, zfloat

坐标值

示例

LineString

由一个或多个线段组成的一维图形

LineString具有非零长度和零面积。它可能近似一个曲线,不一定直线。与LinearRing不同,LineString不是封闭的。

属性

geomssequence

点的序列

LinearRing

由一个或多个线段组成的封闭的一维几何形状

如果LinearRing交叉自身或在一个点上触及自身,则它是无效的,并且对其进行的操作可能会失败。

LinearRing是自闭合的。

Polygon

由线性环界定的二维图形

多边形具有非零面积。它可能有一个或多个由线性环界定的负空间“孔”。如果任何环交叉,则几何形状无效,对其进行的操作可能会失败。

属性

exteriorLinearRing

界定多边形正空间的环。

interiorssequence

一个序列,界定所有现有孔的环。

maybe_valid: boolean

当多边形有明显的错误,如自交叉线或位于外部边界之外的孔时,此值将返回False。即使此返回值为True,几何形状可能仍然无效,但如果此返回值为False,您确实有问题。

MultiPoint

一个或多个点的集合。

属性

geomssequence

点的序列。

MultiLineString

一个或多个线字符串的集合。

MultiLineString具有非零长度和零面积。

属性

geomssequence

LineStrings的序列

MultiPolygon

一个或多个多边形的集合。

属性

geomssequence

Polygon实例的序列

GeometryCollection

异构几何集合(点、线串、线性环和多边形)。

属性

geomssequence

几何实例的序列

请注意:GEOMETRYCOLLECTION 不受 Shapefile 或 GeoJSON 格式支持。并且这个子类通常不被普通 GIS 软件(查看器等)支持。因此,在现实世界的 GIS 专业领域中很少使用。

示例

>>> from pygeoif import geometry
>>> p = geometry.Point(1.0, -1.0)
>>> p2 = geometry.Point(1.0, -1.0)
>>> geoms = [p, p2]
>>> c = geometry.GeometryCollection(geoms)
>>> [geom for geom in geoms]
[Point(1.0, -1.0), Point(1.0, -1.0)]

要素

将几何实例与其相关联的用户定义属性聚合。

属性

geometry对象

一个几何实例

properties字典

一个字典,将字段键与与几何实例相关联的值联系起来

示例

>>> from pygeoif import Point, Feature
>>> p = Point(1.0, -1.0)
>>> props = {'Name': 'Sample Point', 'Other': 'Other Data'}
>>> a = Feature(p, props)
>>> a.properties
{'Name': 'Sample Point', 'Other': 'Other Data'}
>>> a.properties['Name']
'Sample Point'

FeatureCollection

要素的异构集合

属性

features: 序列

要素实例的序列

示例

>>> from pygeoif import Point, Feature, FeatureCollection
>>> p = Point(1.0, -1.0)
>>> props = {'Name': 'Sample Point', 'Other': 'Other Data'}
>>> a = Feature(p, props)
>>> p2 = Point(1.0, -1.0)
>>> props2 = {'Name': 'Sample Point2', 'Other': 'Other Data2'}
>>> b = Feature(p2, props2)
>>> features = [a, b]
>>> c = FeatureCollection(features)
>>> [feature for feature in c]
[Feature(Point(1.0, -1.0), {'Name': 'Sample Point', 'Other': 'Other Data'},...]

函数

shape

从提供 __geo_interface__ 或任何 GeoJSON 兼容字典的对象创建 pygeoif 要素。

>>> from shapely.geometry import Point
>>> from pygeoif import geometry, shape
>>> shape(Point(0,0))
Point(0.0, 0.0)

from_wkt

从其 WKT 表示创建几何形状。

>>> from pygeoif import from_wkt
>>> p = from_wkt('POINT (0 1)')
>>> print(p)
POINT (0.0 1.0)

signed_area

返回环所包围的符号面积。值 >= 0 表示逆时针方向的环。

orient

返回一个多边形的副本,其外部和内部具有正确的方向。

如果 ccw 为 True,则外部将在逆时针方向,内部将在顺时针方向,或者当 ccw 为 False 时相反。

box

返回具有可配置法向量的矩形多边形。

mapping

返回 __geo_interface__ 字典。

开发

克隆此存储库,使用 Python 3.8 或更高版本创建虚拟环境,并使用 python3 -m venv .venv 安装它,然后使用 source .venv/bin/activate 激活它。

然后使用 pip install -e ".[dev]" 安装依赖项。

pre-commit

使用以下命令安装 pre-commit 挂钩:

pip install pre-commit
pre-commit install

并使用以下命令检查代码:

pre-commit run --all-files

测试

使用以下命令运行单元测试和静态测试:

pytest tests
pytest --doctest-glob="README.rst"
black pygeoif
ruff pygeoif
flake8 pygeoif
mypy pygeoif

致谢

使用 mutmut 改进了测试,它发现了一些令人讨厌的边缘情况。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

pygeoif-1.5.0.tar.gz (41.2 kB 查看哈希值)

上传时间:

构建分布

pygeoif-1.5.0-py3-none-any.whl (27.7 kB 查看哈希值)

上传时间: Python 3

由以下提供支持