Beispiel #1
0
def add_asset_to_asset_list(asset_list, asset):
    port_list = []
    ports = asset.port
    for p in ports:
        conn_to_ids = [cp.id for cp in p.connectedTo]
        profile = p.profile
        profile_info_list = []
        p_carr_id = None
        if p.carrier:
            p_carr_id = p.carrier.id
        if profile:
            profile_info_list = []  # generate_profile_info(profile)
        port_list.append({
            'name': p.name,
            'id': p.id,
            'type': type(p).__name__,
            'conn_to': conn_to_ids,
            'profile': profile_info_list,
            'carrier': p_carr_id
        })

    state = asset_state_to_ui(asset)
    geom = asset.geometry
    if geom:
        if isinstance(geom, esdl.Point):
            lat = geom.lat
            lon = geom.lon

            capability_type = ESDLAsset.get_asset_capability_type(asset)
            attrs = get_tooltip_asset_attrs(asset, 'marker')
            add_spatial_attributes(asset, attrs)
            asset_list.append([
                'point', 'asset', asset.name, asset.id,
                type(asset).__name__, [lat, lon], attrs, state, port_list,
                capability_type
            ])
        if isinstance(geom, esdl.Line):
            coords = []
            for point in geom.point:
                coords.append([point.lat, point.lon])
            attrs = get_tooltip_asset_attrs(asset, 'line')
            add_spatial_attributes(asset, attrs)
            asset_list.append([
                'line', 'asset', asset.name, asset.id,
                type(asset).__name__, coords, attrs, state, port_list
            ])
        if isinstance(geom, esdl.Polygon):
            coords = ESDLGeometry.parse_esdl_subpolygon(geom.exterior,
                                                        False)  # [lon, lat]
            coords = ESDLGeometry.exchange_coordinates(
                coords)  # --> [lat, lon]
            capability_type = ESDLAsset.get_asset_capability_type(asset)
            attrs = get_tooltip_asset_attrs(asset, 'polygon')
            add_spatial_attributes(asset, attrs)
            asset_list.append([
                'polygon', 'asset', asset.name, asset.id,
                type(asset).__name__, coords, attrs, state, port_list,
                capability_type
            ])
Beispiel #2
0
        def get_bag_contours(info):
            with self.flask_app.app_context():
                print("getting bag information")
                esh = get_handler()
                active_es_id = get_session('active_es_id')

                area_id = info["id"]
                area_polygon = { 'type': 'polygon', 'coordinates': info["polygon"] }
                geometry = ESDLGeometry.create_ESDL_geometry(area_polygon)
                boundary_wgs = ESDLGeometry.create_boundary_from_geometry(geometry)
                # boundary_geojson = ESDLGeometry.create_geojson(area_id, '', [], boundary_wgs)
                wkt_string = wkt.dumps(boundary_wgs)
                # wkt_string = 'POLYGON ((4.359093904495239 52.012174264626445, 4.357388019561768 52.01154692445308, 4.357978105545044 52.01078750089633, 4.360188245773315 52.01160635705717, 4.362355470657349 52.012478026181434, 4.360767602920532 52.012847820073766, 4.359093904495239 52.012174264626445))'
                # wkt_quoted = urllib.parse.quote(wkt_string)

                es_edit = esh.get_energy_system(es_id=active_es_id)
                instance = es_edit.instance
                top_area = instance[0].area
                target_area = ESDLEnergySystem.find_area(top_area, area_id)
                if target_area:
                    try:
                        # url = 'http://' + settings.bag_config["host"] + ':' + settings.bag_config["port"] + \
                        #        settings.bag_config["path_contour"] + '?wkt=' + wkt_quoted + '&format=xml'
                        # print(url)
                        # r = requests.get(url)
                        url = 'http://' + settings.bag_config["host"] + ':' + settings.bag_config["port"] + \
                               settings.bag_config["path_contour"] + '?format=xml'
                        print(url)
                        r = requests.post(url, json={"wkt": wkt_string})
                        if r.status_code == 201:
                            esdl_string = r.text
                            bag_es = ESDLAsset.load_asset_from_string(esdl_string)
                            if bag_es:
                                bag_inst = bag_es.instance[0]
                                if bag_inst:
                                    bag_area = bag_inst.area
                                    if bag_area:
                                        bld_list = []
                                        for bld in bag_area.asset:
                                            if isinstance(bld, esdl.Building):
                                                target_area.asset.append(bld.deepcopy())
                                                geometry = bld.geometry
                                                boundary_wgs = ESDLGeometry.create_boundary_from_geometry(geometry)
                                                bld_list.append(ESDLGeometry.create_geojson(bld.id, bld.name, [], boundary_wgs))

                                        if bld_list:
                                            emit('geojson', {"layer": "bld_layer", "geojson": bld_list})

                    except Exception as e:
                        print('ERROR in accessing BAG service: '+str(e))
                        return None

                    # @EWOUD: Deze 'mogelijkheid' kunnen we ook gebruiken om geometries te renderen in de frontend
                    # self.emit_geometries_to_client(esh, active_es_id, bld_list)
                else:
                    print("ERROR in finding area in ESDL for BAG service")
                    # self.flask_app.send_alert("ERROR in finding area in ESDL for BAG service")
                    return None
