All Projects → cleder → pygeoif

cleder / pygeoif

Licence: other
Basic implementation of the __geo_interface__

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to pygeoif

Orb
Types and utilities for working with 2d geometry in Golang
Stars: ✭ 378 (+759.09%)
Mutual labels:  geojson, geospatial, gis
pyturf
A modular geospatial engine written in python
Stars: ✭ 15 (-65.91%)
Mutual labels:  geojson, geospatial, gis
GeoJSON.jl
Utilities for working with GeoJSON data in Julia
Stars: ✭ 46 (+4.55%)
Mutual labels:  geojson, geospatial, gis
Go Geom
Package geom implements efficient geometry types for geospatial applications.
Stars: ✭ 456 (+936.36%)
Mutual labels:  geojson, geospatial, gis
Geotools
Official GeoTools repository
Stars: ✭ 1,109 (+2420.45%)
Mutual labels:  geojson, geospatial, gis
de9im
DE-9IM spatial predicate library implemented in Javascript.
Stars: ✭ 22 (-50%)
Mutual labels:  geojson, geospatial, gis
L7
🌎 Large-scale WebGL-powered Geospatial Data Visualization analysis framework which relies on Mapbox GL or AMap to render basemaps.
Stars: ✭ 2,517 (+5620.45%)
Mutual labels:  geojson, geospatial, gis
turf-go
A Go language port of Turf.js
Stars: ✭ 41 (-6.82%)
Mutual labels:  geojson, geospatial, gis
python-for-gis-progression-path
Progression path for a GIS analyst who wants to become proficient in using Python for GIS: from apprentice to guru
Stars: ✭ 98 (+122.73%)
Mutual labels:  geospatial, gis
django-graphql-geojson
GeoJSON support for Graphene Django
Stars: ✭ 61 (+38.64%)
Mutual labels:  geojson, gis
earthengine-py-examples
A collection of 300+ examples for using Earth Engine and the geemap Python package
Stars: ✭ 76 (+72.73%)
Mutual labels:  geospatial, gis
geoscript-py
A Python GeoScript Implementation
Stars: ✭ 52 (+18.18%)
Mutual labels:  geospatial, gis
whiteboxgui
An interactive GUI for WhiteboxTools in a Jupyter-based environment
Stars: ✭ 94 (+113.64%)
Mutual labels:  geospatial, gis
eodag
Earth Observation Data Access Gateway
Stars: ✭ 183 (+315.91%)
Mutual labels:  geospatial, gis
tidyUSDA
An interface to USDA Quick Stats data with mapping capabilities.
Stars: ✭ 36 (-18.18%)
Mutual labels:  geospatial, gis
kart
Distributed version-control for geospatial and tabular data
Stars: ✭ 253 (+475%)
Mutual labels:  geospatial, gis
leafmap
A Python package for interactive mapping and geospatial analysis with minimal coding in a Jupyter environment
Stars: ✭ 1,299 (+2852.27%)
Mutual labels:  geospatial, gis
open-geo-data-education
Open Geospatial Datasets for GIS Education: This is a repository of open geospatial datasets to be used in an educational context. I created these files over years of teaching Geographic Data Science and GIS. All original datasets are freely available online with open data licenses (see the dataset attribution for details). All the datasets in t…
Stars: ✭ 52 (+18.18%)
Mutual labels:  geojson, gis
xyz-spaces-python
Manage your XYZ Hub or HERE Data Hub spaces from Python.
Stars: ✭ 29 (-34.09%)
Mutual labels:  geojson, geospatial
opentopodata
Open alternative to the Google Elevation API!
Stars: ✭ 163 (+270.45%)
Mutual labels:  geospatial, gis

Introduction

PyGeoIf provides a GeoJSON-like protocol for geo-spatial (GIS) vector data.

Other Python programs and packages that you may have heard of already implement this protocol:

So when you want to write your own geospatial library with support for this protocol you may use pygeoif as a starting point and build your functionality on top of it

You may think of pygeoif as a 'shapely ultralight' which lets you construct geometries and perform very basic operations like reading and writing geometries from/to WKT, constructing line strings out of points, polygons from linear rings, multi polygons from polygons, etc. It was inspired by shapely and implements the geometries in a way that when you are familiar with shapely you feel right at home with pygeoif.

It was written to provide clean and python only geometries for fastkml

https://github.com/cleder/pygeoif/actions/workflows/run-all-tests.yml/badge.svg?branch=main https://codecov.io/gh/cleder/pygeoif/branch/main/graph/badge.svg?token=2EfiwBXs9X https://img.shields.io/badge/type%20checker-mypy-blue https://www.openhub.net/p/pygeoif/widgets/project_thin_badge.gif CodeFactor

