169 lines
5.4 KiB
Markdown
169 lines
5.4 KiB
Markdown
## 1. Creating the City Model from a GeoJSON File
|
|
|
|
Start by using the `GeometryFactory` class to create a city model from a GeoJSON file. This class reads building geometries and attributes from the file and constructs a city model.
|
|
|
|
```python
|
|
city = GeometryFactory(
|
|
"geojson",
|
|
input_file,
|
|
height_field="height",
|
|
year_of_construction_field="contr_year",
|
|
function_field="function_c",
|
|
adjacency_field="adjacency",
|
|
function_to_hub=Dictionaries().montreal_function_to_hub_function
|
|
).city
|
|
```
|
|
|
|
- `"geojson"`: Specifies the format of the input file.
|
|
- `input_file`: The path to your GeoJSON file.
|
|
- `height_field="height"`: The attribute in the GeoJSON file that contains the building height.
|
|
- `year_of_construction_field="contr_year"`: The attribute for the building's year of construction.
|
|
- `function_field="function_c"`: The attribute for the building's function or usage.
|
|
- `adjacency_field="adjacency"`: The attribute indicating whether the building is attached or detached.
|
|
- `function_to_hub`: A dictionary that maps the building functions to standardized functions used by HUB.
|
|
|
|
The `city` object now contains all the buildings from the GeoJSON file with their associated attributes.
|
|
|
|
---
|
|
|
|
## 2. Enriching the City with Construction Details
|
|
|
|
Use the `ConstructionFactory` to enrich the city model with construction details and calculation of the thermal zones and total floor area.
|
|
|
|
```python
|
|
ConstructionFactory('nrcan', city).enrich()
|
|
```
|
|
|
|
- `'nrcan'`: Specifies the source of construction data, in this case, NRCan.
|
|
- `city`: The city model created in the previous step.
|
|
---
|
|
## 3. Assigning Energy Demands Using Archetypes
|
|
|
|
Finally, we assign energy demands to each building using the `ResultFactory` class and an archetype-based demand model. This basically maps buildings to predefined archetypes and assigning corresponding energy demand profiles.
|
|
|
|
```python
|
|
ResultFactory('archetypes', city, demand_file).enrich()
|
|
```
|
|
- `'archetypes'`: Specifies the handler we are using which in this case is archetype-based demand model.
|
|
- `city`: The city.
|
|
- `demand_file`: The path to the CSV file containing the archetype demand profiles.
|
|
---
|
|
|
|
## 4. Rules for Finding Archetypes and Assigning Demands
|
|
|
|
This mapping is based on the following building attributes:
|
|
|
|
- **Function**
|
|
- **Height**
|
|
- **Adjacency**: Whether the building is attached or is detached.
|
|
- **Year of Construction**
|
|
|
|
### **Mapping Rules**:
|
|
|
|
Based on the building's function, height, and adjacency:
|
|
|
|
- **Residential Buildings** ('residential', 'multifamily house', 'single family house'):
|
|
- **Single Family House**:
|
|
- Height less than 6 meters.
|
|
- Adjacency: 'detached'.
|
|
- `usage = 'Single Family'`.
|
|
- **Row House**:
|
|
- Height less than 6 meters.
|
|
- Adjacency: 'attached'.
|
|
- `usage = 'Row house'`.
|
|
- **Duplex/Triplex**:
|
|
- Height between 6 and 10 meters.
|
|
- Adjacency: 'detached'.
|
|
- `usage = 'Duplex/triplex'`.
|
|
- **Small MURBs** (Multi-Unit Residential Buildings):
|
|
- Height between 6 and 10 meters.
|
|
- Adjacency: 'attached'.
|
|
- `usage = 'Small MURBs'`.
|
|
- **Medium MURBs**:
|
|
- Height between 10 and 15 meters.
|
|
- `usage = 'Medium MURBs'`.
|
|
- **Large MURBs**:
|
|
- Height greater than 15 meters.
|
|
- `usage = 'Large MURBs'`.
|
|
|
|
- **Office Buildings** ('office', 'office and administration'):
|
|
- `usage = 'Office'`.
|
|
|
|
- **Commercial Buildings** ('commercial', 'retail shop without refrigerated food', 'retail shop with refrigerated food', 'stand alone retail', 'strip mall'):
|
|
- If adjacency is 'attached':
|
|
- `usage = 'Commercial attached'`.
|
|
- Else:
|
|
- `usage = 'Commercial detached'`.
|
|
|
|
#### Determine Building Vintage (`vintage`):
|
|
|
|
Based on the building's year of construction:
|
|
|
|
- **Pre-1947**:
|
|
- `year <= 1947`.
|
|
- `vintage = 'Pre 1947'`.
|
|
- **1947-1983**:
|
|
- `1947 < year <= 1983`.
|
|
- `vintage = '1947-1983'`.
|
|
- **1984-2010**:
|
|
- `1983 < year <= 2010`.
|
|
- `vintage = '1984-2010'`.
|
|
- **Post-2010**:
|
|
- `year > 2010`.
|
|
- `vintage = 'Post 2010'`.
|
|
|
|
Combine usage and vintage to create the key:
|
|
|
|
```python
|
|
archetype_key = f"{usage} {vintage}"
|
|
```
|
|
|
|
This key is used to look up the corresponding demand profiles in the archetype demand file.
|
|
|
|
---
|
|
|
|
### Assigning Demands:
|
|
|
|
1. **Lookup Demand Profiles**:
|
|
|
|
Using the `archetype_key`, retrieve the hourly demand profiles from the `demand_file`. Each archetype has associated hourly demands for different energy uses.
|
|
|
|
2. **Scale Demands by Floor Area**:
|
|
|
|
Multiply the demand values by the building's total floor area.
|
|
|
|
3. **Assign Demands to Building**:
|
|
|
|
Set the building's demand attributes:
|
|
|
|
```python
|
|
building.heating_demand = [value * area for value in demand['Heating']]
|
|
building.cooling_demand = [value * area for value in demand['Cooling']]
|
|
building.domestic_hot_water_heat_demand = [value * area for value in demand['DHW']]
|
|
building.appliances_electrical_demand = [value * area for value in demand['Equipment']]
|
|
building.lighting_electrical_demand = [value * area for value in demand['Lighting']]
|
|
```
|
|
|
|
---
|
|
|
|
### Example:
|
|
|
|
For a residential building with the following attributes:
|
|
- **Function**: 'residential'
|
|
- **Height**: 9 meters
|
|
- **Adjacency**: 'attached'
|
|
- **Year of Construction**: 1986
|
|
|
|
#### **Mapping Steps**:
|
|
|
|
1. **Usage**:
|
|
- Height is between 6 and 10 meters.
|
|
- Adjacency is 'attached'.
|
|
- Therefore, `usage = 'Small MURBs'`.
|
|
|
|
2. **Vintage**:
|
|
- Year is 1986, which falls in 1984-2010.
|
|
- Therefore, `vintage = '1984-2010'`.
|
|
|
|
3. **Archetype Key**:
|
|
- `archetype_key = 'Small MURBs 1984-2010'`. |