Beispiel #3
0
def energy_asset_to_ui(esh, es_id, asset): # , port_asset_mapping):
    port_list = []
    conn_list = []

    ports = asset.port
    for p in ports:
        # p_asset = port_asset_mapping[p.id]
        p_asset = get_asset_and_coord_from_port_id(esh, es_id, p.id)
        p_asset_coord = p_asset['coord']        # get proper coordinate if asset is line
        conn_to = [cp.id for cp in p.connectedTo]
        profile = p.profile
        profile_info_list = []
        if profile:
            profile_info_list = generate_profile_info(profile)
        port_list.append \
            ({'name': p.name, 'id': p.id, 'type': type(p).__name__, 'conn_to': conn_to, 'profile': profile_info_list})
        if conn_to:
            # conn_to_list = conn_to.split(' ')   # connectedTo attribute is list of port ID's separated by a space
            for id in conn_to:
                # pc_asset = port_asset_mapping[id]
                pc_asset = get_asset_and_coord_from_port_id(esh, es_id, id)
                pc_asset_coord = pc_asset['coord']

                conn_list.append \
                    ({'from-port-id': p.id, 'from-asset-id': p_asset['asset'].id, 'from-asset-coord': p_asset_coord,
                                  'to-port-id': id, 'to-asset-id': pc_asset['asset'].id, 'to-asset-coord': pc_asset_coord})

    geom = asset.geometry
    if geom:
        if isinstance(geom, esdl.Point):
            lat = geom.lat
            lon = geom.lon

            capability_type = ESDLAsset.get_asset_capability_type(asset)
            return ['point', 'asset', asset.name, asset.id, type(asset).__name__, [lat, lon], port_list, capability_type], conn_list
        elif isinstance(geom, esdl.Line):
            coords = []
            for point in geom.point:
                coords.append([point.lat, point.lon])
            return ['line', 'asset', asset.name, asset.id, type(asset).__name__, coords, port_list], conn_list
        elif isinstance(geom, esdl.Polygon):
            if isinstance(asset, esdl.WindParc) or isinstance(asset, esdl.PVParc) or isinstance(asset, esdl.WindPark) \
                    or isinstance(asset, esdl.PVPark):
                coords = ESDLGeometry.parse_esdl_subpolygon(geom.exterior, False)   # [lon, lat]
                coords = ESDLGeometry.exchange_coordinates(coords)                  # --> [lat, lon]
                capability_type = ESDLAsset.get_asset_capability_type(asset)
                # print(coords)
                return ['polygon', 'asset', asset.name, asset.id, type(asset).__name__, coords, port_list, capability_type], conn_list
        else:
            return [], []
Beispiel #4
0
 def get_port_coordinates(self, asset, index):
     from_coords = ()
     if isinstance(asset.geometry, Line):
         if index == 0:  # first port == first coordinate
             point: Point = asset.geometry.point[0]
             from_coords = (point.lat, point.lon)
         elif index == len(asset.port) - 1:
             point: Point = asset.geometry.point[-1]
             from_coords = (point.lat, point.lon)
     elif isinstance(asset.geometry, Point):
         from_coords = (asset.geometry.lat, asset.geometry.lon)
     if isinstance(asset.geometry, Polygon):
         from_coords = ESDLGeometry.calculate_polygon_center(asset.geometry)
     return from_coords