Example

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

You find more examples in the tests directory which cover every aspect of pygeoif or in fastkml.

Classes

All classes implement the attribute:

  • __geo_interface__: as discussed above, an interface to GeoJSON.

All geometry classes implement the attributes:

  • geom_type: Returns a string specifying the Geometry Type of the object
  • bounds: Returns a (minx, miny, maxx, maxy) tuple that bounds the object.
  • wkt: Returns the 'Well Known Text' representation of the object

For two-dimensional geometries the following methods are implemented:

  • convex_hull: Returns a representation of the smallest convex Polygon containing all the points in the object unless the number of points in the object is less than three. For two points, the convex hull collapses to a LineString; for 1, a Point. For three dimensional objects only their projection in the xy plane is taken into consideration. Empty objects without coordinates return None for the convex_hull.

Point

A zero dimensional geometry

A point has zero length and zero area. A point cannot be empty.

Attributes

x, y, z : float
Coordinate values

Example

>>> from pygeoif import Point
>>> p = Point(1.0, -1.0)
>>> print(p)
POINT (1.0 -1.0)
>>> p.y
-1.0
>>> p.x
1.0

LineString

A one-dimensional figure comprising one or more line segments

A LineString has non-zero length and zero area. It may approximate a curve and need not be straight. Unlike a LinearRing, a LineString is not closed.

Attributes

geoms : sequence
A sequence of Points

LinearRing

A closed one-dimensional geometry comprising one or more line segments

A LinearRing that crosses itself or touches itself at a single point is invalid and operations on it may fail.

A LinearRing is self closing.

Polygon

A two-dimensional figure bounded by a linear ring

A polygon has a non-zero area. It may have one or more negative-space "holes" which are also bounded by linear rings. If any rings cross each other, the geometry is invalid and operations on it may fail.

Attributes

exterior : LinearRing
The ring which bounds the positive space of the polygon.
interiors : sequence
A sequence of rings which bound all existing holes.
maybe_valid: boolean
When a polygon has obvious problems such as self crossing lines or holes that are outside the exterior bounds this will return False. Even if this returns True the geometry may still be invalid, but if this returns False you do have a problem.

MultiPoint

A collection of one or more points.

Attributes

geoms : sequence
A sequence of Points.

MultiLineString

A collection of one or more line strings.

A MultiLineString has non-zero length and zero area.

Attributes

geoms : sequence
A sequence of LineStrings

MultiPolygon

A collection of one or more polygons.

Attributes

geoms : sequence
A sequence of Polygon instances

GeometryCollection

A heterogenous collection of geometries (Points, LineStrings, LinearRings and Polygons).

Attributes

geoms : sequence
A sequence of geometry instances

Please note: GEOMETRYCOLLECTION isn't supported by the Shapefile or GeoJSON format. And this sub-class isn't generally supported by ordinary GIS sw (viewers and so on). So it's very rarely used in the real GIS professional world.

Example

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

Feature

Aggregates a geometry instance with associated user-defined properties.

Attributes

geometry : object
A geometry instance
properties : dict
A dictionary linking field keys with values associated with with geometry instance

Example

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

A heterogenous collection of Features

Attributes

features: sequence
A sequence of feature instances

Example

>>> 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'},...]

Functions

shape

Create a pygeoif feature from an object that provides the __geo_interface__ or any GeoJSON compatible dictionary.

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

from_wkt

Create a geometry from its WKT representation

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

signed_area

Return the signed area enclosed by a ring using the linear time algorithm at http://www.cgafaq.info/wiki/Polygon_Area. A value >= 0 indicates a counter-clockwise oriented ring.

orient

Returns a copy of a polygon with exteriors and interiors in the right orientation.

if ccw is True than the exterior will be in counterclockwise orientation and the interiors will be in clockwise orientation, or the other way round when ccw is False.

box

Return a rectangular polygon with configurable normal vector.

mapping

Return the __geo_interface__ dictionary.

Development

Installation

You can install PyGeoIf from pypi using pip:

pip install pygeoif

Testing

Install the requirements with pip install -r test-requirements.txt and run the unit and static tests with:

pytest pygeoif
pytest --doctest-glob="README.rst"
yesqa pygeoif/*.py
black pygeoif
flake8 pygeoif
mypy pygeoif

pre-commit

Install the pre-commit hook with:

pip install pre-commit
pre-commit install

and check the code with:

pre-commit run --all-files

Acknowledgments

The tests were improved with mutmut which discovered some nasty edge cases.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].