Geometry Objects
GeoDesk uses Shapely for a wide variety of geometry operations. Shapely provides a Python interface to the widely-deployed GEOS library.
Shapely/GEOS is a library for planar geometry — it operates on flat 2-D space. The Earth isn’t flat, of course, but for many real-life cartographic needs, we can pretend that it is and use simplified geometric techniques.
Geometry
is the base class of all geometric shapes. It has eight subtypes:
Point | A geometry type that represents a single coordinate |
LineString | A geometry type composed of one or more line segments. |
LinearRing | A LineString that forms a closed loop. |
Polygon | A geometry type representing an area that is enclosed by a LinearRing (optionally with holes). |
MultiPoint | A collection of one or more Points. |
MultiLineString | A collection of one or more LineStrings. |
MultiPolygon | A collection of one or more Polygons. |
GeometryCollection | A collection of one or more geometries that may contain more than one type of geometry. |
Shapely is projection-agnostic — it uses a unit-less plane. However, to work seamlessly with GeoDesk, all geometries must be represented using Mercator coordinates.
Creating geometries
Geometries can be created directly by specifying their coordinates. You can use simple (x,y)
tuples, or GeoDesk’s Coordinate
objects. Tuples must use Mercator projection, whereas Coordinate
automatically converts from degrees longitude and latitude.
GeoDesk’s lonlat()
and latlon()
functions provide a convenient way to specify coordinates.
>>> Point(10, 20)>
<POINT (10 20)>
>>> Point(Coordinate(lat=40.7, lon=73.9))
<POINT (881661342 532456967)>
>>> Point(latlon(40.7, 73.9))
<POINT (881661342 532456967)>
LineStrings and LinearRings use a sequence of coordinates. For a LinearRing, the first and last coordinate must be the same.
>>> LinearRing([c1, c2, c3, c1])
<LINEARRING (485569914 1337015677, 502272564 1474259260, 541643098 1271302994, ...>
>>> LinearRing(lonlat(40.7, 73.9, 42.1, 76.8, 45.4, 72.3, 40.7, 73.9))
<LINEARRING (485569914 1337015677, 502272564 1474259260, 541643098 1271302994, ...>
A Polygon is constructed from a LinearRing, and optionally one or more LinearRings that represent its holes.
>>> Polygon(shell, [hole1, hole2])
<POLYGON ((881661342 532456967, 881661498 532456834, 881662912 532457214, ...>
Adapted from Shapely Documentation — © 2011 – 2023 Sean Gillies and Shapely contributors. Licensed under BSD-3-Clause