Beispiel #5
0
def get_asset_geom_info(asset):
    geom = asset.geometry
    if geom:
        if isinstance(geom, esdl.Point):
            lat = geom.lat
            lon = geom.lon
            return (lat, lon)
        if isinstance(geom, esdl.Line):
            points = geom.point
            first = (points[0].lat, points[0].lon)
            last = (points[len(points) - 1].lat, points[len(points) - 1].lon)
            return [first, last]
        if isinstance(geom, esdl.Polygon):
            center = ESDLGeometry.calculate_polygon_center(geom)
            return center
    return ()
    def add_geometries_to_esdl(self, esh, es_id, area_list):
        with self.flask_app.app_context():

            es_edit = esh.get_energy_system(es_id)
            instance = es_edit.instance
            area = instance[0].area

            for ibis_area in area_list:
                new_area = esdl.Area(id=str(uuid4()), name=ibis_area['name'])
                new_area.scope = esdl.AreaScopeEnum.from_string("UNDEFINED")

                boundary = ibis_area

                if boundary:
                    geometry = ESDLGeometry.create_geometry_from_geom(
                        boundary['geom'])
                    new_area.geometry = geometry

                area.area.append(new_area)
                esh.add_object_to_dict(es_id, new_area)
        def get_boundary_info(info):
            print('get_boundary_info:')
            print(info)

            user = get_session('user-email')
            user_settings = self.get_user_settings(user)
            boundaries_year = user_settings['boundaries_year']

            shape_dictionary = get_session('shape_dictionary')
            if not shape_dictionary:
                shape_dictionary = {}

            identifier = info["identifier"]
            toparea_name = info["toparea_name"]
            scope = info["scope"]
            subscope_enabled = info["subscope_enabled"]
            subscope = info["subscope"]
            select_subareas = info["select_subareas"]
            selected_subareas = info["selected_subareas"]
            initialize_ES = info["initialize_ES"]
            add_boundary_to_ESDL = info["add_boundary_to_ESDL"]

            if not is_valid_boundary_id(identifier):
                send_alert(
                    "Not a valid identifier. Try identifiers like PV27 (Noord-Holland) or GM0060 (Ameland)"
                )
                return

            active_es_id = get_session('active_es_id')
            esh = get_handler()
            es_edit = esh.get_energy_system(es_id=active_es_id)
            instance = es_edit.instance
            area = instance[0].area

            area_list = []
            boundary = None
            if subscope_enabled:
                self.__preload_subboundaries_in_cache(
                    boundaries_year,
                    esdl.AreaScopeEnum.from_string(str.upper(scope)),
                    esdl.AreaScopeEnum.from_string(str.upper(subscope)),
                    str.upper(identifier))
            else:
                boundary = self.get_boundary_from_service(
                    boundaries_year,
                    esdl.AreaScopeEnum.from_string(str.upper(scope)),
                    str.upper(identifier))
                if boundary:
                    geom = boundary['geom']
                    # geometry = ESDLGeometry.create_geometry_from_geom()

                    shape = Shape.parse_geojson_geometry(boundary['geom'])
                    if shape:
                        shape_dictionary[identifier] = shape

                    for i in range(0, len(geom['coordinates'])):
                        if len(geom['coordinates']) > 1:
                            area_id_number = " ({} of {})".format(
                                i + 1, len(geom['coordinates']))
                        else:
                            area_id_number = ""
                        area_list.append({
                            "type": "Feature",
                            "geometry": {
                                "type": "Polygon",
                                "coordinates": geom['coordinates'][i]
                            },
                            "properties": {
                                "id": area.id + area_id_number,
                                "name": area.name,
                                "KPIs": []
                            }
                        })

            if initialize_ES:
                # change ID, name and scope of ES
                if select_subareas:
                    area.id = "part of " + identifier
                else:
                    area.id = identifier

                # Area ID has changed, re-add to dictionairy
                esh.add_object_to_dict(active_es_id, area)

                area.scope = esdl.AreaScopeEnum.from_string(str.upper(scope))
                area.name = toparea_name
                if add_boundary_to_ESDL:
                    # returns boundary: { type: '', boundary: [[[[ ... ]]]] } (multipolygon in RD)
                    if not boundary:  # check if already requested
                        boundary = self.get_boundary_from_service(
                            boundaries_year,
                            esdl.AreaScopeEnum.from_string(str.upper(scope)),
                            str.upper(identifier))
                    if boundary:
                        geometry = ESDLGeometry.create_geometry_from_geom(
                            boundary['geom'])
                        area.geometry = geometry

                        shape = Shape.parse_geojson_geometry(boundary['geom'])
                        if shape:
                            shape_dictionary[identifier] = shape

                    # boundary = get_boundary_from_service(area_scope, area_id)
                    # if boundary:
                    #    emit('area_boundary', {'info-type': 'MP-RD', 'crs': 'RD', 'boundary': boundary})

            if subscope_enabled:
                boundaries = self.__get_subboundaries_from_service(
                    boundaries_year,
                    esdl.AreaScopeEnum.from_string(str.upper(scope)),
                    esdl.AreaScopeEnum.from_string(str.upper(subscope)),
                    str.upper(identifier))
                # result (boundaries) is an ARRAY of:
                # {'code': 'BU00140500', 'geom': '{"type":"MultiPolygon","bbox":[...],"coordinates":[[[[6.583651,53.209594],
                # [6.58477,...,53.208816],[6.583651,53.209594]]]]}'}

                if not boundaries:
                    send_alert(
                        'Error processing boundary information or no boundary information returned'
                    )

                for boundary in boundaries:
                    geom = None
                    try:
                        # geom = json.loads(boundary["geom"])
                        geom = boundary["geom"]

                        shape = Shape.parse_geojson_geometry(boundary['geom'])
                        if shape:
                            shape_dictionary[boundary['code']] = shape
                    except Exception as e:
                        print(
                            'Error parsing JSON from GEIS boundary service: ' +
                            str(e))

                    if geom:
                        skip_subarea = False
                        if select_subareas and selected_subareas and boundary[
                                "code"] not in selected_subareas:
                            skip_subarea = True

                        if not skip_subarea:
                            sub_area_id = boundary["code"]
                            sub_area_name = boundary["name"]

                            if initialize_ES:
                                sub_area = esdl.Area()
                                sub_area.id = sub_area_id
                                sub_area.name = sub_area_name
                                sub_area.scope = esdl.AreaScopeEnum.from_string(
                                    str.upper(subscope))

                                if add_boundary_to_ESDL:
                                    geometry = ESDLGeometry.create_geometry_from_geom(
                                        geom)
                                    sub_area.geometry = geometry

                                area.area.append(sub_area)
                                esh.add_object_to_dict(active_es_id, sub_area)

                            for i in range(0, len(geom['coordinates'])):
                                if len(geom['coordinates']) > 1:
                                    area_id_number = " ({} of {})".format(
                                        i + 1, len(geom['coordinates']))
                                else:
                                    area_id_number = ""
                                area_list.append({
                                    "type": "Feature",
                                    "geometry": {
                                        "type": "Polygon",
                                        "coordinates": geom['coordinates'][i]
                                    },
                                    "properties": {
                                        "id": sub_area_id + area_id_number,
                                        "name": sub_area_name,
                                        "KPIs": []
                                    }
                                })

            set_session('shape_dictionary', shape_dictionary)
            emit('geojson', {"layer": "area_layer", "geojson": area_list})
            print('Ready processing boundary information')
