30 lines
924 B
Python
30 lines
924 B
Python
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
|