A Python library for enforcing polygon ring winding order in GeoJSON
The GeoJSON spec mandates the right hand rule:
A linear ring MUST follow the right-hand rule with respect to the area it bounds, i.e., exterior rings are counterclockwise, and holes are clockwise.
This helps you generate compliant Polygon and MultiPolygon geometries.
Note: Co-ordinates in the input data are assumed to be WGS84 with (lon, lat) ordering, as per RFC 7946. Input with co-ordinates using any other CRS may lead to unexpected results.
pip install geojson-rewind
Enforce RFC 7946 ring winding order (input/output is a GeoJSON string):
>>> from geojson_rewind import rewind
>>> input = """{
... "geometry": { "coordinates": [ [ [100, 0],
... [100, 1],
... [101, 1],
... [101, 0],
... [100, 0]]],
... "type": "Polygon"},
... "properties": {"foo": "bar"},
... "type": "Feature"}"""
>>> output = rewind(input)
>>> output
'{"geometry": {"coordinates": [[[100, 0], [101, 0], [101, 1], [100, 1], [100, 0]]], "type": "Polygon"}, "properties": {"foo": "bar"}, "type": "Feature"}'
>>> type(output)
<class 'str'>
Enforce RFC 7946 ring winding order (input/output is a python dict):
>>> from geojson_rewind import rewind
>>> input = {
... 'geometry': { 'coordinates': [ [ [100, 0],
... [100, 1],
... [101, 1],
... [101, 0],
... [100, 0]]],
... 'type': 'Polygon'},
... 'properties': {'foo': 'bar'},
... 'type': 'Feature'}
>>> output = rewind(input)
>>> output
{'geometry': {'coordinates': [[[100, 0], [101, 0], [101, 1], [100, 1], [100, 0]]], 'type': 'Polygon'}, 'properties': {'foo': 'bar'}, 'type': 'Feature'}
>>> type(output)
<class 'dict'>
# Enforce ring winding order on a GeoJSON file
$ rewind in.geojson > out.geojson
# fetch GeoJSON from the web and enforce ring winding order
$ curl "https://myserver.com/in.geojson" | rewind
geojson-rewind follows semantic versioning. For this project, the "API" also includes:
- CLI flags and options
- CLI exit codes
In line with common practice in the python community, geojson-rewind will drop compatibility with unsupported python versions without incrementing the major version.
geojson-rewind
is a python port of Mapbox's javascript geojson-rewind package. Credit to Tom MacWright and contributors.