def process_area(esh, es_id, asset_list, building_list, area_bld_list, conn_list, area, level):
    area_bld_list.append(['Area', area.id, area.name, level])

    # process subareas
    for ar in area.area:
        process_area(esh, es_id, asset_list, building_list, area_bld_list, conn_list, ar, level+1)

    # process assets in area
    for asset in area.asset:
        if isinstance(asset, esdl.AbstractBuilding):
            process_building(esh, es_id, asset_list, building_list, area_bld_list, conn_list, asset, False, level+1)
        if isinstance(asset, esdl.EnergyAsset):
            port_list = []
            ports = asset.port
            for p in ports:
                p_asset = get_asset_and_coord_from_port_id(esh, es_id, p.id)
                p_asset_coord = p_asset['coord']        # get proper coordinate if asset is line
                conn_to_ids = [cp.id for cp in p.connectedTo]
                profile = p.profile
                profile_info_list = []
                p_carr_id = None
                if p.carrier:
                    p_carr_id = p.carrier.id
                if profile:
                    profile_info_list = generate_profile_info(profile)
                port_list.append({'name': p.name, 'id': p.id, 'type': type(p).__name__, 'conn_to': conn_to_ids, 'profile': profile_info_list, 'carrier': p_carr_id})
                if conn_to_ids:
                    for pc in p.connectedTo:
                        pc_asset = get_asset_and_coord_from_port_id(esh, es_id, pc.id)
                        if pc_asset['asset'].containingBuilding:
                            bld_pc_asset = pc_asset['asset'].containingBuilding
                            if bld_pc_asset.geometry:
                                if isinstance(bld_pc_asset.geometry, esdl.Point):
                                    pc_asset_coord = (bld_pc_asset.geometry.lat, bld_pc_asset.geometry.lon)
                                elif isinstance(bld_pc_asset.geometry, esdl.Polygon):
                                    pc_asset_coord = ESDLGeometry.calculate_polygon_center(bld_pc_asset.geometry)
                        else:
                            pc_asset_coord = pc_asset['coord']

                        pc_carr_id = None
                        if pc.carrier:
                            pc_carr_id = pc.carrier.id
                        conn_list.append({'from-port-id': p.id, 'from-port-carrier': p_carr_id, 'from-asset-id': p_asset['asset'].id, 'from-asset-coord': p_asset_coord,
                                          'to-port-id': pc.id, 'to-port-carrier': pc_carr_id, 'to-asset-id': pc_asset['asset'].id, 'to-asset-coord': pc_asset_coord})

            geom = asset.geometry
            if geom:
                if isinstance(geom, esdl.Point):
                    lat = geom.lat
                    lon = geom.lon

                    capability_type = ESDLAsset.get_asset_capability_type(asset)
                    asset_list.append(['point', 'asset', asset.name, asset.id, type(asset).__name__, [lat, lon], port_list, capability_type])
                if isinstance(geom, esdl.Line):
                    coords = []
                    for point in geom.point:
                        coords.append([point.lat, point.lon])
                    asset_list.append(['line', 'asset', asset.name, asset.id, type(asset).__name__, coords, port_list])
                if isinstance(geom, esdl.Polygon):
                    # if isinstance(asset, esdl.WindParc) or isinstance(asset, esdl.PVParc) or isinstance(asset, esdl.WindPark) or isinstance(asset, esdl.PVPark):
                    coords = ESDLGeometry.parse_esdl_subpolygon(geom.exterior, False)   # [lon, lat]
                    coords = ESDLGeometry.exchange_coordinates(coords)                  # --> [lat, lon]
                    capability_type = ESDLAsset.get_asset_capability_type(asset)
                    # print(coords)
                    asset_list.append(['polygon', 'asset', asset.name, asset.id, type(asset).__name__, coords, port_list, capability_type])

    for potential in area.potential:
        geom = potential.geometry
        if geom:
            if isinstance(geom, esdl.Point):
                lat = geom.lat
                lon = geom.lon

                asset_list.append(
                    ['point', 'potential', potential.name, potential.id, type(potential).__name__, [lat, lon]])
            if isinstance(geom, esdl.Polygon):
                coords = []

                for point in geom.exterior.point:
                    coords.append([point.lat, point.lon])
                asset_list.append(['polygon', 'potential', potential.name, potential.id, type(potential).__name__, coords])
