from shapely import MultiPolygon, Polygon, Geometry, to_wkb, from_wkb from sqlalchemy.types import TypeDecorator, LargeBinary def convert_outage_geometry(event) -> MultiPolygon: assert event["polygons"]["type"] == "polygon" assert event["polygons"]["hasZ"] is False assert event["polygons"]["hasM"] is False polygon_list = [] for ring in event["polygons"]["rings"]: polygon_list.append(Polygon(ring)) return MultiPolygon(polygon_list) class DBGeometry(TypeDecorator): impl = LargeBinary cache_ok = True def process_bind_param(self, value, dialect): if isinstance(value, Geometry): value = to_wkb(value) return value def process_result_value(self, value, dialect): if value is None: return value else: if not isinstance(value, Geometry): value = from_wkb(value) return value