Skip to contents

This document describes the electricity transmission network data, stored in the IDEEA repository. It includes the existing capacity, aggregated to fit the for 5-region model case, and the information for potential expansion of the network for both, 5-region and 32-region model cases. The stored data on new transmission lines is estimated based on the geographical distance between regions, average efficiency and the cost of building new lines.

Modeling electricity transmission in capacity expansion models is simplified by the use of a linearized nature of the models. Instead of focusing on the physical laws of electricity transmission, the main question in capacity expansion models is on potential of trade between regions, if spatial balancing of electricity supply and demand can reduce overall system costs, increase efficiency, and reduce emissions. Every transmission line is a separate technology or process that can be selected for investment and sized by the model along with other technological options and their locations.

The transmission network is represented by a set of transmission lines, each connecting two regions. The transmitted energy is limited by the capacity of the line, which includes pre-built capacity and potential new capacity (with optional constraint).

5-region model

code
regN <- "reg5"

ideea_r5_sf <- get_ideea_map(nreg = 5, islands = FALSE, offshore = FALSE)

transmission_lines <- ideea_data$transmission[[regN]]
  # filter(region.x != region.y)
  # filter(case == transmission_matrix, !is.na(MW)) |>
  # filter(MW >= 0)

gis_mainland_sf <- filter(ideea_r5_sf, offshore == F)
points_coord_r5 <- st_centroid(gis_mainland_sf) |>
  st_coordinates() |>
  as.data.frame() |>
  cbind(data.frame(region = gis_mainland_sf[[regN]])) |>
  rename(lon = X, lat = Y)

network_r5 <- transmission_lines |>
  # filter(case == "current") |>
  left_join(points_coord_r5, by = c("region.x" = "region")) |>
  left_join(points_coord_r5, by = c("region.y" = "region")) |>
  mutate(GW = MW / 1000) |>
  rowwise() |>
  mutate(
    # rough estimate of transmission lines distance between two nodes
    distance_km = st_distance(
      # length in meters
      st_sfc(st_point(c(lon.x, lat.x)), crs = 4326),
      st_sfc(st_point(c(lon.y, lat.y)), crs = 4326)
      ),
    # adding 15% to the distance for landscape
    distance_km = round(1.15 * as.numeric(distance_km) / 1e3),
    AC_eff = 1 / (1 + 0.1 * distance_km / 1e3), # ~10% loss per 1000 km 
    AC_invcost = 2 * distance_km, # ~ 2 cr.INR/GW/km
    DC_eff = 1 / (1 + 0.02 * distance_km / 1e3), # ~2% loss per 1000 km
    DC_invcost = 4 * distance_km # ~ 4 cr.INR/GW/km + converters
  ) |>
  # add names for transmission lines
  mutate(
    trd_name_ac = paste("HVAC", region.x, region.y, sep = "_"),
    trd_name_dc = paste("HVDC", region.x, region.y, sep = "_")
    ) |>
  as.data.table()

# create plot for each case
plot_ntw_r5 <- ggplot() +
  geom_sf(data = ideea_r5_sf, fill = "wheat") +
  geom_segment(
    aes(
      x = lon.x, y = lat.x, xend = lon.y, yend = lat.y,
      linewidth = GW
    ),
    color = "dodgerblue", lineend = "round",
    data = network_r5
    # data = filter(a, case %in% transmission_matrix)
  ) +
  # geom_segment(aes(x = lon.x, y = lat.x, xend = lon.y, yend = lat.y),
  #   color = alpha("white", .5), lineend = "round",
  #   data = filter(a, case == "new")
  # ) +
  facet_wrap(~case) +
  geom_point(aes(lon, lat), data = points_coord_r5, color = "red") +
  labs(x = "", y = "") +
  theme_ideea_map()

32-region model

The cost of building new lines is a function of the distance between regions and the capacity of the line.

code
regN <- "reg32"

ideea_r32_sf <- get_ideea_map(nreg = 32, islands = FALSE, offshore = FALSE)

transmission_lines <- ideea_data$transmission[[regN]] 
  # filter(case == transmission_matrix, !is.na(MW)) |>
  # filter(MW >= 0)

gis_mainland_sf <- filter(ideea_r32_sf, offshore == F)
points_coord_r32 <- st_centroid(gis_mainland_sf) |>
  st_coordinates() |>
  as.data.frame() |>
  cbind(data.frame(region = gis_mainland_sf[[regN]])) |>
  rename(lon = X, lat = Y)

network_r32 <- transmission_lines |>
  # filter(case == "current") |>
  left_join(points_coord_r32, by = c("region.x" = "region")) |>
  left_join(points_coord_r32, by = c("region.y" = "region")) |>
  mutate(GW = MW / 1000) |>
  rowwise() |>
  mutate(
    # rough estimate of transmission lines distance between two nodes
    distance_km = st_distance(
      # length in meters
      st_sfc(st_point(c(lon.x, lat.x)), crs = 4326),
      st_sfc(st_point(c(lon.y, lat.y)), crs = 4326)
      ),
    # adding 15% to the distance for landscape
    distance_km = round(1.15 * as.numeric(distance_km) / 1e3),
    AC_eff = 1 / (1 + 0.1 * distance_km / 1e3), # ~10% loss per 1000 km 
    AC_invcost = 2 * distance_km, # ~ 2 cr.INR/GW/km
    DC_eff = 1 / (1 + 0.02 * distance_km / 1e3), # ~2% loss per 1000 km
    DC_invcost = 4 * distance_km # ~ 4 cr.INR/GW/km + converters
  ) |>
  # add names for transmission lines
  mutate(
    trd_name_ac = paste("HVAC", region.x, region.y, sep = "_"),
    trd_name_dc = paste("HVDC", region.x, region.y, sep = "_")
    ) |>
  as.data.table()

# create plot for each case
plot_ntw_r32 <- ggplot() +
  geom_sf(data = ideea_r32_sf, fill = "wheat") +
  geom_segment(
    aes(
      x = lon.x, y = lat.x, xend = lon.y, yend = lat.y
      # linewidth = GW
    ),
    linewidth = 1,
    color = "dodgerblue", lineend = "round",
    data = network_r32
  ) +
  facet_wrap(~case) +
  geom_point(aes(lon, lat), data = points_coord_r32, color = "red") +
  labs(x = "", y = "") +
  theme_ideea_map()

Minimal network case

code