def process_building(esh, es_id, asset_list, building_list, area_bld_list, conn_list, building, bld_editor, level):
    # Add building to list that is shown in a dropdown at the top
    area_bld_list.append(['Building', building.id, building.name, level])

    # Determine if building has assets
    building_has_assets = False
    if building.asset:
        for basset in building.asset:
            if isinstance(basset, esdl.EnergyAsset):
                building_has_assets = True
                break

    # Generate information for drawing building (as a point or a polygon)
    if isinstance(building, esdl.Building) or isinstance(building, esdl.AggregatedBuilding):
        geometry = building.geometry
        bld_KPIs = create_building_KPIs(building)
        if geometry:
            if isinstance(geometry, esdl.Point):
                building_list.append(
                    ['point', building.name, building.id, type(building).__name__, [geometry.lat, geometry.lon], building_has_assets, bld_KPIs])
                bld_coord = (geometry.lat, geometry.lon)
            elif isinstance(geometry, esdl.Polygon):
                coords = ESDLGeometry.parse_esdl_subpolygon(building.geometry.exterior, False)  # [lon, lat]
                coords = ESDLGeometry.exchange_coordinates(coords)  # --> [lat, lon]
                # building_list.append(['polygon', building.name, building.id, type(building).__name__, coords, building_has_assets])
                boundary = ESDLGeometry.create_boundary_from_geometry(geometry)
                building_list.append(['polygon', building.name, building.id, type(building).__name__, boundary['coordinates'], building_has_assets, bld_KPIs])
                # bld_coord = coords
                bld_coord = ESDLGeometry.calculate_polygon_center(geometry)
    elif building.containingBuilding:       # BuildingUnit
        bld_geom = building.containingBuilding.geometry
        if bld_geom:
            if isinstance(bld_geom, esdl.Point):
                bld_coord = (bld_geom.lat, bld_geom.lon)
            elif isinstance(bld_geom, esdl.Polygon):
                bld_coord = ESDLGeometry.calculate_polygon_center(bld_geom)

    # Iterate over all assets in building to gather all required information
    for basset in building.asset:
        if isinstance(basset, esdl.AbstractBuilding):
            process_building(esh, es_id, asset_list, building_list, area_bld_list, conn_list, basset, bld_editor, level + 1)
        else:
            # Create a list of ports for this asset
            port_list = []
            ports = basset.port
            for p in ports:
                conn_to = p.connectedTo
                conn_to_id_list = [ct.id for ct in conn_to]
                # TODO: add profile_info and carrier
                port_list.append({'name': p.name, 'id': p.id, 'type': type(p).__name__, 'conn_to': conn_to_id_list})

            geom = basset.geometry
            coord = ()
            if geom:    # Individual asset in Building has its own geometry information
                if isinstance(geom, esdl.Point):
                    lat = geom.lat
                    lon = geom.lon
                    coord = (lat, lon)

                    capability_type = ESDLAsset.get_asset_capability_type(basset)
                    if bld_editor:
                        asset_list.append(['point', 'asset', basset.name, basset.id, type(basset).__name__, [lat, lon], port_list, capability_type])
                else:
                    send_alert("Assets within buildings with geometry other than esdl.Point are not supported")

            # Inherit geometry from containing building
            # if level > 0:
            #     coord = bld_coord

            ports = basset.port
            for p in ports:
                p_carr_id = None
                if p.carrier:
                    p_carr_id = p.carrier.id
                conn_to = p.connectedTo
                if conn_to:
                    for pc in conn_to:
                        in_different_buildings = False
                        pc_asset = get_asset_and_coord_from_port_id(esh, es_id, pc.id)

                        # If the asset the current asset connects to, is in a building...
                        if pc_asset['asset'].containingBuilding:
                            bld_pc_asset = pc_asset['asset'].containingBuilding
                            bld_basset = basset.containingBuilding
                            # If the asset is in a different building ...
                            if not bld_pc_asset == bld_basset:
                                in_different_buildings = True
                                if bld_pc_asset.geometry:
                                    if bld_editor:
                                        # ... connect to the left border
                                        pc_asset_coord = (coord[0], 0)
                                    else:
                                        # ... use the building coordinate instead of the asset coordinate
                                        if isinstance(bld_pc_asset.geometry, esdl.Point):
                                            pc_asset_coord = (bld_pc_asset.geometry.lat, bld_pc_asset.geometry.lon)
                                        elif isinstance(bld_pc_asset.geometry, esdl.Polygon):
                                            pc_asset_coord = ESDLGeometry.calculate_polygon_center(bld_pc_asset.geometry)

                                    # If connecting to a building outside of the current, replace current asset
                                    # coordinates with building coordinates too
                                    if not bld_editor:
                                        coord = bld_coord
                            else:
                                # asset is in the same building, use asset's own coordinates
                                pc_asset_coord = pc_asset['coord']
                        else:
                            # other asset is not in a building
                            if bld_editor:
                                # ... connect to the left border
                                pc_asset_coord = (coord[0], 0)
                            else:
                                # ... just use asset's location
                                pc_asset_coord = pc_asset['coord']

                        pc_carr_id = None
                        if pc.carrier:
                            pc_carr_id = pc.carrier.id
                        # Add connections if we're editing a building or if the connection is between two different buildings
                        # ( The case of an asset in an area that is connected with an asset in a building is handled
                        #   in process_area (now all connections are added twice, from both sides) )
                        if bld_editor or in_different_buildings:
                            conn_list.append({'from-port-id': p.id, 'from-port-carrier': p_carr_id, 'from-asset-id': basset.id, 'from-asset-coord': coord,
                                'to-port-id': pc.id, 'to-port-carrier': pc_carr_id, 'to-asset-id': pc_asset['asset'].id, 'to-asset-coord': pc_asset_coord})

    if bld_editor:
        for potential in building.potential:
            geom = potential.geometry
            if geom:
                if isinstance(geom, esdl.Point):
                    lat = geom.lat
                    lon = geom.lon

                    asset_list.append(
                        ['point', 'potential', potential.name, potential.id, type(potential).__name__, [lat, lon]])
