Fetch and concatenate population-weighted weather for all four TSO zones.
Loops the four German TSO zones in spotforecast2_safe.weather.locations.GERMAN_TSO_ZONE_CITIES order. For each zone, resolves its regional cities via spotforecast2_safe.weather.locations.locations_for_zone and fetches a population-weighted weather frame via spotforecast2_safe.weather.features.get_weather_features. Every zone’s columns are then suffixed __<zone_short> (the zone key with its load_ prefix stripped, e.g. 50hertz) and concatenated along the columns axis, in zone-registry order, giving a deterministic column layout.
Unused by the per-zone fetch itself (each zone supplies its own coordinates); kept for API symmetry with the single-point path and forwarded to get_weather_features as the fallback point (never exercised because locations is always given).
Optional override mapping zone key -> a sequence of spotforecast2_safe.weather.locations.WeatherLocation objects, forwarded to locations_for_zone for each zone.
GERMAN_TSO_ZONE_CITIES order. Both keep the native [start, | | | [Tuple](`typing.Tuple`)\[[pd](`pandas`).[DataFrame](`pandas.DataFrame`), [pd](`pandas`).[DataFrame](`pandas.DataFrame`)\] | cov_end] index (spans the forecast horizon).