def from_geojson_feature(cls, task_id, task_feature): """ Constructs and validates a task from a GeoJson feature object :param task_id: Unique ID for the task :param task_feature: A geoJSON feature object :raises InvalidGeoJson, InvalidData """ if type(task_feature) is not geojson.Feature: raise InvalidGeoJson('Task: Invalid GeoJson should be a feature') task_geometry = task_feature.geometry if type(task_geometry) is not geojson.MultiPolygon: raise InvalidGeoJson('Task: Geometry must be a MultiPolygon') is_valid_geojson = geojson.is_valid(task_geometry) if is_valid_geojson['valid'] == 'no': raise InvalidGeoJson( f"Task: Invalid MultiPolygon - {is_valid_geojson['message']}") task = cls() try: task.x = task_feature.properties['x'] task.y = task_feature.properties['y'] task.zoom = task_feature.properties['zoom'] task.splittable = task_feature.properties['splittable'] except KeyError as e: raise InvalidData(f'Task: Expected property not found: {str(e)}') task.id = task_id task_geojson = geojson.dumps(task_geometry) task.geometry = ST_SetSRID(ST_GeomFromGeoJSON(task_geojson), 4326) return task
def set_project_aoi(self, draft_project_dto: DraftProjectDTO): """ Sets the AOI for the supplied project """ aoi_geojson = geojson.loads(json.dumps(draft_project_dto.area_of_interest)) aoi_geometry = GridService.merge_to_multi_polygon(aoi_geojson, dissolve=True) valid_geojson = geojson.dumps(aoi_geometry) self.geometry = ST_SetSRID(ST_GeomFromGeoJSON(valid_geojson), 4326) self.centroid = ST_Centroid(self.geometry)
def __init__(self, aoi_geometry_geojson): """ AOI Constructor :param aoi_geometry_geojson: AOI GeoJson :raises InvalidGeoJson """ aoi_geojson = geojson.loads(json.dumps(aoi_geometry_geojson)) aoi_geometry = GridService.merge_to_multi_polygon(aoi_geojson, dissolve=True) valid_geojson = geojson.dumps(aoi_geometry) self.geometry = ST_SetSRID(ST_GeomFromGeoJSON(valid_geojson), 4326) self.centroid = ST_Centroid(self.geometry)