def find_area_info_geojson(area_list, pot_list, this_area):
    area_id = this_area.id
    area_name = this_area.name
    if not area_name: area_name = ""
    area_scope = this_area.scope
    area_geometry = this_area.geometry

    user = get_session('user-email')
    user_settings = BoundaryService.get_instance().get_user_settings(user)
    boundaries_year = user_settings['boundaries_year']

    geojson_KPIs = {}
    area_KPIs = this_area.KPIs
    if area_KPIs:
        for kpi in area_KPIs.kpi:
            if not isinstance(kpi, esdl.DistributionKPI):
                geojson_KPIs[kpi.name] = kpi.value

    area_shape = None

    if area_geometry:
        if isinstance(area_geometry, esdl.Polygon):
            shape_polygon = Shape.create(area_geometry)
            area_list.append(shape_polygon.get_geojson_feature({
                "id": area_id,
                "name": area_name,
                "KPIs": geojson_KPIs
            }))
            area_shape = shape_polygon
        if isinstance(area_geometry, esdl.MultiPolygon):
            boundary_wgs = ESDLGeometry.create_boundary_from_geometry(area_geometry)
            shape_multipolygon = Shape.parse_geojson_geometry(boundary_wgs)
            num_sub_polygons = len(shape_multipolygon.shape.geoms)
            for i, pol in enumerate(shape_multipolygon.shape.geoms):
                if num_sub_polygons > 1:
                    area_id_number = " ({} of {})".format(i + 1, num_sub_polygons)
                else:
                    area_id_number = ""
                shape_polygon = Shape.create(pol)
                area_list.append(shape_polygon.get_geojson_feature({
                    "id": str.upper(area_id) + area_id_number,
                    "name": area_name,
                    "KPIs": geojson_KPIs
                }))
            area_shape = shape_multipolygon
        if isinstance(area_geometry, esdl.WKT):
            shape_wkt = Shape.create(area_geometry)
            area_list.append(shape_wkt.get_geojson_feature({
                "id": area_id,
                "name": area_name,
                "KPIs": geojson_KPIs
            }))
            area_shape = shape_wkt
    else:
        if area_id and area_scope.name != 'UNDEFINED':
            if is_valid_boundary_id(area_id):
                # print('Retrieve boundary from boundary service')
                boundary_wgs = BoundaryService.get_instance().get_boundary_from_service(boundaries_year, area_scope, str.upper(area_id))
                if boundary_wgs:
                    sh = Shape.parse_geojson_geometry(boundary_wgs['geom'])
                    num_sub_polygons = len(sh.shape.geoms)
                    for i, pol in enumerate(sh.shape.geoms):
                        if num_sub_polygons > 1:
                            area_id_number = " ({} of {})".format(i + 1, num_sub_polygons)
                        else:
                            area_id_number = ""
                        shape_polygon = Shape.create(pol)
                        area_list.append(shape_polygon.get_geojson_feature({
                            "id": str.upper(area_id) + area_id_number,
                            "name": boundary_wgs['name'],
                            "KPIs": geojson_KPIs
                        }))

                    area_shape = sh

    # assign random coordinates if boundary is given and area contains assets without coordinates
    # and gives assets within buildings a proper coordinate
    if area_shape:
        update_asset_geometries_shape(this_area, area_shape)

    potentials = this_area.potential
    for potential in potentials:
        potential_geometry = potential.geometry
        potential_name = potential.name
        if not potential_name:
            potential_name = ""
        if potential_geometry:
            if isinstance(potential_geometry, esdl.WKT):
                shape = Shape.create(potential_geometry)
                pot_list.append(shape.get_geojson_feature({
                    "id": potential.id,
                    "name": potential_name,
                }))

    for area in this_area.area:
        find_area_info_geojson(area_list, pot_list, area)
