Skip to main content

Parse and normalize a GeoJSON area of interest, using PostGIS.

Project description

GeoJSON AOI Parser

HOT

Parse and normalize a GeoJSON area of interest, using using PostGIS.

Publish Docs Publish Test Package version Downloads License


📖 Documentation: https://hotosm.github.io/geojson-aoi-parser/

🖥️ Source Code: https://github.com/hotosm/geojson-aoi-parser


Why do we need this?

  • We generally need an Area of Interest (AOI) specified for software to run on a geospatial area.
  • GeoJSON is a simple exchange format to communicate this AOI.
  • We only care about Polygon data types, but GeoJSON data can be quite variable, with many options for presenting data.
  • The goal of this package is to receive GeoJSON data in various forms, then produce a normalised output that can be used for further processing.

Priorities

  • Flexible data input: file bytes, dict, string JSON.
  • Flexible geometry input:
    • Polygon
    • MultiPolygons
    • GeometryCollection
    • Feature
    • FeatureCollection
  • Splits multipolygons into featcol of individual polygons.
  • Handle geometries nested inside GeometryCollection.
  • Remove any z-dimension coordinates.
  • Warn user if CRS is provided, in a coordinate system other than EPSG:4326.
  • Normalised output: FeatureCollection containing Polygon geoms.

Capturing The Warnings

If the GeoJSON has an invalid CRS, or coordinates seem off, a warning will be raised.

To install:

pip install geojson-aoi-parser

Basic example:

from geojson_aoi import parse_aoi

polygon_geojson = {
        "type": "Polygon",
        "coordinates": [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]],
    }

# Where 'db' is some upstream database connection.
feat_col = parse_aoi(db, polygon_geojson)

print(feat_col)
# {
#   'type': 'FeatureCollection',
#   'features': [
#       {
#           'type': 'Feature', 
#           'geometry': 
#               {
#                   'type': 'Polygon', 
#                   'coordinates': [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]]
#                }
#        }
#     ]
# }

Basic async example:

from geojson_aoi import parse_aoi_async

polygon_geojson = {
        "type": "Polygon",
        "coordinates": [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]],
    }

# Where 'db' is some upstream database connection.
feat_col = parse_aoi_async(db, polygon_geojson)

print(feat_col)
# {
#   'type': 'FeatureCollection',
#   'features': [
#       {
#           'type': 'Feature', 
#           'geometry': 
#               {
#                   'type': 'Polygon', 
#                   'coordinates': [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]]
#                }
#        }
#     ]
# }

To halt execution when a warning is raised and act on it:

try:
    featcol = parse_aoi(db, raw_geojson)
except UserWarning as warning:
    log.error(warning.message)
    msg = "Using a valid CRS is mandatory!"
    log.error(msg)
    raise HTTPException(HTTPStatus.BAD_REQUEST, detail=msg)

To record warnings, but allow execution to continue:

import warnings

with warnings.catch_warnings(record=True) as recorded_warnings:
    featcol = parse_aoi(db, raw_geojson)

if recorded_warnings:
    for warning in recorded_warnings:
        if isinstance(warning.message, UserWarning)
            # do stuff with warning
            logger.warning(f"A warning was encountered: {warning.message}")

Create a New DB Connection

  • If your app upstream already has a psycopg connection, this can be passed through.
  • If you require a new database connection, the connection parameters can be defined as DbConfig object variables:
from geojson_aoi import parse_aoi, DbConfig

db = DbConfig(
    dbname="db1",
    user="user1",
    password="pass1",
    host="localhost",
    port="5432",
)

featcol = parse_aoi(db, raw_geojson)
  • Or alternatively as variables from your system environment:
GEOJSON_AOI_DB_NAME=aoi
GEOJSON_AOI_DB_USER=aoi
GEOJSON_AOI_DB_PASSWORD=pass
GEOJSON_AOI_DB_HOST=localhost
GEOJSON_AOI_DB_PORT=5432

then

from geojson_aoi import parse_aoi

featcol = parse_aoi(db, raw_geojson)

((All credit for DbConfig goes to https://github.com/hotosm/pg-nearest-city/))

History

  • Initially I tried to write a pure-Python implementation of this, no dependencies.
  • I underestimated the amount of work that is! It could be possible to reverse engineer C++ Geos or georust/geos, but it's more hassle than it's worth.
  • As all of the target install candidates for this package use a db driver anyway, I thought it wisest (and most time efficient) to use the PostGIS Geos implementation (specifically for the unary_union and convex_hull algorithms).
  • An additional advantage is the potential to port this to PGLite when the PostGIS extension is available, meaning AOI processing easily in the browser.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

geojson_aoi_parser-0.3.1.tar.gz (74.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

geojson_aoi_parser-0.3.1-py3-none-any.whl (27.9 kB view details)

Uploaded Python 3

File details

Details for the file geojson_aoi_parser-0.3.1.tar.gz.

File metadata

  • Download URL: geojson_aoi_parser-0.3.1.tar.gz
  • Upload date:
  • Size: 74.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: pdm/2.9.3 CPython/3.12.3

File hashes

Hashes for geojson_aoi_parser-0.3.1.tar.gz
Algorithm Hash digest
SHA256 8078c17b290bfcf09fd464d45a3e32084c9c91efb0d5b97f686a06088a38c1e8
MD5 7d1ec07b7fbdba01fb53a3fd721dee05
BLAKE2b-256 bec1e9539c5754906c49bb247061066956ebcd086ae4e880763f6550d1378a47

See more details on using hashes here.

File details

Details for the file geojson_aoi_parser-0.3.1-py3-none-any.whl.

File metadata

File hashes

Hashes for geojson_aoi_parser-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 964a131ccd35401ff0f3ddbea4e0159537afe65b145be39fdc9ab8bee0e31d53
MD5 85a4cb0df6b72b0d92c728807fa6e81d
BLAKE2b-256 0945c528b220c5ed7cfba1ad4dd399cb302507a026a36cd676bec9b97d66ba99

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page