Pydantic models for GeoJSON.
geojson_pydantic
provides a suite of Pydantic models matching the GeoJSON specification rfc7946. Those models can be used for creating or validating geojson data.
$ pip install -U pip
$ pip install geojson-pydantic
Or install from source:
$ pip install -U pip
$ pip install git+https://github.com/developmentseed/geojson-pydantic.git
Install with conda from conda-forge
:
$ conda install -c conda-forge geojson-pydantic
from geojson_pydantic import Feature, FeatureCollection, Point
geojson_feature = {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [13.38272, 52.46385],
},
"properties": {
"name": "jeff",
},
}
feat = Feature(**geojson_feature)
assert feat.type == "Feature"
assert type(feat.geometry) == Point
assert feat.properties["name"] == "jeff"
fc = FeatureCollection(features=[geojson_feature, geojson_feature])
assert fc.type == "FeatureCollection"
assert len(fc) == 2
assert type(fc.features[0].geometry) == Point
assert fc.features[0].properties["name"] == "jeff"
In geojson_pydantic
we've implemented pydantic's Generic Models which allow the creation of more advanced models to validate either the geometry type or the properties.
In order to make use of this generic typing, there are two steps: first create a new model, then use that model to validate your data. To create a model using a Generic
type, you HAVE TO pass Type definitions
to the Feature
model in form of Feature[Geometry Type, Properties Type]
. Then pass your data to this constructor.
By default Feature
and FeatureCollections
are defined using geojson_pydantic.geometries.Geometry
for the geometry and typing.Dict
for the properties.
Here's an example where we want to validate that GeoJSON features have Polygon types, but don't do any specific property validation.
from typing import Dict
from geojson_pydantic import Feature, Polygon
from pydantic import BaseModel
geojson_feature = {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [13.38272, 52.46385],
},
"properties": {
"name": "jeff",
},
}
# Define a Feature model with Geometry as `Polygon` and Properties as `Dict`
MyPolygonFeatureModel = Feature[Polygon, Dict]
feat = MyPolygonFeatureModel(**geojson_feature) # should raise Validation Error because `geojson_feature` is a polygon
>>> ValidationError: 3 validation errors for Feature[Polygon, Dict]
...
geometry -> type
unexpected value; permitted: 'Polygon' (type=value_error.const; given=Point; permitted=['Polygon'])
geojson_feature = {
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[13.38272, 52.46385],
[13.42786, 52.46385],
[13.42786, 52.48445],
[13.38272, 52.48445],
[13.38272, 52.46385],
]
],
},
"properties": {
"name": "jeff",
},
}
feat = MyPolygonFeatureModel(**geojson_feature)
assert type(feature.geometry) == Polygon
Or with optional geometry
from geojson_pydantic import Feature, Point
from typing import Optional
MyPointFeatureModel = Feature[Optional[Point], Dict]
assert MyPointFeatureModel(type="Feature", geometry=None, properties={}).geometry is None
assert MyPointFeatureModel(type="Feature", geometry=Point(coordinates=(0,0)), properties={}).geometry is not None
And now with constrained properties
from geojson_pydantic import Feature, Point
from pydantic import BaseModel, constr
# Define a Feature model with Geometry as `Point` and Properties as a constrained Model
class MyProps(BaseModel):
name: constr(regex=r'^(drew|vincent)$')
MyPointFeatureModel = Feature[Point, MyProps]
geojson_feature = {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [13.38272, 52.46385],
},
"properties": {
"name": "jeff",
},
}
feat = MyPointFeatureModel(**geojson_feature)
>>> ValidationError: 1 validation error for Feature[Point, MyProps]
properties -> name
string does not match regex "^(drew|vincent)$" (type=value_error.str.regex; pattern=^(drew|vincent)$)
geojson_feature["properties"]["name"] = "drew"
feat = MyPointFeatureModel(**geojson_feature)
assert feat.properties.name == "drew"
See CONTRIBUTING.md.
See CHANGES.md.
Initial implementation by @geospatial-jeff; taken liberally from https://github.com/arturo-ai/stac-pydantic/
See contributors for a listing of individual contributors.
See LICENSE