Beispiel #11
0
def process_area(esh, es_id, asset_list, building_list, area_bld_list,
                 conn_list, area, level):
    area_bld_list.append(['Area', area.id, area.name, level])

    # process subareas
    for ar in area.area:
        process_area(esh, es_id, asset_list, building_list, area_bld_list,
                     conn_list, ar, level + 1)

    # process assets in area
    for asset in area.asset:
        if isinstance(asset, esdl.AbstractBuilding):
            process_building(esh, es_id, asset_list, building_list,
                             area_bld_list, conn_list, asset, False, level + 1)
        if isinstance(asset, esdl.EnergyAsset):
            add_asset_to_asset_list(asset_list, asset)

            for p in asset.port:
                p_asset = get_asset_and_coord_from_port_id(esh, es_id, p.id)
                p_asset_coord = p_asset[
                    'coord']  # get proper coordinate if asset is line
                conn_to_ids = [cp.id for cp in p.connectedTo]
                p_carr_id = None
                if p.carrier:
                    p_carr_id = p.carrier.id
                if conn_to_ids:
                    for pc in p.connectedTo:
                        pc_asset = get_asset_and_coord_from_port_id(
                            esh, es_id, pc.id)
                        pc_asset_coord = None
                        if pc_asset['asset'].containingBuilding:
                            bld_pc_asset = pc_asset['asset'].containingBuilding
                            if bld_pc_asset.geometry:
                                if isinstance(bld_pc_asset.geometry,
                                              esdl.Point):
                                    pc_asset_coord = (
                                        bld_pc_asset.geometry.lat,
                                        bld_pc_asset.geometry.lon)
                                elif isinstance(bld_pc_asset.geometry,
                                                esdl.Polygon):
                                    pc_asset_coord = ESDLGeometry.calculate_polygon_center(
                                        bld_pc_asset.geometry)
                        else:
                            pc_asset_coord = pc_asset['coord']

                        pc_carr_id = None
                        if pc.carrier:
                            pc_carr_id = pc.carrier.id
                        conn_list.append({
                            'from-port-id': p.id,
                            'from-port-carrier': p_carr_id,
                            'from-asset-id': p_asset['asset'].id,
                            'from-asset-coord': p_asset_coord,
                            'to-port-id': pc.id,
                            'to-port-carrier': pc_carr_id,
                            'to-asset-id': pc_asset['asset'].id,
                            'to-asset-coord': pc_asset_coord
                        })

    for potential in area.potential:
        geom = potential.geometry
        if geom:
            if isinstance(geom, esdl.Point):
                lat = geom.lat
                lon = geom.lon

                asset_list.append([
                    'point', 'potential', potential.name, potential.id,
                    type(potential).__name__, [lat, lon]
                ])
            if isinstance(geom, esdl.Polygon):
                coords = []

                for point in geom.exterior.point:
                    coords.append([point.lat, point.lon])
                asset_list.append([
                    'polygon', 'potential', potential.name, potential.id,
                    type(potential).__name__, coords
                ])
