Example

Use Case full example: Castilla y León (NUTS2 ES41)

The purpose of this example is the validation of the results obtained with the developed solar power model by comparing the estimated time-series of annual energy generation in large Photovoltaic (PV) plants on hourly basis for all the NUTS2 regions contained in Spanish Peninsular region (that means excluding Balearian and Canarian Islands and Ceuta y Melilla) with aggregated PV generation profile data provided also on hourly basis by Esios Red Eléctrica in this region for the year 2020.

Firstly, is established the power capacity installed in each NUTS2 region at the given time (2020). Data have been extracted from Red Eléctrica de España.

NUTS2

Autonomous community

Power (MWp)

ES61

Andalucía

2715

ES24

Aragón

1102

ES12

Asturias

1

ES61

Cantabria

2

ES42

Castilla La Mancha

1942

ES41

Castilla León

847

ES51

Cataluña

289

ES30

Madrid

64

ES52

Valencia

365

ES43

Extremadura

2526

ES11

Galicia

18

ES23

La Rioja

99

ES62

Murcia

1272

ES22

Navarra

170

ES21

País Vasco

51

The most suitable available areas in each NUTS3 region of the autonomous communities are established categorizing by intervals of 100W/m2.

The solar power model provides time-series of annual energy electrical generation at NUTS3 level for each autonomous community considering the tracking systems percentage 30% and fixed system percentage 70% as it is indicated in International Technology Roadmap for Photovoltaics (ITRPV) for 2020.

Finally, the energy generation profiles at NUTS3 level are aggregated at Peninsular data level.

Regarding the results, the ratio between the simulated annual generation and the provided by the profile extracted from Esios Red Eléctrica is 99.94%.

iDesignRes peninsular

Esios peninsular

Anual generation (GWh)

14933,53412

14924,59061

99,94%

Execution

The Solar Energy Model uses two main types of input data:

  • Parameters defined in the input.json file.

  • Radiation data obtained from a prior geoprocessing step, stored in a CSV file.

Radiation data is obtained from a previous geoprocessing operation combining several layers, such as global incident solar radiation (GHI), soil and environmental protection, land use and slope, to identify the most suitable areas for installation, excluding those where it is not possible to do so.

This process provides a CSV file that will be used as input for the solar generation model for large plants. In this case, the analysis is carried out at the NUTS3 region level to consider possible changes in terrain and radiation.

The generated CSV provides, for each NUTS3 region, the distribution of available area according to solar radiation levels, starting from 700 kWh/m²·year (value previously defined as a threshold).

It provides the information about:

  • Where suitable surfaces are.

  • How much area they represent, and

  • What level of solar radiation they receive.

Each row in the CSV corresponds to:

  • One NUTS3 region, and

  • One radiation band (e.g., 700–800, 800–900, …).

Column

Description

Units / Type

Region

NUTS3 code of the subregion

Text

Centroid_X, Centroid_Y

Longitude and latitude of the region centroid

Degrees (EPSG:4326)

Total_Area

Total geometric area of the region

Max_Radiation

Maximum radiation value within the region

kWh/m²·year

Average_Radiation

Mean radiation value within the region

kWh/m²·year

Threshold

Lower limit of the radiation band (700, 800, 900, …)

Numeric

Area_m2

Area (m²) within that radiation band [Threshold, Threshold+100) that meets all filters (valid land use, non-protected, slope below threshold)

Median_Radiation

Median radiation value within that band

kWh/m²·year

Median_Radiation_X, Median_Radiation_Y

Coordinates (lon/lat) of the pixel closest to the median radiation value

Degrees (EPSG:4326)

To interpret it, each row represents a solar potential band within a NUTS3 region. For example:

Region = ES123, Threshold = 800, Area_m2 = 1,250,000, Median_Radiation = 845

In region ES123, there are 1.25 km² of usable area with solar radiation between 800 and 900 kWh/m²·year, and the median value of that band is 845 kWh/m²·year.

Regarding the information contained in the input.json file, it defines the execution scenario as follows:

{
        "nutsid": "ES41",
        "slope_angle": 10,
        "area_total_thermal":  null,
        "area_total_pv": null,
        "power_thermal": 10,
        "power_pv": 200,
        "capex_thermal": null,
        "capex_pv": null,
        "tilt": 30,
        "azimuth": 180,
        "loss": 14,
        "tracking_percentage": 60,
        "efficiency_thermal": 45,
        "efficiency_optical": 65,
        "aperture":50,
        "system_cost_thermal": 5,
        "system_cost_pv": 0.5,
        "opex_thermal": 20000,
        "opex_pv": 15000,
        "min_ghi_thermal": 1700,
        "min_ghi_pv": 1000,
        "land_use_thermal": 50,
        "land_use_pv": 100,
        "convert_coord": 1,
        "pvgis_year": 2019
}

To facilitate the adjustment of scenario values, the set of editable properties and their possible values ​​are described below as a data dictionary:

- nutsid: text -> Identifier of NUTS2 region for which the analysis will be carried out.
- slope_angle: integer between 0 and 360 -> Maximum slope angle in º with which a land area can be considered suitable for PV.
- area_total_thermal: null, or integer between 0 and 10000000000 -> Area in m2 to deploy CSP technology.
- area_total_pv: null, or integer between 0 and 10000000000 -> Area in m2 to deploy PV technology.
- power_thermal: null, or integer between 0 and 1000000000000 -> CSP power capacity in MW to be deployed.
- power_pv: null, or integer between 0 and 1000000000000 -> PV power capacity in MW to be deployed.
- capex_thermal: null, or integer between 0 and 500000000000 -> Investment in € to deploy CSP technology.
- capex_pv: null, or integer between 0 and 500000000000 -> Investment in € to deploy PV technology.
- tilt: integer between 0 and 90 -> Tilt angle in º from horizontal plane.
- azimuth: integer between 0 and 360 -> Orientation (azimuth angle) of the (fixed) plane of array. Clockwise from north.
- tracking_percentage: integer between 0 and 100 -> Percentage in % of single-axis tracking systems from the total PV capacity. The rest is considered fixed mounted systems.
- loss: integer between 8 and 20 -> Percentage in % of power losses of PV systems. Please read the documentation to understand which other losses are already included in the model.
- efficiency_thermal: integer between 25 and 65 -> Thermal efficiency in % of collectors of CSP systems.
- efficiency_optical: integer between 45 and 85 -> Amount of incoming solar radiation in % captured in the collectors of CSP systems.
- aperture: integer between 25 and 75 -> Aperture area in % of solar field of CSP systems.
- system_cost_thermal: decimal number between 1 and 10 -> CAPEX in €/W of CSP technology to compute CSP power capacity to be installed from a given investment.
- system_cost_pv: decimal number between 0.2 and 1 -> CAPEX in €/W of PV technology to compute PV power capacity to be installed from a given investment.
- opex_thermal: decimal number between 0 and 40000 -> Annual Operational Expenditures in €/MW for CSP technology.
- opex_pv: decimal number between 0 and 30000 -> Annual Operational Expenditures in €/MW for PV technology.
- min_ghi_thermal: integer between 1500 and 2500 -> Minimum annual Global Horizontal Irradiance in kWh/m2 in a land area to install CSP systems.
- min_ghi_pv: integer between 500 and 2000 -> Minimum annual Global Horizontal Irradiance in kWh/m2 in a land area to install PV systems.
- land_use_thermal: integer between 25 and 100 -> Land use ratio of CSP technology in W/m2 to compute required area for a given CSP power capacity.
- land_use_pv: integer between 50 and 200 -> Land use ratio of PV technology in W/m2 to compute required area for a given PV power capacity.
- convert_coord: integer with the value 0 (False) or 1 (True) -> Convert coordinates expressed into EPSG:3035 to EPSG:4326.
- pvgis_year: integer between 1900 and 2020 -> Year for calculate time-series hourly production.

Assuming that the model is already installed with Poetry, execute the command:

poetry run python solar_power_plants.py <input_payload> <start_time> <end_time>

Let’s suppose that the information to be obtained corresponds to the period between 1:00 p.m. on March 1, 2019, and 1:00 p.m. on March 2, 2019. The <start_time> and <end_time> parameters will have the values:

2019-03-01T13:00:00    :    start_time

2019-03-02T13:00:00    :    end_time

This command automatically runs the simulation, taking the necessary input data from the usecases folder and the input.json file.

All input values ​​will be validated, and the user will be notified of those that do not comply with the scheme.

When the execution finishes, a result similar to the following is obtained:

{
        'time(UTC)': [
                Timestamp('2019-03-01 13:00:00'),
                Timestamp('2019-03-01 14:00:00'),
                Timestamp('2019-03-01 15:00:00'),
                Timestamp('2019-03-01 16:00:00'),
                Timestamp('2019-03-01 17:00:00'),
                Timestamp('2019-03-01 18:00:00'),
                Timestamp('2019-03-01 19:00:00'),
                Timestamp('2019-03-01 20:00:00'),
                Timestamp('2019-03-01 21:00:00'),
                Timestamp('2019-03-01 22:00:00'),
                Timestamp('2019-03-01 23:00:00'),
                Timestamp('2019-03-02 00:00:00'),
                Timestamp('2019-03-02 01:00:00'),
                Timestamp('2019-03-02 02:00:00'),
                Timestamp('2019-03-02 03:00:00'),
                Timestamp('2019-03-02 04:00:00'),
                Timestamp('2019-03-02 05:00:00'),
                Timestamp('2019-03-02 06:00:00'),
                Timestamp('2019-03-02 07:00:00'),
                Timestamp('2019-03-02 08:00:00'),
                Timestamp('2019-03-02 09:00:00'),
                Timestamp('2019-03-02 10:00:00'),
                Timestamp('2019-03-02 11:00:00'),
                Timestamp('2019-03-02 12:00:00'),
                Timestamp('2019-03-02 13:00:00')
        ],
        'Pthermal': [
                10.1687625,
                9.33894,
                16.177590000000002,
                12.6936225,
                9.50508,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.1325025,
                0.3782025,
                9.373747500000002,
                6.5236275,
                3.989115,
                7.725802
        ],
        'Ppv': [
                124.5796,
                124.91560000000001,
                118.5708,
                106.6472,
                71.9428,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.004,
                79.44319999999999,
                103.268,
                123.5084,
                126.40599999999999,
                119.2748,
                125.531
        ]
}