Source code for dragonfly_energy.opendss.substation

# coding=utf-8
"""Electrical substation in OpenDSS."""
from .._base import _GeometryBase

from ladybug_geometry.geometry2d.polygon import Polygon2D
from dragonfly.projection import polygon_to_lon_lat


[docs]class Substation(_GeometryBase): """Represents a substation in OpenDSS. Args: identifier: Text string for a unique electrical substation ID. Must contain only characters that are acceptable in OpenDSS. This will be used to identify the object across the exported geoJSON and OpenDSS files. geometry: A Polygon2D representing the geometry of the electrical substation. Properties: * identifier * display_name * geometry """ __slots__ = () def __init__(self, identifier, geometry): """Initialize Substation.""" _GeometryBase.__init__(self, identifier) # process the identifier assert isinstance(geometry, Polygon2D), 'Expected ladybug_geometry ' \ 'Polygon2D for Substation geometry. Got {}'.format(type(geometry)) self._geometry = geometry
[docs] @classmethod def from_dict(cls, data): """Initialize a Substation from a dictionary. Args: data: A dictionary representation of an Substation object. """ # check the type of dictionary assert data['type'] == 'Substation', 'Expected Substation ' \ 'dictionary. Got {}.'.format(data['type']) geo = Polygon2D.from_dict(data['geometry']) trans = cls(data['identifier'], geo) if 'display_name' in data and data['display_name'] is not None: trans.display_name = data['display_name'] return trans
[docs] @classmethod def from_rnm_geojson_dict( cls, data, origin_lon_lat, conversion_factors): """Get a Substation from a dictionary as it appears in an RNM GeoJSON. Args: data: A GeoJSON dictionary representation of an Substation feature. origin_lon_lat: An array of two numbers in degrees. The first value represents the longitude of the scene origin in degrees (between -180 and +180). The second value represents latitude of the scene origin in degrees (between -90 and +90). Note that the "scene origin" is the (0, 0) coordinate in the 2D space of the input polygon. conversion_factors: A tuple with two values used to translate between meters and longitude, latitude. """ geo = cls._geojson_coordinates_to_polygon2d( data['geometry']['coordinates'], origin_lon_lat, conversion_factors) return cls(data['properties']['Code'], geo)
@property def geometry(self): """Get a Polygon2D representing the substation.""" return self._geometry
[docs] def to_dict(self): """Substation dictionary representation.""" base = {'type': 'Substation'} base['identifier'] = self.identifier base['geometry'] = self.geometry.to_dict() if self._display_name is not None: base['display_name'] = self.display_name return base
[docs] def to_geojson_dict(self, origin_lon_lat, conversion_factors): """Get Substation dictionary as it appears in an URBANopt geoJSON. Args: origin_lon_lat: An array of two numbers in degrees. The first value represents the longitude of the scene origin in degrees (between -180 and +180). The second value represents latitude of the scene origin in degrees (between -90 and +90). Note that the "scene origin" is the (0, 0) coordinate in the 2D space of the input polygon. conversion_factors: A tuple with two values used to translate between meters and longitude, latitude. """ pts = [(pt.x, pt.y) for pt in self.geometry.vertices] coords = [polygon_to_lon_lat(pts, origin_lon_lat, conversion_factors)] coords[0].append(coords[0][0]) return { 'type': 'Feature', 'properties': { 'id': self.identifier, 'geometryType': 'Rectangle', 'name': self.display_name, 'type': 'District System', 'footprint_area': round(self.geometry.area, 1), 'footprint_perimeter': round(self.geometry.perimeter, 1), 'district_system_type': 'Electrical Substation', }, 'geometry': { 'type': 'Polygon', 'coordinates': coords } }
def __copy__(self): new_con = Substation(self.identifier, self.geometry) new_con._display_name = self._display_name return new_con def __repr__(self): return 'Substation: {}'.format(self.display_name)