Beispiel #12
0
def find_area_info_geojson(area_list, pot_list, this_area, shape_dictionary):
    area_id = this_area.id
    area_name = this_area.name
    if not area_name: area_name = ""
    area_scope = this_area.scope
    area_geometry = this_area.geometry

    user = get_session('user-email')
    user_settings = BoundaryService.get_instance().get_user_settings(user)
    boundaries_year = user_settings['boundaries_year']

    geojson_KPIs = {}
    geojson_dist_kpis = {}
    area_KPIs = this_area.KPIs
    if area_KPIs:
        for kpi in area_KPIs.kpi:
            if not isinstance(kpi, esdl.DistributionKPI):
                kpi_qau = kpi.quantityAndUnit
                if kpi_qau:
                    if isinstance(kpi_qau, esdl.QuantityAndUnitReference):
                        kpi_qau = kpi_qau.reference

                    if not kpi_qau:  # Reference field in the ESDL could be "" (but should never be)
                        unit = ''
                    else:
                        unit = ESDLQuantityAndUnits.unit_to_string(kpi_qau)
                else:
                    unit = ''
                geojson_KPIs[kpi.name] = {'value': kpi.value, 'unit': unit}
            else:
                geojson_dist_kpis[kpi.name] = {
                    "type": "distributionKPI",
                    "value": []
                }
                for str_val in kpi.distribution.stringItem:
                    geojson_dist_kpis[kpi.name]["value"].append({
                        "name":
                        str_val.label,
                        "value":
                        str_val.value
                    })

                if area_geometry:
                    shape = Shape.create(area_geometry)
                    geojson_dist_kpis[kpi.name]["location"] = [
                        shape.shape.centroid.coords.xy[1][0],
                        shape.shape.centroid.coords.xy[0][0]
                    ]
                else:
                    geojson_dist_kpis[kpi.name]["location"] = None

    area_shape = None

    if area_geometry:
        if isinstance(area_geometry, esdl.Polygon):
            shape_polygon = Shape.create(area_geometry)
            area_list.append(
                shape_polygon.get_geojson_feature({
                    "id":
                    area_id,
                    "name":
                    area_name,
                    "KPIs":
                    geojson_KPIs,
                    "dist_KPIs":
                    geojson_dist_kpis
                }))
            area_shape = shape_polygon
        if isinstance(area_geometry, esdl.MultiPolygon):
            boundary_wgs = ESDLGeometry.create_boundary_from_geometry(
                area_geometry)
            shape_multipolygon = Shape.parse_geojson_geometry(boundary_wgs)
            num_sub_polygons = len(shape_multipolygon.shape.geoms)
            for i, pol in enumerate(shape_multipolygon.shape.geoms):
                if num_sub_polygons > 1:
                    area_id_number = " ({} of {})".format(
                        i + 1, num_sub_polygons)
                else:
                    area_id_number = ""
                shape_polygon = Shape.create(pol)
                area_list.append(
                    shape_polygon.get_geojson_feature({
                        "id":
                        area_id + area_id_number,
                        "name":
                        area_name,
                        "KPIs":
                        geojson_KPIs,
                        "dist_KPIs":
                        geojson_dist_kpis
                    }))
            area_shape = shape_multipolygon
        if isinstance(area_geometry, esdl.WKT):
            shape_wkt = Shape.create(area_geometry)
            area_list.append(
                shape_wkt.get_geojson_feature({
                    "id": area_id,
                    "name": area_name,
                    "KPIs": geojson_KPIs
                }))
            area_shape = shape_wkt
    else:
        if area_id and area_scope.name != 'UNDEFINED':
            if is_valid_boundary_id(area_id):
                # print('Retrieve boundary from boundary service')
                boundary_wgs = BoundaryService.get_instance(
                ).get_boundary_from_service(boundaries_year, area_scope,
                                            str.upper(area_id))
                if boundary_wgs:
                    sh = Shape.parse_geojson_geometry(boundary_wgs['geom'])
                    num_sub_polygons = len(sh.shape.geoms)
                    for i, pol in enumerate(sh.shape.geoms):
                        if num_sub_polygons > 1:
                            area_id_number = " ({} of {})".format(
                                i + 1, num_sub_polygons)
                        else:
                            area_id_number = ""
                        shape_polygon = Shape.create(pol)
                        # We still need to add the center of the area for the distribution KPI.
                        if area_KPIs:
                            for kpi in area_KPIs.kpi:
                                if isinstance(kpi, esdl.DistributionKPI):
                                    shape = sh
                                    geojson_dist_kpis[kpi.name]["location"] = [
                                        shape.shape.centroid.coords.xy[1][0],
                                        shape.shape.centroid.coords.xy[0][0]
                                    ]

                        area_list.append(
                            shape_polygon.get_geojson_feature({
                                "id":
                                area_id + area_id_number,
                                "name":
                                boundary_wgs['name'],
                                "KPIs":
                                geojson_KPIs,
                                "dist_KPIs":
                                geojson_dist_kpis
                            }))

                    area_shape = sh

    # assign random coordinates if boundary is given and area contains assets without coordinates
    # and gives assets within buildings a proper coordinate
    if area_shape:
        shape_dictionary[area_id] = area_shape
    # call this function even with area_shape == None, to position building assets inside a building
    update_asset_geometries_shape(this_area, area_shape)

    potentials = this_area.potential
    for potential in potentials:
        potential_geometry = potential.geometry
        potential_name = potential.name
        if not potential_name:
            potential_name = ""
        if potential_geometry:
            if isinstance(potential_geometry, esdl.WKT):
                shape = Shape.create(potential_geometry)
                pot_list.append(
                    shape.get_geojson_feature({
                        "id": potential.id,
                        "name": potential_name,
                    }))
                shape_dictionary[potential.id] = shape

    for area in this_area.area:
        find_area_info_geojson(area_list, pot_list, area, shape_dictionary)