Exemplo n.º 1
0
        protected override void RunChartMaking()
        {
            var slice         = Constants.PresentSlice;
            var dbSrcProfiles = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice);
            var bkws          = dbSrcProfiles.Fetch <BkwProfile>();
            var bkw           = bkws[0];
            var rlms          = dbSrcProfiles.Fetch <RlmProfile>();
            var emptyArr      = new double[rlms[0].Profile.Values.Count];
            var allRlmsVals   = new List <double>();

            allRlmsVals.AddRange(emptyArr);
            var allLocalElectricityVals = new List <double>();

            allLocalElectricityVals.AddRange(emptyArr);
            var allLocalElectricity = new Profile("Locally Generated", allLocalElectricityVals.AsReadOnly(), EnergyOrPower.Power);
            var allRlms             = new Profile("All RLMs", allRlmsVals.AsReadOnly(), EnergyOrPower.Power);

            foreach (var rlm in rlms)
            {
                Profile profile = new Profile(rlm.Name, rlm.Profile.Values, rlm.Profile.EnergyOrPower);
                var     onlyPos = profile.GetOnlyPositive(rlm.Name);

                if (onlyPos.Values.Sum() > 1)
                {
                    allRlms = allRlms.Add(onlyPos, "all Rlms");
                }
                else
                {
                    var onlyNeg = profile.GetOnlyNegative(rlm.Name);
                    allLocalElectricity = allLocalElectricity.Add(onlyNeg, "Locally Generated");
                }
            }

            var bkwProfile = new Profile(bkw.Profile);

            allLocalElectricity = allLocalElectricity.MultiplyWith(-1, "Locally Generated");
            var          residual             = bkwProfile.Minus(allRlms, "Residual");
            const double fac                  = 1_000_000;
            var          rlmTotal             = allRlms.EnergySum() / fac;
            var          bkwTotal             = bkwProfile.EnergySum() / fac;
            var          localGenerationTotal = allLocalElectricity.EnergySum() / fac;
            var          cityTotal            = localGenerationTotal + bkwTotal;
            var          residualTotal        = residual.EnergySum() / fac + localGenerationTotal;
            var          arrows               = new List <SingleSankeyArrow>();
            var          ssa1                 = new SingleSankeyArrow("Erzeugung", 500, MyStage, SequenceNumber, Name, slice, Services);

            ssa1.AddEntry(new SankeyEntry("Lokale Erzeugung", localGenerationTotal, 200, Orientation.Up));
            ssa1.AddEntry(new SankeyEntry("BKW", bkwTotal, 200, Orientation.Straight));
            ssa1.AddEntry(new SankeyEntry("Burgdorf Strom [GWh]", cityTotal * -1, 200, Orientation.Straight));
            arrows.Add(ssa1);
            var ssa2 = new SingleSankeyArrow("Verbrauch", 500, MyStage, SequenceNumber, Name, slice, Services);

            ssa2.AddEntry(new SankeyEntry("", cityTotal, 200, Orientation.Straight));
            ssa2.AddEntry(new SankeyEntry("Residual", residualTotal * -1, 200, Orientation.Up));
            ssa2.AddEntry(new SankeyEntry("RLM", rlmTotal * -1, 200, Orientation.Straight));
            arrows.Add(ssa2);

            Services.PlotMaker.MakeSankeyChart(arrows);
            MakeBarCharts(allRlms, residual, allLocalElectricity);
        }
        protected override void MakeVisualization([NotNull] ScenarioSliceParameters slice, bool isPresent)
        {
            var dbHouse   = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice);
            var houses    = dbHouse.Fetch <House>();
            var pvSystems = dbHouse.Fetch <PvSystemEntry>();

            MakePvSystemSankey();
            MakePVMap();
            MakePvSystemComparison();

            void MakePvSystemSankey()
            {
                var ssa = new SingleSankeyArrow("HousePVSystems", 1500, MyStage, SequenceNumber, Name, slice, Services);

                ssa.AddEntry(new SankeyEntry("Houses", houses.Count, 5000, Orientation.Straight));
                var count = pvSystems.Count;

                ssa.AddEntry(new SankeyEntry("PVSystems", count * -1, 2000, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Kein PV", (houses.Count - count) * -1, 2000, Orientation.Straight));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakePvSystemComparison()
            {
                var          ssa = new SingleSankeyArrow("RealPVSystemsVsPotential", 50, MyStage, SequenceNumber, Name, slice, Services);
                var          houseGuidsWithPV   = pvSystems.Select(x => x.HouseGuid).ToList();
                var          potentials         = dbHouse.Fetch <PVPotential>();
                var          relevantPotentials = potentials.Where(x => houseGuidsWithPV.Contains(x.HouseGuid)).ToList();
                const double fac             = 1_000_000;
                var          potentialEnergy = relevantPotentials.Sum(x => x.SonnendachStromErtrag) / fac;
                var          installedEnergy = pvSystems.Sum(x => x.EffectiveEnergyDemand) / fac;

                ssa.AddEntry(new SankeyEntry("Sonnendach Potential auf Häusern mit PV", potentialEnergy, 20, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Installed", installedEnergy * -1, 20, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Verschwendetes Potential", (potentialEnergy - installedEnergy) * -1, 20, Orientation.Down));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakePVMap()
            {
                RGB GetColor(House h)
                {
                    if (pvSystems.Any(x => x.HouseGuid == h.Guid))
                    {
                        return(Constants.Red);
                    }

                    return(Constants.Black);
                }

                var mapPoints = houses.Select(x => x.GetMapPoint(GetColor)).ToList();

                var filename      = MakeAndRegisterFullFilename("PVSystems.svg", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("PV", Constants.Red)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }
        }
Exemplo n.º 3
0
        private SingleSankeyArrow MakeArr1([ItemNotNull][NotNull] List <BuildingComplex> complexes)
        {
            var slice = Constants.PresentSlice;
            //write python
            var arr1    = new SingleSankeyArrow("komplexe", 1000, MyStage, SequenceNumber, Name, slice, Services);
            var sources = complexes.Select(x => x.SourceOfThisEntry).Distinct().ToList();
            var length  = 2000;

            foreach (var entry in sources)
            {
                var count = complexes.Count(x => x.SourceOfThisEntry == entry);
                if (count > 3000)
                {
                    arr1.AddEntry(new SankeyEntry(entry.ToString(), count, length, Orientation.Straight));
                }
                else
                {
                    arr1.AddEntry(new SankeyEntry(entry.ToString(), count, length, Orientation.Up));
                }

                length += 2000;
            }

            arr1.AddEntry(new SankeyEntry("Komplexe", complexes.Count * -1, 1000, Orientation.Straight));
            return(arr1);
        }
        protected override void RunChartMaking()
        {
            var slice                = Constants.PresentSlice;
            var dbHouse              = SqlConnection.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice).Database;
            var houses               = dbHouse.Fetch <House>();
            var airconditioing       = dbHouse.Fetch <AirconditioningEntry>();
            var airConditioningGuids = airconditioing.Select(x => x.HouseGuid).Distinct().ToList();

            MakeAirConditioningSankeySankey();
            MakeAirConditioningMap();

            void MakeAirConditioningSankeySankey()
            {
                var ssa = new SingleSankeyArrow("AirConditioingHouses", 1500, MyStage, SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Houses", houses.Count, 5000, Orientation.Straight));
                var housesWithLight = airConditioningGuids.Count;

                ssa.AddEntry(new SankeyEntry("Klimatisierung", housesWithLight * -1, 2000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Sonstige Häuser", (houses.Count - housesWithLight) * -1, 2000, Orientation.Up));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeAirConditioningMap()
            {
                RGBWithSize GetColor(House h)
                {
                    var ace = airconditioing.FirstOrDefault(x => x.HouseGuid == h.HouseGuid);

                    if (ace == null)
                    {
                        return(new RGBWithSize(Constants.Black, 10));
                    }

                    if (ace.AirConditioningType == AirConditioningType.Commercial)
                    {
                        return(new RGBWithSize(Constants.Red, 20));
                    }

                    if (ace.AirConditioningType == AirConditioningType.Industrial)
                    {
                        return(new RGBWithSize(Constants.Blue, 20));
                    }

                    throw new Exception("Unbekannte Klimatisierung");
                }

                var mapPoints = houses.Select(x => x.GetMapPointWithSize(GetColor, House.CoordsToUse.Localnet)).ToList();

                var filename      = MakeAndRegisterFullFilename("Klimatisierung.svg", Name, "", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("Klimatisierung (GHD)", Constants.Red),
                    new MapLegendEntry("Klimatisierung (Industrie)", Constants.Blue),
                    new MapLegendEntry("Keine Klimatisierung", Constants.Black)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries, MyStage);
            }
        }
        private void MakeHouseKey([NotNull][ItemNotNull] List <House> houses, [NotNull][ItemNotNull] List <BuildingComplex> complexes, [NotNull] ScenarioSliceParameters slice)
        {
            var ssa = new SingleSankeyArrow("HouseSankey", 1000, MyStage,
                                            SequenceNumber, Name, slice, Services);

            ssa.AddEntry(new SankeyEntry("Complexes", complexes.Count, 5000, Orientation.Straight));
            ssa.AddEntry(new SankeyEntry("Houses", houses.Count * -1, 5000, Orientation.Straight));
            ssa.AddEntry(new SankeyEntry("Ignored", (complexes.Count - houses.Count) * -1, 5000, Orientation.Straight));
            Services.PlotMaker.MakeSankeyChart(ssa);
        }
Exemplo n.º 6
0
        protected override void RunChartMaking()
        {
            var slice   = Constants.PresentSlice;
            var dbHouse = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice);
            var houses  = dbHouse.Fetch <House>();
            //var businesses = dbHouse.Fetch<BusinessEntry>();
            var incoming = dbHouse.Fetch <IncomingCommuterEntry>();

            MakeCommuterSankey();
            MakeCommuterMap();

            void MakeCommuterSankey()
            {
                var ssa = new SingleSankeyArrow("IncomingComuters", 1500, MyStage,
                                                SequenceNumber, Name, slice, Services);

                ssa.AddEntry(new SankeyEntry("Arbeiter", incoming.Count, 5000, Orientation.Straight));
                var workersFromOutside  = incoming.Count(x => x.DistanceInKm > 0);
                var workersFromBurgdorf = incoming.Count(x => Math.Abs(x.DistanceInKm) < 0.000001);

                ssa.AddEntry(new SankeyEntry("Pendler nach Burgdorf", workersFromOutside * -1, 2000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Arbeiter in Burgdorf", workersFromBurgdorf * -1, 2000, Orientation.Up));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeCommuterMap()
            {
                RGBWithSize GetColor(House h)
                {
                    var incomingCount = incoming.Count(x => x.HouseGuid == h.Guid);

                    if (incomingCount > 0)
                    {
                        return(new RGBWithSize(Constants.Red, incomingCount + 10));
                    }

                    return(new RGBWithSize(Constants.Black, 10));
                }

                var mapPoints = houses.Select(x => x.GetMapPointWithSize(GetColor)).ToList();

                var filename      = MakeAndRegisterFullFilename("Employees.svg", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("Betrieb mit Angestellten", Constants.Red),
                    new MapLegendEntry("Keine Angestellten", Constants.Black)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }
        }
        protected override void RunChartMaking()
        {
            var dbComplex = SqlConnection.GetDatabaseConnection(Stage.Complexes, Constants.PresentSlice).Database;
            var complexes = dbComplex.Fetch <BuildingComplex>();

            MakeLocalnetCoordSankey(Constants.PresentSlice);

            void MakeLocalnetCoordSankey(ScenarioSliceParameters slice)
            {
                var ssa = new SingleSankeyArrow("ComplexesWithLocalnetCoords", 1000,
                                                MyStage, SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Complexes", complexes.Count, 5000, Orientation.Straight));
                var complexesWithBoth         = complexes.Count(x => x.LocalnetCoords.Count > 0 && x.Coords.Count > 0);
                var complexesWithOnlyLocalnet = complexes.Count(x => x.LocalnetCoords.Count > 0 && x.Coords.Count == 0);
                var complexesWithOnlyGWR      = complexes.Count(x => x.LocalnetCoords.Count == 0 && x.Coords.Count > 0);
                var complexesWithNone         = complexes.Count(x => x.LocalnetCoords.Count == 0 && x.Coords.Count == 0);

                ssa.AddEntry(new SankeyEntry("GWR & Localnet", complexesWithBoth * -1, 2000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("GWR ", complexesWithOnlyGWR * -1, 2000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Localnet Daten Verfügbar", complexesWithOnlyLocalnet * -1, 2000, Orientation.Down));
                ssa.AddEntry(new SankeyEntry("none  ", complexesWithNone * -1, 2000, Orientation.Down));
                Services.PlotMaker.MakeSankeyChart(ssa);

                /*
                 * RGB GetColor(House h)
                 * {
                 *  if (h.GebäudeObjectIDs.Count > 0 && h.TotalSolarEnergyPotential > 0)
                 *  {
                 *      return new RGB(255, 0, 0);
                 *  }
                 *
                 *  if (h.GebäudeObjectIDs.Count > 0)
                 *  {
                 *      return new RGB(0, 0, 255);
                 *  }
                 *  return new RGB(0, 255, 0);
                 *
                 * }
                 * var mapPoints = complexes.Select(x => x.GetMapPoint(GetColor)).ToList();
                 * var filename = MakeAndRegisterFullFilename("MapPVWithLocalnet.svg", Name, "");
                 * List<MapLegendEntry> legendEntries = new List<MapLegendEntry>();
                 * legendEntries.Add(new MapLegendEntry("Localnet und Solar", 255, 0, 0));
                 * legendEntries.Add(new MapLegendEntry("Localnet", 0, 0, 255));
                 * legendEntries.Add(new MapLegendEntry("Rest", 0, 255, 0));
                 * Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
                 */
            }
        }
Exemplo n.º 8
0
        protected override void RunChartMaking()
        {
            var slice           = Constants.PresentSlice;
            var dbHouse         = SqlConnection.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice).Database;
            var houses          = dbHouse.Fetch <House>();
            var lights          = dbHouse.Fetch <StreetLightingEntry>();
            var lightHouseGuids = lights.Select(x => x.HouseGuid).Distinct().ToList();

            MakeLightSankey();
            MakeCommuterMap();

            void MakeLightSankey()
            {
                var ssa = new SingleSankeyArrow("LightingHouses", 1500, MyStage, SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Houses", houses.Count, 5000, Orientation.Straight));
                var housesWithLight = lightHouseGuids.Count;

                ssa.AddEntry(new SankeyEntry("Strassenbeleuchtungen", housesWithLight * -1, 2000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Sonstige Häuser", (houses.Count - housesWithLight) * -1, 2000, Orientation.Up));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeCommuterMap()
            {
                RGBWithSize GetColor(House h)
                {
                    if (lightHouseGuids.Contains(h.HouseGuid))
                    {
                        return(new RGBWithSize(Constants.Red, 20));
                    }

                    return(new RGBWithSize(Constants.Black, 10));
                }

                var mapPoints = houses.Select(x => x.GetMapPointWithSize(GetColor, House.CoordsToUse.Localnet)).ToList();

                var filename      = MakeAndRegisterFullFilename("Strassenbeleuchtung.svg", Name, "", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("Strassenbeleuchtung", Constants.Red),
                    new MapLegendEntry("Sonstiges", Constants.Black)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries, MyStage);
            }
        }
Exemplo n.º 9
0
        private void MakeTotalsSankey1([NotNull][ItemNotNull] List <CSVFile> csvs, [NotNull] ScenarioSliceParameters parameters)
        {
            string suffix          = csvs[0].GenerationOrLoad.ToString();
            var    ssa             = new SingleSankeyArrow("EnergyUseTotalVsRealizedInCSV" + suffix, 1000, MyStage, SequenceNumber, Name, parameters, Services);
            var    dbComplexEnergy = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.ComplexEnergyData, Constants.PresentSlice);
            var    monthlyElectricityUsePerStandorts =
                dbComplexEnergy.Fetch <double>("select YearlyElectricityUseNetz from " + nameof(MonthlyElectricityUsePerStandort));
            const int fac      = 1_000_000;
            var       totalSum = monthlyElectricityUsePerStandorts.Sum() / fac;

            var sumAssigned = csvs.Sum(x => x.CalculateTotalEnergy()) / fac;
            var sumMissing  = totalSum - sumAssigned;

            ssa.AddEntry(new SankeyEntry("Total Electricity", totalSum, 500, Orientation.Straight));
            ssa.AddEntry(new SankeyEntry("Fehlend", sumMissing * -1, 500, Orientation.Straight));
            ssa.AddEntry(new SankeyEntry("In Lastprofilen", sumAssigned * -1, 500, Orientation.Up));
            Services.PlotMaker.MakeSankeyChart(ssa);
        }
        protected override void RunChartMaking(ScenarioSliceParameters slice)
        {
            var dbDstHouses            = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice);
            var airConditioningEntries = dbDstHouses.Fetch <AirConditioningEntry>();
            var houses = dbDstHouses.Fetch <House>();

            MakeAcSystemEnergySankey();
            MakeAcSystemCountSankey();

            void MakeAcSystemEnergySankey()
            {
                var ssa1 = new SingleSankeyArrow("HouseAirConditioningEnergy", 60, MyStage, SequenceNumber, Name, slice, Services);

                double potentialForAirConditioning =
                    houses.Sum(x => x.EnergieBezugsFläche * slice.AirConditioningEnergyIntensityInKWhPerSquareMeter) / Constants.GWhFactor;
                double actualAirConditioningEnergy = airConditioningEntries.Sum(x => x.EffectiveEnergyDemand) / Constants.GWhFactor;

                ssa1.AddEntry(new SankeyEntry("Houses", potentialForAirConditioning, 60, Orientation.Straight));

                ssa1.AddEntry(new SankeyEntry("Houses without Airconditioning",
                                              (potentialForAirConditioning - actualAirConditioningEnergy) * -1,
                                              60,
                                              Orientation.Up));
                ssa1.AddEntry(new SankeyEntry("Houses with Airconditioning", actualAirConditioningEnergy * -1, 60, Orientation.Down));

                Services.PlotMaker.MakeSankeyChart(ssa1);
            }

            void MakeAcSystemCountSankey()
            {
                var ssa1 = new SingleSankeyArrow("HouseAirConditioningCount", 1500, MyStage, SequenceNumber, Name, slice, Services);

                ssa1.AddEntry(new SankeyEntry("Houses", houses.Count, 5000, Orientation.Straight));
                var airConditioningHouseGuids   = airConditioningEntries.Select(x => x.HouseGuid).Distinct().ToList();
                var housesWithoutAirconditioing = houses.Where(x => !airConditioningHouseGuids.Contains(x.Guid)).Distinct().ToList();

                ssa1.AddEntry(new SankeyEntry("Houses without Airconditioning", housesWithoutAirconditioing.Count * -1, 5000, Orientation.Up));
                ssa1.AddEntry(new SankeyEntry("Houses with Airconditioning", airConditioningHouseGuids.Count * -1, 5000, Orientation.Down));

                Services.PlotMaker.MakeSankeyChart(ssa1);
            }
        }
Exemplo n.º 11
0
        protected override void MakeVisualization([NotNull] ScenarioSliceParameters slice, bool isPresent)
        {
            var          dbHouse         = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice);
            List <House> houses1         = dbHouse.Fetch <House>();
            var          heatingsystems1 = dbHouse.Fetch <HeatingSystemEntry>();
            Dictionary <string, HeatingSystemEntry> heatingsystemsByGuid = new Dictionary <string, HeatingSystemEntry>();

            foreach (var hse in heatingsystems1)
            {
                heatingsystemsByGuid.Add(hse.HouseGuid, hse);
            }

            MakeHeatingSystemAnalysis();
            EnergyIntensityHistogram();
            MakeHeatingTypeIntensityMap();
            MakeHeatingTypeMap();
            MakeHeatingSystemSankey();
            HeatingSystemCountHistogram();
            MakeHeatingSystemMapError();
            MakeHeatingSystemMap();
            MakeFernwärmeTypeMap();
            if (isPresent)
            {
                PresentOnlyVisualisations(heatingsystemsByGuid, slice, houses1, dbHouse);
            }

            void MakeHeatingSystemAnalysis()
            {
                var filename = MakeAndRegisterFullFilename("analysis.csv", slice);
                var sw       = new StreamWriter(filename);

                sw.WriteLine("Original Heating system - Anzahl");
                foreach (HeatingSystemType hst in Enum.GetValues(typeof(HeatingSystemType)))
                {
                    var fs1 = heatingsystems1.Where(x => x.OriginalHeatingSystemType == hst).ToList();
                    sw.WriteLine(hst + ";" + fs1.Count);
                }

                sw.WriteLine("");
                sw.WriteLine("");
                sw.WriteLine("Original Heating system - Summe");
                foreach (HeatingSystemType hst in Enum.GetValues(typeof(HeatingSystemType)))
                {
                    var fs1 = heatingsystems1.Where(x => x.OriginalHeatingSystemType == hst).ToList();
                    sw.WriteLine(hst + ";" + fs1.Sum(x => x.EffectiveEnergyDemand));
                }

                sw.WriteLine("");
                sw.WriteLine("");

                sw.WriteLine("Target Anzahl");
                foreach (HeatingSystemType hst in Enum.GetValues(typeof(HeatingSystemType)))
                {
                    var fs1 = heatingsystems1.Where(x => x.SynthesizedHeatingSystemType == hst).ToList();
                    sw.WriteLine(hst + ";" + fs1.Count);
                }

                sw.WriteLine("");
                sw.WriteLine("");

                sw.WriteLine("Target Summe");
                foreach (HeatingSystemType hst in Enum.GetValues(typeof(HeatingSystemType)))
                {
                    var fs1 = heatingsystems1.Where(x => x.SynthesizedHeatingSystemType == hst).ToList();
                    sw.WriteLine(hst + ";" + fs1.Sum(x => x.EffectiveEnergyDemand));
                }

                sw.Close();
            }

            void EnergyIntensityHistogram()
            {
                var filename  = MakeAndRegisterFullFilename("EnergyIntensityHistogram.png", slice);
                var ages      = heatingsystems1.Select(x => x.CalculatedAverageHeatingEnergyDemandDensity).Where(y => y > 0).ToList();
                var barSeries = new List <BarSeriesEntry>();
                var h         = new Histogram(ages, 100);

                barSeries.Add(BarSeriesEntry.MakeBarSeriesEntry(h, out var colnames, "F0"));
                Services.PlotMaker.MakeBarChart(filename, "EnergyIntensityHistogram", barSeries, colnames);
                var xlsfilename    = MakeAndRegisterFullFilename("EnergyIntensity.xlsx", slice);
                var heatingSystems = heatingsystems1.Where(y => y.CalculatedAverageHeatingEnergyDemandDensityWithNulls != null).ToList();
                var rbDict         = new Dictionary <string, RowBuilder>();

                foreach (var hs in heatingSystems)
                {
                    int        bucket = (int)(Math.Floor(hs.CalculatedAverageHeatingEnergyDemandDensityWithNulls / 50 ?? 0) * 50);
                    string     key    = bucket.ToString();
                    string     et     = hs.EnergyType.ToString();
                    RowBuilder rb;
                    if (rbDict.ContainsKey(key))
                    {
                        rb = rbDict[key];
                    }
                    else
                    {
                        rb = RowBuilder.Start("Energieträger", key);
                        rbDict.Add(key, rb);
                    }

                    rb.AddToPossiblyExisting(et, 1);
                }
                RowCollection rc = new RowCollection("energy", "energy");

                foreach (var builder in rbDict)
                {
                    rc.Add(builder.Value);
                }
                RowCollection rc2 = new RowCollection("raw", "raw");

                foreach (var heatingSystemEntry in heatingsystems1)
                {
                    RowBuilder rb = RowBuilder.Start("Träger", heatingSystemEntry.EnergyType)
                                    .Add("Effektiv", heatingSystemEntry.EffectiveEnergyDemand)
                                    .Add("EBF", heatingSystemEntry.Ebf);
                    rc2.Add(rb);
                }
                XlsxDumper.WriteToXlsx(xlsfilename, rc, rc2);
            }

            void MakeHeatingSystemSankey()
            {
                var ssa1 = new SingleSankeyArrow("HouseHeatingSystems", 1500, MyStage, SequenceNumber, Name, slice, Services);

                ssa1.AddEntry(new SankeyEntry("Houses", houses1.Count, 5000, Orientation.Straight));
                var ssa2 = new SingleSankeyArrow("EnergyBySystems", 1500, MyStage, SequenceNumber, Name, slice, Services);

                ssa2.AddEntry(new SankeyEntry("Houses", heatingsystems1.Sum(x => x.EffectiveEnergyDemand) / 1000000, 5000, Orientation.Straight));
                var counts = new Dictionary <HeatingSystemType, int>();
                var energy = new Dictionary <HeatingSystemType, double>();

                foreach (var entry in heatingsystems1)
                {
                    if (!counts.ContainsKey(entry.SynthesizedHeatingSystemType))
                    {
                        counts.Add(entry.SynthesizedHeatingSystemType, 0);
                        energy.Add(entry.SynthesizedHeatingSystemType, 0);
                    }

                    counts[entry.SynthesizedHeatingSystemType]++;
                    energy[entry.SynthesizedHeatingSystemType] += entry.EffectiveEnergyDemand;
                }

                var i = 1;

                foreach (var pair in counts)
                {
                    ssa1.AddEntry(new SankeyEntry(pair.Key.ToString(), pair.Value * -1, 2000 * i, Orientation.Up));
                    i++;
                }

                i = 1;
                foreach (var pair in energy)
                {
                    ssa2.AddEntry(new SankeyEntry(pair.Key.ToString(), pair.Value * -1 / 1000000, 2000 * i, Orientation.Up));
                    i++;
                }

                Services.PlotMaker.MakeSankeyChart(ssa1);
                Services.PlotMaker.MakeSankeyChart(ssa2);
            }

            void HeatingSystemCountHistogram()
            {
                var counts = new Dictionary <HeatingSystemType, int>();

                foreach (var entry in heatingsystems1)
                {
                    if (!counts.ContainsKey(entry.SynthesizedHeatingSystemType))
                    {
                        counts.Add(entry.SynthesizedHeatingSystemType, 0);
                    }

                    counts[entry.SynthesizedHeatingSystemType]++;
                }

                var filename  = MakeAndRegisterFullFilename("HeatingSystemHistogram.png", slice);
                var names     = new List <string>();
                var barSeries = new List <BarSeriesEntry>();
                var column    = 0;

                foreach (var pair in counts)
                {
                    names.Add(pair.Value.ToString());
                    var count = pair.Value;
                    barSeries.Add(BarSeriesEntry.MakeBarSeriesEntry(pair.Key.ToString(), count, column));
                    column++;
                }

                Services.PlotMaker.MakeBarChart(filename, "HeatingSystemHistogram", barSeries, names);
            }

            void MakeHeatingSystemMapError()
            {
                RGB GetColor(House h)
                {
                    var hse = heatingsystemsByGuid[h.Guid];

                    if (hse.OriginalHeatingSystemType == HeatingSystemType.Fernwärme)
                    {
                        return(Constants.Red);
                    }

                    if (hse.OriginalHeatingSystemType == HeatingSystemType.Gas)
                    {
                        return(Constants.Orange);
                    }

                    if (hse.OriginalHeatingSystemType == HeatingSystemType.FeuerungsstättenGas)
                    {
                        return(Constants.Orange);
                    }

                    return(Constants.Black);
                }

                var mapPoints = houses1.Select(x => x.GetMapPoint(GetColor)).ToList();

                var filename      = MakeAndRegisterFullFilename("KantonHeatingSystemErrors.svg", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("Kanton Fernwärme", Constants.Red),
                    new MapLegendEntry("Kanton Gas", Constants.Orange)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }

            void MakeHeatingSystemMap()
            {
                var rgbs = new Dictionary <HeatingSystemType, RGB>();
                var hs   = heatingsystems1.Select(x => x.SynthesizedHeatingSystemType).Distinct().ToList();
                var idx  = 0;

                foreach (var type in hs)
                {
                    rgbs.Add(type, ColorGenerator.GetRGB(idx++));
                }

                RGB GetColor(House h)
                {
                    var hse = heatingsystemsByGuid[h.Guid];

                    return(rgbs[hse.SynthesizedHeatingSystemType]);
                }

                var mapPoints = houses1.Select(x => x.GetMapPoint(GetColor)).ToList();

                var filename      = MakeAndRegisterFullFilename("HeatingSystemMap.svg", slice);
                var legendEntries = new List <MapLegendEntry>();

                foreach (var pair in rgbs)
                {
                    legendEntries.Add(new MapLegendEntry(pair.Key.ToString(), pair.Value));
                }

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }

            void MakeHeatingTypeMap()
            {
                var maxEnergy             = heatingsystems1.Max(x => x.EffectiveEnergyDemand);
                var colorsByHeatingSystem = new Dictionary <HeatingSystemType, RGB> {
                    {
                        HeatingSystemType.Gas, Constants.Orange
                    }, {
                        HeatingSystemType.Öl, Constants.Black
                    }, {
                        HeatingSystemType.Electricity, Constants.Green
                    }, {
                        HeatingSystemType.Heatpump, Constants.Green
                    }, {
                        HeatingSystemType.Fernwärme, Constants.Blue
                    }, {
                        HeatingSystemType.Other, Constants.Türkis
                    }, {
                        HeatingSystemType.None, Constants.Yellow
                    }
                };

                RGBWithSize GetColorWithSize(House h)
                {
                    var s      = heatingsystemsByGuid[h.Guid];
                    var energy = Math.Log(s.EffectiveEnergyDemand / maxEnergy * 100) * 50;

                    if (energy < 10)
                    {
                        energy = 10;
                    }

                    if (!colorsByHeatingSystem.ContainsKey(s.SynthesizedHeatingSystemType))
                    {
                        throw new Exception("undefined color for " + s.SynthesizedHeatingSystemType);
                    }

                    var rgb = colorsByHeatingSystem[s.SynthesizedHeatingSystemType];

                    return(new RGBWithSize(rgb.R, rgb.G, rgb.B, (int)energy));
                }

                RGB GetColor(House h)
                {
                    var s = heatingsystemsByGuid[h.Guid];

                    if (!colorsByHeatingSystem.ContainsKey(s.SynthesizedHeatingSystemType))
                    {
                        throw new Exception("undefined color for " + s.SynthesizedHeatingSystemType);
                    }

                    var rgb = colorsByHeatingSystem[s.SynthesizedHeatingSystemType];

                    return(new RGB(rgb.R, rgb.G, rgb.B));
                }

                var mapPoints     = houses1.Select(x => x.GetMapPointWithSize(GetColorWithSize)).ToList();
                var filename      = MakeAndRegisterFullFilename("MapHeatingTypeAndSystemPerHousehold.svg", slice);
                var legendEntries = new List <MapLegendEntry>();

                foreach (var pair in colorsByHeatingSystem)
                {
                    legendEntries.Add(new MapLegendEntry(pair.Key.ToString(), pair.Value));
                }

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
                var filenameOsm = MakeAndRegisterFullFilename("MapHeatingTypeAndSystemPerHouseholdOsm.png", slice);

                legendEntries.Add(new MapLegendEntry("Nicht Stadtgebiet", Constants.Red));
                var mceh = houses1.Select(x => x.GetMapColorForHouse(GetColor)).ToList();

                Services.PlotMaker.MakeOsmMap("HeatingTypeMap", filenameOsm, mceh, new List <WgsPoint>(), legendEntries, new List <LineEntry>());
            }

            void MakeFernwärmeTypeMap()
            {
                RGBWithLabel GetColor(House h)
                {
                    var s = heatingsystemsByGuid[h.Guid];

                    if (s.SynthesizedHeatingSystemType == HeatingSystemType.Fernwärme)
                    {
                        return(new RGBWithLabel(Constants.Green, ""));
                    }

                    return(new RGBWithLabel(Constants.Blue, "")); //h.ComplexName
                }

                var legendEntries = new List <MapLegendEntry>();
                var filenameOsm   = MakeAndRegisterFullFilename("FernwärmeOSM.png", slice);

                legendEntries.Add(new MapLegendEntry("Nicht Stadtgebiet", Constants.Red));
                legendEntries.Add(new MapLegendEntry("Nicht Fernwärme", Constants.Blue));
                legendEntries.Add(new MapLegendEntry("Fernwärme", Constants.Green));
                var mceh = houses1.Select(x => x.GetMapColorForHouse(GetColor)).ToList();

                Services.PlotMaker.MakeOsmMap("HeatingTypeMap", filenameOsm, mceh, new List <WgsPoint>(), legendEntries, new List <LineEntry>());
            }

            void MakeHeatingTypeIntensityMap()
            {
                var colorsByHeatingSystem = new Dictionary <HeatingSystemType, RGB> {
                    {
                        HeatingSystemType.Gas, Constants.Orange
                    }, {
                        HeatingSystemType.Öl, Constants.Black
                    }, {
                        HeatingSystemType.Electricity, Constants.Green
                    }, {
                        HeatingSystemType.Heatpump, Constants.Green
                    }, {
                        HeatingSystemType.Fernwärme, Constants.Blue
                    }, {
                        HeatingSystemType.Other, Constants.Türkis
                    }, {
                        HeatingSystemType.None, Constants.Türkis
                    }
                };

                RGBWithSize GetColor(House h)
                {
                    var s      = heatingsystemsByGuid[h.Guid];
                    var energy = s.CalculatedAverageHeatingEnergyDemandDensity / 10;

                    if (energy < 10)
                    {
                        energy = 10;
                    }

                    if (!colorsByHeatingSystem.ContainsKey(s.SynthesizedHeatingSystemType))
                    {
                        throw new Exception("undefined color for " + s.SynthesizedHeatingSystemType);
                    }

                    var rgb = colorsByHeatingSystem[s.SynthesizedHeatingSystemType];

                    return(new RGBWithSize(rgb.R, rgb.G, rgb.B, (int)energy));
                }

                var mapPoints     = houses1.Select(x => x.GetMapPointWithSize(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("MapHeatingTypeAndIntensityPerHouse.svg", slice);
                var legendEntries = new List <MapLegendEntry>();

                foreach (var pair in colorsByHeatingSystem)
                {
                    legendEntries.Add(new MapLegendEntry(pair.Key.ToString(), pair.Value));
                }

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }
        }
Exemplo n.º 12
0
        protected override void RunChartMaking()
        {
            var dbHouse    = SqlConnection.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice).Database;
            var houses     = dbHouse.Fetch <House>();
            var energyUses = dbHouse.Fetch <HouseSummedLocalnetEnergyUse>();
            var households = dbHouse.Fetch <Household>();

            MakeTrafoKreisMapForNonTrafoKreisHouses(Constants.PresentSlice);
            MakeTrafoKreisMap(Constants.PresentSlice);
            MakeTrafoKreisMapForElectricityUsers(Constants.PresentSlice);
            MakeBarChartEnergyPertrafokreis(Constants.PresentSlice);
            MakeBarChartHouseholdsPertrafokreis(Constants.PresentSlice);
            MakeBarChartHousesPerTrafokreis(Constants.PresentSlice);

            MakeSankeyEnergyChartPertrafokreis(Constants.PresentSlice);

            void MakeSankeyEnergyChartPertrafokreis(ScenarioSliceParameters slice)
            {
                var trafokreise = houses.Select(x => x.TrafoKreis).Distinct().ToList();
                //List<string> categoryLabels = new List<string>();
                var energyPerTk = new Dictionary <string, double>();

                for (var i = 0; i < trafokreise.Count; i++)
                {
                    var    tk             = trafokreise[i];
                    var    tkHouses       = houses.Where(x => x.TrafoKreis == tk).ToList();
                    double sumElectricity = 0;
                    foreach (var tkHouse in tkHouses)
                    {
                        var eu = energyUses.Single(x => x.HouseGuid == tkHouse.HouseGuid);
                        sumElectricity += eu.ElectricityUse;
                    }

                    //  categoryLabels.Add(tk);
                    var tkSp = tk ?? "";
                    if (energyPerTk.ContainsKey(tkSp))
                    {
                        energyPerTk[tkSp] += sumElectricity;
                    }
                    else
                    {
                        energyPerTk.Add(tkSp, sumElectricity);
                    }
                }

                var energysum         = energyPerTk.Values.Sum() / 1000000;
                var energySumAssigned = energyPerTk.Where(x => !string.IsNullOrWhiteSpace(x.Key)).Select(x => x.Value).Sum() / 1000000;
                var diff = energysum - energySumAssigned;
                var ssa  = new SingleSankeyArrow("EnergyInAssignedTks", 500, MyStage, SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Strom Gesamt", energysum, 200, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("An Trafokreisen", energySumAssigned * -1, 200, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Nicht an Trafokreisen", diff * -1, 200, Orientation.Down));

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeBarChartHousesPerTrafokreis(ScenarioSliceParameters slice)
            {
                var trafokreise = houses.Select(x => x.TrafoKreis).Distinct().ToList();
                var barseries   = new List <BarSeriesEntry>();

                var categoryLabels = new List <string>();

                for (var i = 0; i < trafokreise.Count; i++)
                {
                    var tk       = trafokreise[i];
                    var tkHouses = houses.Where(x => x.TrafoKreis == tk).ToList();
                    categoryLabels.Add(tk);
                    var bse = BarSeriesEntry.MakeBarSeriesEntry(tk, tkHouses.Count, i);
                    barseries.Add(bse);
                }

                var filename = MakeAndRegisterFullFilename("HousesProTrafokreis.png", Name, "", slice);

                Services.PlotMaker.MakeBarChart(filename, "", barseries, categoryLabels);
            }

            void MakeBarChartHouseholdsPertrafokreis(ScenarioSliceParameters slice)
            {
                var trafokreise = houses.Select(x => x.TrafoKreis).Distinct().ToList();
                var barseries   = new List <BarSeriesEntry>();

                var categoryLabels = new List <string>();

                for (var i = 0; i < trafokreise.Count; i++)
                {
                    var tk               = trafokreise[i];
                    var tkHouses         = houses.Where(x => x.TrafoKreis == tk).ToList();
                    var tkhouseholdCount = 0;
                    foreach (var tkHouse in tkHouses)
                    {
                        var householdsCount = households.Where(x => x.HouseGuid == tkHouse.HouseGuid).Count();
                        tkhouseholdCount += householdsCount;
                    }

                    categoryLabels.Add(tk);
                    var bse = BarSeriesEntry.MakeBarSeriesEntry(tk, tkhouseholdCount, i);
                    barseries.Add(bse);
                }

                var filename = MakeAndRegisterFullFilename("HouseholdsProTrafokreis.png", Name, "", slice);

                Services.PlotMaker.MakeBarChart(filename, "", barseries, categoryLabels);
            }

            void MakeBarChartEnergyPertrafokreis(ScenarioSliceParameters slice)
            {
                var trafokreise = houses.Select(x => x.TrafoKreis).Distinct().ToList();
                var barseries   = new List <BarSeriesEntry>();
                var filenameCsv = MakeAndRegisterFullFilename("StromProTrafokreis.csv", Name, "", slice);

                using (var sw = new StreamWriter(filenameCsv)) {
                    var categoryLabels = new List <string>();
                    for (var i = 0; i < trafokreise.Count; i++)
                    {
                        var    tk             = trafokreise[i];
                        var    tkHouses       = houses.Where(x => x.TrafoKreis == tk).ToList();
                        double sumElectricity = 0;
                        foreach (var tkHouse in tkHouses)
                        {
                            var eu = energyUses.Single(x => x.HouseGuid == tkHouse.HouseGuid);
                            sumElectricity += eu.ElectricityUse;
                        }

                        categoryLabels.Add(tk);
                        var bse = BarSeriesEntry.MakeBarSeriesEntry(tk, sumElectricity, i);
                        barseries.Add(bse);
                        sw.WriteLine(tk + ";" + sumElectricity);
                    }

                    var filename = MakeAndRegisterFullFilename("StromProTrafokreis.png", Name, "", slice);
                    Services.PlotMaker.MakeBarChart(filename, "", barseries, categoryLabels);
                    sw.Close();
                }
            }

            void MakeTrafoKreisMap(ScenarioSliceParameters slice)
            {
                var trafokreise = houses.Select(x => x.TrafoKreis).Distinct().ToList();
                var cg          = new ColorGenerator();

                RGB GetColor(House h)
                {
                    var idx = trafokreise.IndexOf(h.TrafoKreis);

                    return(cg.GetRGB(idx));
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("Trafokreise.svg", Name, "", slice);
                var legendEntries = new List <MapLegendEntry>();

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries, MyStage);
            }

            void MakeTrafoKreisMapForElectricityUsers(ScenarioSliceParameters slice)
            {
                var trafokreise = houses.Select(x => x.TrafoKreis).Distinct().ToList();
                var cg          = new ColorGenerator();

                RGB GetColor(House h)
                {
                    if (h.GebäudeObjectIDs.Count == 0)
                    {
                        return(new RGB(240, 240, 240));
                    }

                    var idx = trafokreise.IndexOf(h.TrafoKreis);

                    return(cg.GetRGB(idx));
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("TrafokreiseEbbeLightgrey.svg", Name, "", slice);
                var legendEntries = new List <MapLegendEntry>();

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries, MyStage);
            }

            void MakeTrafoKreisMapForNonTrafoKreisHouses(ScenarioSliceParameters slice)
            {
                RGBWithSize GetColor(House h)
                {
                    var eu     = energyUses.Single(x => x.HouseGuid == h.HouseGuid);
                    var energy = eu.ElectricityUse / 1_000_000;

                    if (energy < 10)
                    {
                        energy = 10;
                    }

                    if (string.IsNullOrWhiteSpace(h.TrafoKreis))
                    {
                        return(new RGBWithSize(255, 0, 0, (int)energy));
                    }

                    return(new RGBWithSize(0, 0, 0, 10));
                }

                var mapPoints     = houses.Select(x => x.GetMapPointWithSize(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("HousesWithoutTrafoKreisEnergyUse.svg", Name, "", slice);
                var legendEntries = new List <MapLegendEntry>();

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries, MyStage);
            }
        }
Exemplo n.º 13
0
        protected override void MakeVisualization([NotNull] ScenarioSliceParameters slice,
                                                  bool isPresent)
        {
            var dbRaw   = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice);
            var dbHouse = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice);
            var gwrData = dbRaw.Fetch <GwrData>();
            var houses  = dbHouse.Fetch <House>();

            if (houses.Count == 0)
            {
                throw new FlaException("No houses found");
            }
            var households = dbHouse.Fetch <Household>();

            MakeHouseholdsDistributionChart();
            MakeHouseholdsMap();
            HouseholdAppartmentSankey();
            MakeHouseholdsGWRMapComparison();

            void MakeHouseholdsDistributionChart()
            {
                var ssa = new SingleSankeyArrow("Houses", 1000, MyStage,
                                                SequenceNumber, Name, slice, Services);

                ssa.AddEntry(new SankeyEntry("Houses total", houses.Count, 5000, Orientation.Straight));
                var housesWithZeroHouseholds = 0;
                var housesWithOneHousehold   = 0;
                var housesWithManyHouseholds = 0;

                foreach (var house in houses)
                {
                    var houeholdsForHouse = households.Where(x => x.HouseGuid == house.Guid).ToList();
                    if (houeholdsForHouse.Count == 0)
                    {
                        housesWithZeroHouseholds++;
                    }
                    else if (houeholdsForHouse.Count == 1)
                    {
                        housesWithOneHousehold++;
                    }
                    else
                    {
                        housesWithManyHouseholds++;
                    }
                }

                ssa.AddEntry(new SankeyEntry("Häuser mit 0 Haushalten", housesWithZeroHouseholds * -1, 5000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Häuser mit 1 Haushalt", housesWithOneHousehold * -1, 5000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("MFH", housesWithManyHouseholds * -1, 5000, Orientation.Up));

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeHouseholdsMap()
            {
                RGB GetColor(House h)
                {
                    var s = households.Where(x => x.HouseGuid == h.Guid).ToList();

                    if (s.Count == 0)
                    {
                        return(new RGB(255, 0, 0));
                    }

                    if (s.Count == 1)
                    {
                        return(new RGB(0, 0, 255));
                    }

                    return(new RGB(0, 255, 0));
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("MapHouseholdCountsPerHouse.svg", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("No Household", 255, 0, 0),
                    new MapLegendEntry("Genau 1 Haushalt", 0, 0, 255),
                    new MapLegendEntry("Viele Haushalte", 0, 255, 0)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }

            void HouseholdAppartmentSankey()
            {
                var householdCount     = households.Count;
                var gwrAppartmentCount = gwrData.Sum(x => x.AnzahlWohnungen_GANZWHG ?? 0);
                var diff = gwrAppartmentCount - householdCount;
                var ssa  = new SingleSankeyArrow("GWRApartmentsVsHouseholds", 5000, MyStage, SequenceNumber,
                                                 Name, slice, Services);

                ssa.AddEntry(new SankeyEntry("GWR", gwrAppartmentCount, 1500, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Haushalte", householdCount * -1, 1500, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Rest", diff * -1, 500, Orientation.Up));

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeHouseholdsGWRMapComparison()
            {
                RGB GetColor(House h)
                {
                    var householdCount     = households.Count(x => x.HouseGuid == h.Guid);
                    var gwrAppartmentList  = gwrData.Where(x => h.EGIDs.Contains(x.EidgGebaeudeidentifikator_EGID ?? 0)).ToList();
                    var gwrAppartmentCount = gwrAppartmentList.Sum(x => x.AnzahlWohnungen_GANZWHG);
                    var diff = householdCount - gwrAppartmentCount;

                    if (diff == 0)
                    {
                        return(new RGB(64, 64, 64));
                    }

                    if (diff > 1)
                    {
                        return(new RGB(0, 0, 255));
                    }

                    return(new RGB(255, 0, 0));
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("MapHouseholdCountVsGwrHouseholds.svg", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("Same count", 64, 64, 64),
                    new MapLegendEntry("Mehr GWR", 0, 0, 255),
                    new MapLegendEntry("Mehr Haushalte", 255, 0, 0)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }
        }
        public void MakeSankeyChart([NotNull] SingleSankeyArrow arrow)
        {
            var helper = new ZZ_Sankeyhelper(MyLogger, arrow.MyStage);

            helper.Run(arrow);
        }
Exemplo n.º 15
0
        protected override void RunChartMaking()
        {
            var dbHouse = SqlConnection.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice).Database;
            //var dbRaw = SqlConnection.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice).Database;
            var houses = dbHouse.Fetch <House>();
            var potentialHouseholds = dbHouse.Fetch <PotentialHousehold>();
            var potentialBusinesses = dbHouse.Fetch <PotentialBusinessEntry>();

            MakePotentialHouseholdsMap(Constants.PresentSlice);
            MakePotentialBusinessMap();
            EnergySankey(Constants.PresentSlice);
            EnergySankeyTrafokreis(Constants.PresentSlice);

            void MakePotentialHouseholdsMap(ScenarioSliceParameters slice)
            {
                var ssa = new SingleSankeyArrow("Potential Households", 1000,
                                                MyStage, SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Potential Households total", potentialHouseholds.Count, 5000, Orientation.Straight));
                var potentialHouseholdsEnergySmaller1000 = potentialHouseholds.Count(x => x.YearlyElectricityUse < 1000);
                var potentialHouseholdsEnergySmaller2000 = potentialHouseholds.Count(x => x.YearlyElectricityUse < 2000 && x.YearlyElectricityUse >= 1000);
                var potentialHouseholdsEnergySmaller5000 = potentialHouseholds.Count(x => x.YearlyElectricityUse < 5000 && x.YearlyElectricityUse >= 2000);
                var potentialHouseholdsEnergyGreater5000 = potentialHouseholds.Count(x => x.YearlyElectricityUse > 5000);

                ssa.AddEntry(new SankeyEntry("Haushalte mit Energie < 1000", potentialHouseholdsEnergySmaller1000 * -1, 5000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Haushalte mit Energie < 2000", potentialHouseholdsEnergySmaller2000 * -1, 5000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Haushalte mit Energie < 5000", potentialHouseholdsEnergySmaller5000 * -1, 5000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Haushalte mit Energie > 5000", potentialHouseholdsEnergyGreater5000 * -1, 5000, Orientation.Down));


                Services.PlotMaker.MakeSankeyChart(ssa);

                RGB GetColor(House h)
                {
                    var s = potentialHouseholds.Where(x => x.HouseGuid == h.HouseGuid).ToString();

                    if (s.Length == 0)
                    {
                        return(new RGB(255, 0, 0));
                    }

                    if (h.GebäudeObjectIDs.Count == 1)
                    {
                        return(new RGB(0, 0, 255));
                    }

                    return(new RGB(0, 255, 0));
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("MapHouseholdCountsPerHouse.svg", Name, "", Constants.PresentSlice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("No Household", 255, 0, 0),
                    new MapLegendEntry("Genau 1 Haushalt", 0, 0, 255),
                    new MapLegendEntry("Viele Haushalte", 0, 255, 0)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries, MyStage);
            }

            void MakePotentialBusinessMap()
            {
                RGB GetColor(House h)
                {
                    var s = potentialBusinesses.Where(x => x.HouseGuid == h.HouseGuid).ToList();

                    if (s.Count == 0)
                    {
                        return(new RGB(255, 0, 0));
                    }

                    if (s.Count == 1)
                    {
                        return(new RGB(0, 0, 255));
                    }

                    return(new RGB(0, 255, 0));
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("MapBusinessCountsPerHouse.svg", Name, "", Constants.PresentSlice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("No business", 255, 0, 0),
                    new MapLegendEntry("Genau 1 business", 0, 0, 255),
                    new MapLegendEntry("Viele geschäfte", 0, 255, 0)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries, MyStage);
            }

            void EnergySankey(ScenarioSliceParameters slice)
            {
                var          hhs      = dbHouse.Fetch <PotentialHousehold>();
                var          business = dbHouse.Fetch <PotentialBusinessEntry>();
                var          buildingInfrastructures = dbHouse.Fetch <PotentialBuildingInfrastructure>();
                var          streetlights            = dbHouse.Fetch <StreetLightingEntry>();
                const double fac        = 1_000_000;
                var          hhsum      = hhs.Sum(x => x.YearlyElectricityUse) / fac;
                var          businessum = business.Sum(x => x.LowVoltageYearlyElectricityUse + x.HighVoltageYearlyElectricityUse) / fac;
                var          infrasum   = buildingInfrastructures.Sum(x => x.LowVoltageTotalElectricityDemand + x.HighVoltageTotalElectricityDemand) / fac;
                var          streetsum  = streetlights.Sum(x => x.YearlyElectricityUse) / fac;
                var          sum        = hhsum + businessum + infrasum + streetsum;
                var          ssa        = new SingleSankeyArrow("AufgeteilterStromverbrauch", 1000,
                                                                MyStage, SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Gesamt", sum, 500, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Haushalte", hhsum * -1, 500, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Business", businessum * -1, 500, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Buildings", infrasum * -1, 500, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Beleuchtung", streetsum * -1, 500, Orientation.Up));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void EnergySankeyTrafokreis(ScenarioSliceParameters slice)
            {
                var          hhs      = dbHouse.Fetch <PotentialHousehold>();
                var          business = dbHouse.Fetch <PotentialBusinessEntry>();
                var          buildingInfrastructures = dbHouse.Fetch <PotentialBuildingInfrastructure>();
                var          streetlights            = dbHouse.Fetch <StreetLightingEntry>();
                const double fac        = 1_000_000;
                var          houseguids = houses.Where(x => !string.IsNullOrWhiteSpace(x.TrafoKreis)).Select(x => x.HouseGuid).ToList();
                var          hhsum      = hhs.Where(x => houseguids.Contains(x.HouseGuid)).Sum(x => x.YearlyElectricityUse) / fac;
                var          businessum = business.Where(x => houseguids.Contains(x.HouseGuid)).Sum(x => x.LowVoltageYearlyElectricityUse + x.HighVoltageYearlyElectricityUse) / fac;
                var          infrasum   = buildingInfrastructures.Where(x => houseguids.Contains(x.HouseGuid)).Sum(x => x.LowVoltageTotalElectricityDemand + x.HighVoltageTotalElectricityDemand) / fac;
                var          streetsum  = streetlights.Where(x => houseguids.Contains(x.HouseGuid)).Sum(x => x.YearlyElectricityUse) / fac;
                var          sum        = hhsum + businessum + infrasum + streetsum;
                var          ssa        = new SingleSankeyArrow("AufgeteilterStromverbrauchMitTrafokreis", 1000, MyStage,
                                                                SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Gesamt", sum, 500, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Haushalte", hhsum * -1, 500, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Business", businessum * -1, 500, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Buildings", infrasum * -1, 500, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Beleuchtung", streetsum * -1, 500, Orientation.Up));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }
        }
        private List <SingleSankeyArrow> MakeFernwärmeArrow([ItemNotNull][NotNull] List <BuildingComplex> complexes, [ItemNotNull][NotNull] List <Localnet> rawEntries,
                                                            [ItemNotNull][NotNull] List <MonthlyElectricityUsePerStandort> monthlyElectricityUsePerStandorts)
        {
            var          slice              = Constants.PresentSlice;
            const string section            = "Erdgas";
            const string sectionDescription = "Analyse der Erdgasverbräuche";
            //write python
            var arrows = new List <SingleSankeyArrow>();

            {
                var arr1 = new SingleSankeyArrow("Fernwärme_NachStandorten", 2000, MyStage, SequenceNumber, Name, Services.Logger, slice);
                var rfe  = new ResultFileEntry(section, sectionDescription, arr1.FullPngFileName(), arr1.ArrowName, "", Constants.PresentSlice, MyStage);
                rfe.Save();
                var verbrauchsList = rawEntries.Where(x => x.Verrechnungstyp == "Arbeitspreis").ToList();
                var totalSum       = verbrauchsList.Select(x => {
                    if (x.BasisVerbrauch == null)
                    {
                        throw new Exception("Basisverbrauch was null");
                    }

                    return(x.BasisVerbrauch.Value);
                }).Sum();
                const double factor = 1_000_000;
                arr1.AddEntry(new SankeyEntry("Total aus Rohdaten", totalSum / factor, 1000, Orientation.Up));
                var monthlyElectricityUseNetz = monthlyElectricityUsePerStandorts.Sum(x => x.YearlyFernwaermeUse);
                arr1.AddEntry(new SankeyEntry("Arbeitspreis in Monthly", monthlyElectricityUseNetz / factor * -1, 1000, Orientation.Down));
                arrows.Add(arr1);
            }

            {
                var arr1 = new SingleSankeyArrow("Fernwärme_Verbrauch_Nach_Identified_Complexed_Standort", 2000, MyStage, SequenceNumber, Name, Services.Logger, slice);
                var rfe  = new ResultFileEntry(section, sectionDescription, arr1.FullPngFileName(), arr1.ArrowName, "", Constants.PresentSlice, MyStage);
                rfe.Save();
                var          totalSum = monthlyElectricityUsePerStandorts.Select(x => x.YearlyFernwaermeUse).Sum();
                const double factor   = 1_000_000;
                arr1.AddEntry(new SankeyEntry("Total", totalSum / factor, 1000, Orientation.Up));
                var cleandStandortIDs          = complexes.SelectMany(x => x.CleanedStandorte).ToList();
                var identifiedComplexStandorts = monthlyElectricityUsePerStandorts.Where(x => cleandStandortIDs.Contains(x.CleanedStandort));

                var identifiedmonthlygas = identifiedComplexStandorts.Sum(x => x.YearlyFernwaermeUse);
                arr1.AddEntry(new SankeyEntry("MonthlyElectricityUseNetz", identifiedmonthlygas / factor * -1, 1000, Orientation.Down));
                arrows.Add(arr1);
            }

            {
                var arr1 = new SingleSankeyArrow("Fernwärme_Verbrauch_Nach_BuildingWithGeoCoords", 500, MyStage, SequenceNumber, Name, Services.Logger, slice);
                var rfe  = new ResultFileEntry(section, sectionDescription, arr1.FullPngFileName(), arr1.ArrowName, "", Constants.PresentSlice, MyStage);
                rfe.Save();
                var          totalSum = monthlyElectricityUsePerStandorts.Select(x => x.YearlyFernwaermeUse).Sum();
                const double factor   = 1_000_000;
                arr1.AddEntry(new SankeyEntry("Fernwärmeverbrauch gesamt", totalSum / factor, 500, Orientation.Straight));
                var cleandStandortIDs                   = complexes.Where(x => x.Coords.Count > 0).SelectMany(x => x.CleanedStandorte).ToList();
                var identifiedComplexStandorts          = monthlyElectricityUsePerStandorts.Where(x => cleandStandortIDs.Contains(x.CleanedStandort));
                var identifiedmonthlyElectricityUseNetz = identifiedComplexStandorts.Sum(x => x.YearlyFernwaermeUse);
                arr1.AddEntry(new SankeyEntry("Fernwärmeverbrauch in\\n Gebäuden mit Geokoordinaten", identifiedmonthlyElectricityUseNetz / factor * -1, 200, Orientation.Straight));

                var notidentified = monthlyElectricityUsePerStandorts.Where(x => !cleandStandortIDs.Contains(x.CleanedStandort));
                var notidentifiedmonthlyElectricityUseNetz = notidentified.Sum(x => x.YearlyFernwaermeUse);
                arr1.AddEntry(new SankeyEntry("Fernwärmeverbrauch in nicht\\n zuordenbaren Gebäuden", notidentifiedmonthlyElectricityUseNetz / factor * -1, 200, Orientation.Up));

                arrows.Add(arr1);
            }
            return(arrows);
        }
Exemplo n.º 17
0
        protected override void RunChartMaking()
        {
            var slice            = Constants.PresentSlice;
            var dbHouse          = SqlConnection.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice).Database;
            var houses           = dbHouse.Fetch <House>();
            var houseTypeEntries = dbHouse.Fetch <HouseTypeEntry>();

            MakeHouseTypeEntries();
            //HeatingSystemCountHistogram();
            //MakeHeatingSystemMapError();
            //MakeHeatingSystemMap();
            MakeHouseTypeMap();

            void MakeHouseTypeEntries()
            {
                var ssa = new SingleSankeyArrow("HouseTypeEntries", 1500, MyStage, SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Houses", houses.Count, 5000, Orientation.Straight));
                var countsPerType = new Dictionary <HouseTypeEnum, int>();

                foreach (var entry in houseTypeEntries)
                {
                    if (!countsPerType.ContainsKey(entry.HouseType))
                    {
                        countsPerType.Add(entry.HouseType, 0);
                    }

                    countsPerType[entry.HouseType]++;
                }

                foreach (var pair in countsPerType)
                {
                    ssa.AddEntry(new SankeyEntry(pair.Key.ToString(), pair.Value * -1, 2000, Orientation.Up));
                }

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            /*
             * void MakeHeatingSystemMapError()
             * {
             *  RGB GetColor(House h)
             *  {
             *      HeatingSystemEntry hse = heatingsystems.Single(x => x.HouseGuid == h.HouseGuid);
             *      if (hse.HeatingSystemType == HeatingSystemType.Fernwärme)
             *      {
             *          return Constants.Red;
             *      }
             *      if (hse.HeatingSystemType == HeatingSystemType.Gasheating)
             *      {
             *          return Constants.Orange;
             *      }
             *      if (hse.HeatingSystemType == HeatingSystemType.FeuerungsstättenGas)
             *      {
             *          return Constants.Orange;
             *      }
             *      return Constants.Black;
             *  }
             *
             *  var mapPoints = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
             *
             *  var filename = MakeAndRegisterFullFilename("KantonHeatingSystemErrors.svg", Name, "");
             *  List<MapLegendEntry> legendEntries = new List<MapLegendEntry>();
             *  legendEntries.Add(new MapLegendEntry("Kanton Fernwärme", Constants.Red));
             *  legendEntries.Add(new MapLegendEntry("Kanton Gas", Constants.Orange));
             *  Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
             * }*/
            void MakeHouseTypeMap()
            {
                var rgbs = new Dictionary <HouseTypeEnum, RGB>();
                var hs   = houseTypeEntries.Select(x => x.HouseType).Distinct().ToList();
                var cg   = new ColorGenerator();
                var idx  = 0;

                foreach (var type in hs)
                {
                    var rgb = cg.GetRGB(idx++);
                    if (rgb.R == 255 && rgb.B == 255 && rgb.G == 255)
                    {
                        rgb = new RGB(200, 200, 200);
                    }

                    if (rgb.R == 255 && rgb.B == 0 && rgb.G == 0)
                    {
                        rgb = Constants.Orange;
                    }

                    rgbs.Add(type, rgb);
                }

                RGB GetColor(House h)
                {
                    var hse = houseTypeEntries.Single(x => x.HouseGuid == h.HouseGuid);

                    return(rgbs[hse.HouseType]);
                }

                var mapPoints = houses.Select(x => x.GetMapColorForHouse(GetColor)).ToList();

                var filename      = MakeAndRegisterFullFilename("HouseTypeMap.png", Name, "", slice);
                var legendEntries = new List <MapLegendEntry>();

                foreach (var pair in rgbs)
                {
                    legendEntries.Add(new MapLegendEntry(pair.Key.ToString(), pair.Value));
                }

                Services.PlotMaker.MakeOsmMap(Name, filename, mapPoints, new List <WgsPoint>(), legendEntries, new List <LineEntry>());
            }
        }
Exemplo n.º 18
0
        protected override void RunChartMaking()
        {
            var slice = Constants.PresentSlice;
            //var dbHouse = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice);
            var ap               = new AnalysisRepository(Services.RunningConfig);
            var dbHouse          = ap.GetSlice(Constants.PresentSlice);
            var houses           = dbHouse.Fetch <House>();
            var houseTypeEntries = dbHouse.Fetch <HouseTypeEntry>();

            MakeHouseTypeEntries();
            MakeHouseTypeMap();
            MakeEnergyUseXls();
            void MakeEnergyUseXls()
            {
                var        households   = dbHouse.Fetch <Household>();
                var        businesses   = dbHouse.Fetch <BusinessEntry>();
                var        infra        = dbHouse.Fetch <BuildingInfrastructure>();
                var        light        = dbHouse.Fetch <StreetLightingEntry>();
                var        dhw          = dbHouse.Fetch <DHWHeaterEntry>();
                var        rc           = new RowCollection("energy", "energy");
                RowBuilder rb           = RowBuilder.Start("Haushalte", households.Sum(x => x.EffectiveEnergyDemand) / Constants.GWhFactor);
                var        bigcustomers = businesses.Where(x => x.EffectiveEnergyDemand > 20000);
                var        small        = businesses.Where(x => x.EffectiveEnergyDemand <= 20000);

                rb.Add("Geschäftskunden > 20 MWh", bigcustomers.Sum(x => x.EffectiveEnergyDemand) / Constants.GWhFactor);
                rb.Add("Geschäftskunden < 20 MWh", small.Sum(x => x.EffectiveEnergyDemand) / Constants.GWhFactor);
                rb.Add("Gebäudeinfrastruktur", infra.Sum(x => x.EffectiveEnergyDemand) / Constants.GWhFactor);
                rb.Add("Strassenbeleuchtung", light.Sum(x => x.YearlyElectricityUse) / Constants.GWhFactor);
                rb.Add("Elektroboiler", dhw.Sum(x => x.EffectiveEnergyDemand) / Constants.GWhFactor);

                rc.Add(rb);
                var fn = MakeAndRegisterFullFilename("EnergyTreeMap.xlsx", Constants.PresentSlice);

                XlsxDumper.WriteToXlsx(fn, rc);
                SaveToPublicationDirectory(fn, Constants.PresentSlice, "4.2");
            }

            void MakeHouseTypeEntries()
            {
                var ssa = new SingleSankeyArrow("HouseTypeEntries", 1500, MyStage,
                                                SequenceNumber, Name, slice, Services);

                ssa.AddEntry(new SankeyEntry("Houses", houses.Count, 5000, Orientation.Straight));
                var countsPerType = new Dictionary <HouseType, int>();

                foreach (var entry in houseTypeEntries)
                {
                    if (!countsPerType.ContainsKey(entry.HouseType))
                    {
                        countsPerType.Add(entry.HouseType, 0);
                    }

                    countsPerType[entry.HouseType]++;
                }

                foreach (var pair in countsPerType)
                {
                    ssa.AddEntry(new SankeyEntry(pair.Key.ToString(), pair.Value * -1, 2000, Orientation.Up));
                }

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeHouseTypeMap()
            {
                var rgbs = new Dictionary <HouseType, RGB>();
                var hs   = houseTypeEntries.Select(x => x.HouseType).Distinct().ToList();
                var idx  = 0;

                foreach (var type in hs)
                {
                    var rgb = ColorGenerator.GetRGB(idx++);
                    if (rgb.R == 255 && rgb.B == 255 && rgb.G == 255)
                    {
                        rgb = new RGB(200, 200, 200);
                    }

                    if (rgb.R == 255 && rgb.B == 0 && rgb.G == 0)
                    {
                        rgb = Constants.Orange;
                    }

                    rgbs.Add(type, rgb);
                }

                RGB GetColor(House h)
                {
                    var hse = houseTypeEntries.Single(x => x.HouseGuid == h.Guid);

                    return(rgbs[hse.HouseType]);
                }

                var mapPoints = houses.Select(x => x.GetMapColorForHouse(GetColor)).ToList();

                var filename      = MakeAndRegisterFullFilename("HouseTypeMap.png", slice);
                var legendEntries = new List <MapLegendEntry>();

                foreach (var pair in rgbs)
                {
                    legendEntries.Add(new MapLegendEntry(pair.Key.ToString(), pair.Value));
                }

                Services.PlotMaker.MakeOsmMap(Name, filename, mapPoints, new List <WgsPoint>(), legendEntries, new List <LineEntry>());
            }
        }
Exemplo n.º 19
0
        private SingleSankeyArrow MakeArr2([ItemNotNull][NotNull] List <BuildingComplex> complexes)
        {
            var slice     = Constants.PresentSlice;
            var outcounts = new Dictionary <string, int>();
            var arr2      = new SingleSankeyArrow("Komplexe", 1000, MyStage, SequenceNumber, Name, slice, Services);

            arr2.AddEntry(new SankeyEntry("Komplexe", complexes.Count, 1000, Orientation.Straight));
            foreach (Variants variant1 in Enum.GetValues(typeof(Variants)))
            {
                // addresses
                string fullDesc;
                List <BuildingComplex> l1Complexes;
                if (variant1 == Variants.None)
                {
                    l1Complexes = complexes.Where(x => x.Adresses.Count == 0).ToList();
                    fullDesc    = "keine Adressen,\\n";
                }
                else
                {
                    l1Complexes = complexes.Where(x => x.Adresses.Count > 0).ToList();
                    fullDesc    = "mindestens eine Addresse,\\n";
                }

                foreach (Variants variant2 in Enum.GetValues(typeof(Variants)))
                {
                    //geocoords
                    List <BuildingComplex> l2Complexes;
                    var l2Desc = fullDesc;
                    if (variant2 == Variants.None)
                    {
                        l2Complexes = l1Complexes.Where(x => x.Coords.Count == 0).ToList();
                        l2Desc     += "keine Koord.,\\n";
                    }
                    else
                    {
                        l2Complexes = l1Complexes.Where(x => x.Coords.Count > 0).ToList();
                        l2Desc     += "mindestens eine Koord.,\\n";
                    }

                    foreach (Variants variant3 in Enum.GetValues(typeof(Variants)))
                    {
                        //localnetGebäudeIDs
                        List <BuildingComplex> l3Complexes;
                        var l3Desc = l2Desc;
                        if (variant3 == Variants.None)
                        {
                            l3Complexes = l2Complexes.Where(x => x.GebäudeObjectIDs.Count == 0).ToList();
                            l3Desc     += "keine LocalnetID";
                            outcounts.Add(l3Desc, l3Complexes.Count);
                        }
                        else
                        {
                            l3Complexes = l2Complexes.Where(x => x.GebäudeObjectIDs.Count > 0).ToList();
                            l3Desc     += "mindestens eine LocalnetID";
                            outcounts.Add(l3Desc, l3Complexes.Count);
                        }
                    }
                }
            }

            var pathLength = 1000;

            foreach (var pair in outcounts)
            {
                if (pair.Value > 0)
                {
                    if (pair.Value > 3000)
                    {
                        arr2.AddEntry(new SankeyEntry(pair.Key, pair.Value * -1, 3000, Orientation.Straight));
                    }
                    else
                    {
                        pathLength += 4000;
                        arr2.AddEntry(new SankeyEntry(pair.Key, pair.Value * -1, pathLength, Orientation.Up));
                    }
                }
            }

            return(arr2);
        }
Exemplo n.º 20
0
        protected override void RunChartMaking()
        {
            var dbHouse    = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice);
            var houses     = dbHouse.Fetch <House>();
            var energyUses = dbHouse.Fetch <HouseSummedLocalnetEnergyUse>();
            var households = dbHouse.Fetch <Household>();

            MakeTrafoKreisMapForNonTrafoKreisHouses(Constants.PresentSlice);
            MakeTrafoKreisOsmMap(Constants.PresentSlice);
            MakeTrafoKreisMap(Constants.PresentSlice);
            MakeTrafoKreisMapForElectricityUsers(Constants.PresentSlice);
            MakeBarChartEnergyPertrafokreis(Constants.PresentSlice);
            MakeBarChartHouseholdsPertrafokreis(Constants.PresentSlice);
            MakeBarChartHousesPerTrafokreis(Constants.PresentSlice);

            MakeSankeyEnergyChartPertrafokreis(Constants.PresentSlice);

            void MakeSankeyEnergyChartPertrafokreis(ScenarioSliceParameters slice)
            {
                var trafokreise = houses.Select(x => x.TrafoKreis).Distinct().ToList();
                //List<string> categoryLabels = new List<string>();
                var energyPerTk = new Dictionary <string, double>();

                for (var i = 0; i < trafokreise.Count; i++)
                {
                    var    tk             = trafokreise[i];
                    var    tkHouses       = houses.Where(x => x.TrafoKreis == tk).ToList();
                    double sumElectricity = 0;
                    foreach (var tkHouse in tkHouses)
                    {
                        var eu = energyUses.Single(x => x.HouseGuid == tkHouse.Guid);
                        sumElectricity += eu.ElectricityUse;
                    }

                    //  categoryLabels.Add(tk);
                    var tkSp = tk ?? "";
                    if (energyPerTk.ContainsKey(tkSp))
                    {
                        energyPerTk[tkSp] += sumElectricity;
                    }
                    else
                    {
                        energyPerTk.Add(tkSp, sumElectricity);
                    }
                }

                var energysum         = energyPerTk.Values.Sum() / 1000000;
                var energySumAssigned = energyPerTk.Where(x => !string.IsNullOrWhiteSpace(x.Key)).Select(x => x.Value).Sum() / 1000000;
                var diff = energysum - energySumAssigned;
                var ssa  = new SingleSankeyArrow("EnergyInAssignedTks", 500, MyStage,
                                                 SequenceNumber, Name, slice, Services);

                ssa.AddEntry(new SankeyEntry("Strom Gesamt", energysum, 200, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("An Trafokreisen", energySumAssigned * -1, 200, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Nicht an Trafokreisen", diff * -1, 200, Orientation.Down));

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeBarChartHousesPerTrafokreis(ScenarioSliceParameters slice)
            {
                var trafokreise = houses.Select(x => x.TrafoKreis).Distinct().ToList();
                var barseries   = new List <BarSeriesEntry>();

                var categoryLabels = new List <string>();

                for (var i = 0; i < trafokreise.Count; i++)
                {
                    var tk       = trafokreise[i];
                    var tkHouses = houses.Where(x => x.TrafoKreis == tk).ToList();
                    categoryLabels.Add(tk);
                    var bse = BarSeriesEntry.MakeBarSeriesEntry(tk, tkHouses.Count, i);
                    barseries.Add(bse);
                }

                var filename = MakeAndRegisterFullFilename("HousesProTrafokreis.png", slice);

                Services.PlotMaker.MakeBarChart(filename, "HousesProTrafokreis", barseries, categoryLabels);
            }

            void MakeBarChartHouseholdsPertrafokreis(ScenarioSliceParameters slice)
            {
                var trafokreise = houses.Select(x => x.TrafoKreis).Distinct().ToList();
                var barseries   = new List <BarSeriesEntry>();

                var categoryLabels = new List <string>();

                for (var i = 0; i < trafokreise.Count; i++)
                {
                    var tk               = trafokreise[i];
                    var tkHouses         = houses.Where(x => x.TrafoKreis == tk).ToList();
                    var tkhouseholdCount = 0;
                    foreach (var tkHouse in tkHouses)
                    {
                        var householdsCount = households.Count(x => x.HouseGuid == tkHouse.Guid);
                        tkhouseholdCount += householdsCount;
                    }

                    categoryLabels.Add(tk);
                    var bse = BarSeriesEntry.MakeBarSeriesEntry(tk, tkhouseholdCount, i);
                    barseries.Add(bse);
                }

                var filename = MakeAndRegisterFullFilename("HouseholdsProTrafokreis.png", slice);

                Services.PlotMaker.MakeBarChart(filename, "HouseholdsProTrafokreis", barseries, categoryLabels);
            }

            void MakeBarChartEnergyPertrafokreis(ScenarioSliceParameters slice)
            {
                var trafokreise = houses.Select(x => x.TrafoKreis).Distinct().ToList();
                var barseries   = new List <BarSeriesEntry>();
                var filenameCsv = MakeAndRegisterFullFilename("StromProTrafokreis.csv", slice);

                using (var sw = new StreamWriter(filenameCsv)) {
                    var categoryLabels = new List <string>();
                    for (var i = 0; i < trafokreise.Count; i++)
                    {
                        var    tk             = trafokreise[i];
                        var    tkHouses       = houses.Where(x => x.TrafoKreis == tk).ToList();
                        double sumElectricity = 0;
                        foreach (var tkHouse in tkHouses)
                        {
                            var eu = energyUses.Single(x => x.HouseGuid == tkHouse.Guid);
                            sumElectricity += eu.ElectricityUse;
                        }

                        categoryLabels.Add(tk);
                        var bse = BarSeriesEntry.MakeBarSeriesEntry(tk, sumElectricity, i);
                        barseries.Add(bse);
                        sw.WriteLine(tk + ";" + sumElectricity);
                    }

                    var filename = MakeAndRegisterFullFilename("StromProTrafokreis.png", slice);
                    Services.PlotMaker.MakeBarChart(filename, "StromProTrafokreis", barseries, categoryLabels);
                    sw.Close();
                }
            }

            void MakeTrafoKreisMap(ScenarioSliceParameters slice)
            {
                var trafokreise = houses.Select(x => x.TrafoKreis).Distinct().ToList();

                RGB GetColor(House h)
                {
                    var idx = trafokreise.IndexOf(h.TrafoKreis);

                    return(ColorGenerator.GetRGB(idx));
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("Trafokreise.svg", slice);
                var legendEntries = new List <MapLegendEntry>();

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }

            void MakeTrafoKreisOsmMap(ScenarioSliceParameters slice)
            {
                var trafokreise = houses.Select(x => x.TrafoKreis).Distinct().ToList();

                Dictionary <string, RGB> colorByTrafokreis = new Dictionary <string, RGB>();
                int idx = 0;

                foreach (var tk in trafokreise)
                {
                    var rgb = ColorGenerator.GetRGB(idx);
                    while (rgb.R == 255 && rgb.G == 255 && rgb.B == 255)
                    {
                        idx++;
                        rgb = ColorGenerator.GetRGB(idx);
                    }
                    colorByTrafokreis.Add(tk, rgb);
                    idx++;
                }

                foreach (var rgb in colorByTrafokreis)
                {
                    Info(rgb.Key + ": " + rgb.Value);
                }
                RGB GetColor(House h) => colorByTrafokreis[h.TrafoKreis ?? throw new InvalidOperationException()];

                var mapPoints     = houses.Select(x => x.GetMapColorForHouse(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("TrafokreiseOsm.png", slice);
                var legendEntries = new List <MapLegendEntry>();

                legendEntries.Add(new MapLegendEntry("Mittelspannung", colorByTrafokreis["MV_customers"]));
                legendEntries.Add(new MapLegendEntry("Nicht erfasst", new RGB(255, 0, 0)));
                Services.PlotMaker.MakeOsmMap(Name, filename, mapPoints, new List <WgsPoint>(),
                                              legendEntries, new List <LineEntry>());
            }
Exemplo n.º 21
0
        protected override void MakeVisualization([NotNull] ScenarioSliceParameters parameters, bool isPresent)
        {
            var dbHouse       = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, parameters);
            var houses        = dbHouse.Fetch <House>();
            var households    = dbHouse.Fetch <Household>();
            var parkingSpaces = dbHouse.Fetch <ParkingSpace>();

            MakeCarAmountSankey();
            CarCountHistogram();
            MakeCarMap();

            void MakeCarAmountSankey()
            {
                var ssa = new SingleSankeyArrow("HouseholdsWithParkingSpace", 1000, MyStage,
                                                SequenceNumber, Name, parameters, Services);

                ssa.AddEntry(new SankeyEntry("Households", households.Count, 5000, Orientation.Straight));
                var autos = parkingSpaces.Count;

                ssa.AddEntry(new SankeyEntry("Mit Parkieren", autos * -1, 5000, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Ohne Parkieren", (households.Count - autos) * -1, 5000, Orientation.Straight));

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void CarCountHistogram()
            {
                var carCountsPerHouse = new List <int>();

                foreach (var house in houses)
                {
                    var carsInHouse = parkingSpaces.Where(x => x.HouseGuid == house.Guid).ToList();
                    carCountsPerHouse.Add(carsInHouse.Count);
                }

                var maxSize   = carCountsPerHouse.Max();
                var filename  = MakeAndRegisterFullFilename("ParkingPerHouseHistogram.png", parameters);
                var names     = new List <string>();
                var barSeries = new List <BarSeriesEntry>();

                for (var i = 0; i < maxSize + 1; i++)
                {
                    names.Add(i.ToString());
                    var j     = i;
                    var count = carCountsPerHouse.Count(x => x == j);
                    barSeries.Add(BarSeriesEntry.MakeBarSeriesEntry(i + " Autos", count, i));
                }

                Services.PlotMaker.MakeBarChart(filename, "", barSeries, names);
            }

            void MakeCarMap()
            {
                var mapPoints = new List <MapPoint>();

                RGBWithSize GetMapPoint(House h)
                {
                    var carsInHouse = parkingSpaces.Count(x => x.HouseGuid == h.Guid);

                    return(new RGBWithSize(Constants.Red, carsInHouse + 10));
                }

                foreach (var house in houses)
                {
                    mapPoints.Add(house.GetMapPointWithSize(GetMapPoint));
                }

                var filename      = MakeAndRegisterFullFilename("AutosProHaus.svg", parameters);
                var legendEntries = new List <MapLegendEntry>();

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }
        }
Exemplo n.º 22
0
        protected override void RunChartMaking()
        {
            var slice            = Constants.PresentSlice;
            var dbHouse          = SqlConnection.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice).Database;
            var houses           = dbHouse.Fetch <House>();
            var dhwHeaterEntries = dbHouse.Fetch <DHWHeaterEntry>();

            MakeDhwHeatingSystemSankey();
            HeatingSystemCountHistogram();
            MakeHeatingSystemMap();

            void MakeDhwHeatingSystemSankey()
            {
                var ssa = new SingleSankeyArrow("HouseDhwHeatingSystems", 1500, MyStage,
                                                SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Houses", houses.Count, 5000, Orientation.Straight));
                var counts = new Dictionary <DhwHeatingSystem, int>();

                foreach (var entry in dhwHeaterEntries)
                {
                    if (!counts.ContainsKey(entry.DhwHeatingSystemType))
                    {
                        counts.Add(entry.DhwHeatingSystemType, 0);
                    }

                    counts[entry.DhwHeatingSystemType]++;
                }

                var i = 1;

                foreach (var pair in counts)
                {
                    ssa.AddEntry(new SankeyEntry(pair.Key.ToString(), pair.Value * -1, 2000 * i, Orientation.Up));
                    i++;
                }

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void HeatingSystemCountHistogram()
            {
                var counts = new Dictionary <DhwHeatingSystem, int>();

                foreach (var entry in dhwHeaterEntries)
                {
                    if (!counts.ContainsKey(entry.DhwHeatingSystemType))
                    {
                        counts.Add(entry.DhwHeatingSystemType, 0);
                    }

                    counts[entry.DhwHeatingSystemType]++;
                }

                var filename  = MakeAndRegisterFullFilename("DhwHeatingSystemHistogram.png", Name, "", slice);
                var names     = new List <string>();
                var barSeries = new List <BarSeriesEntry>();
                var column    = 0;

                foreach (var pair in counts)
                {
                    names.Add(pair.Value.ToString());
                    var count = pair.Value;
                    barSeries.Add(BarSeriesEntry.MakeBarSeriesEntry(pair.Key.ToString(), count, column));
                    column++;
                }

                Services.PlotMaker.MakeBarChart(filename, "", barSeries, names);
            }

            void MakeHeatingSystemMap()
            {
                var rgbs = new Dictionary <DhwHeatingSystem, RGB>();
                var hs   = dhwHeaterEntries.Select(x => x.DhwHeatingSystemType).Distinct().ToList();
                var cg   = new ColorGenerator();
                var idx  = 0;

                foreach (var type in hs)
                {
                    rgbs.Add(type, cg.GetRGB(idx++));
                }

                RGB GetColor(House h)
                {
                    var hse = dhwHeaterEntries.Single(x => x.HouseGuid == h.HouseGuid);

                    return(rgbs[hse.DhwHeatingSystemType]);
                }

                var mapPoints = houses.Select(x => x.GetMapPoint(GetColor)).ToList();

                var filename      = MakeAndRegisterFullFilename("DhwHeatingSystemMap.svg", Name, "", slice);
                var legendEntries = new List <MapLegendEntry>();

                foreach (var pair in rgbs)
                {
                    legendEntries.Add(new MapLegendEntry(pair.Key.ToString(), pair.Value));
                }

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries, MyStage);
            }
        }
Exemplo n.º 23
0
        protected override void MakeVisualization([NotNull] ScenarioSliceParameters slice, bool isPresent)
        {
            var dbHouse    = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice);
            var houses     = dbHouse.Fetch <House>();
            var households = dbHouse.Fetch <Household>();
            var cars       = dbHouse.Fetch <Car>();

            if (cars.Count == 0)
            {
                throw new FlaException("No cars found");
            }

            MakeCarAmountSankey();
            CarCountHistogram();
            MakeCarMap();

            void MakeCarAmountSankey()
            {
                var ssa = new SingleSankeyArrow("HouseholdsWithCar", 1000, MyStage, SequenceNumber, Name, slice, Services);

                ssa.AddEntry(new SankeyEntry("Households", households.Count, 5000, Orientation.Straight));
                var autos = cars.Count;

                ssa.AddEntry(new SankeyEntry("Mit Auto", autos * -1, 5000, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Ohne Auto", (households.Count - autos) * -1, 5000, Orientation.Straight));

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void CarCountHistogram()
            {
                var carCountsPerHouse = new List <int>();

                foreach (var house in houses)
                {
                    var carsInHouse = cars.Where(x => x.HouseGuid == house.Guid).ToList();
                    carCountsPerHouse.Add(carsInHouse.Count);
                }

                var maxSize   = carCountsPerHouse.Max();
                var filename  = MakeAndRegisterFullFilename("CarsPerHouseHistogram.png", slice);
                var names     = new List <string>();
                var barSeries = new List <BarSeriesEntry>();

                for (var i = 0; i < maxSize + 1; i++)
                {
                    names.Add(i.ToString());
                    var j     = i;
                    var count = carCountsPerHouse.Count(x => x == j);
                    barSeries.Add(BarSeriesEntry.MakeBarSeriesEntry(i + " Autos", count, i));
                }

                Services.PlotMaker.MakeBarChart(filename, "", barSeries, names);
            }

            void MakeCarMap()
            {
                var mapPoints = new List <MapPoint>();

                foreach (var house in houses)
                {
                    if (house.WgsGwrCoords.Count == 0)
                    {
                        continue;
                    }

                    var carsInHouse = cars.Count(x => x.HouseGuid == house.Guid);
                    mapPoints.Add(new MapPoint(house.WgsGwrCoords[0].Lon, house.WgsGwrCoords[0].Lat, carsInHouse, carsInHouse + 10));
                }

                var filename      = MakeAndRegisterFullFilename("AutosProHaus.svg", slice);
                var legendEntries = new List <MapLegendEntry>();

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }
        }
        protected override void MakeVisualization([NotNull] ScenarioSliceParameters slice, bool isPresent)
        {
            var dbHouse  = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice);
            var houses   = dbHouse.Fetch <House>();
            var business = dbHouse.Fetch <BusinessEntry>();

            if (business.Count == 0)
            {
                throw new FlaException("No businesses");
            }
            MakeBusinessSankey();
            MakeHouseholdsMap();
            MakeBusinessTypeHistogram();

            void MakeBusinessTypeHistogram()
            {
                var counts = new Dictionary <BusinessType, int>();

                foreach (var entry in business)
                {
                    if (!counts.ContainsKey(entry.BusinessType))
                    {
                        counts.Add(entry.BusinessType, 0);
                    }

                    counts[entry.BusinessType]++;
                }

                var filename  = MakeAndRegisterFullFilename("BusinessHistogram.png", slice);
                var names     = new List <string>();
                var barSeries = new List <BarSeriesEntry>();
                var column    = 0;

                foreach (var pair in counts)
                {
                    names.Add(pair.Key.ToString());
                    var count = pair.Value;
                    barSeries.Add(BarSeriesEntry.MakeBarSeriesEntry(pair.Key.ToString(), count, column));
                    column++;
                }

                Services.PlotMaker.MakeBarChart(filename, "BusinessHistogram", barSeries, names);
            }

            void MakeBusinessSankey()
            {
                var ssa = new SingleSankeyArrow("Houses", 1000, MyStage,
                                                SequenceNumber, Name, slice, Services);

                ssa.AddEntry(new SankeyEntry("Houses total", houses.Count, 5000, Orientation.Straight));
                var housesWithZeroBusinesses = 0;
                var housesWithOneBusiness    = 0;
                var housesWithManyBusiness   = 0;

                foreach (var house in houses)
                {
                    var businessesForHouse = business.Where(x => x.HouseGuid == house.Guid).ToList();
                    if (businessesForHouse.Count == 0)
                    {
                        housesWithZeroBusinesses++;
                    }
                    else if (businessesForHouse.Count == 1)
                    {
                        housesWithOneBusiness++;
                    }
                    else
                    {
                        housesWithManyBusiness++;
                    }
                }

                ssa.AddEntry(new SankeyEntry("Häuser mit 0 Geschäften", housesWithZeroBusinesses * -1, 5000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Häuser mit 1 Geschäft", housesWithOneBusiness * -1, 5000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Mehrere Geschäfte", housesWithManyBusiness * -1, 5000, Orientation.Up));

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeHouseholdsMap()
            {
                RGB GetColor(House h)
                {
                    var s = business.Where(x => x.HouseGuid == h.Guid).ToList();

                    if (s.Count == 0)
                    {
                        return(new RGB(255, 0, 0));
                    }

                    var multiplier = 1;

                    if (s.Any(x => x.BusinessType == BusinessType.Industrie))
                    {
                        multiplier = 2;
                    }

                    if (s.Count == 1)
                    {
                        return(new RGB(0, 0, 125 * multiplier));
                    }

                    return(new RGB(0, 125 * multiplier, 0));
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("MapHouseholdCountsPerHouse.svg", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("No Business", 255, 0, 0),
                    new MapLegendEntry("Genau 1 Business", 0, 0, 255),
                    new MapLegendEntry("Viele Business", 0, 255, 0)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }
        }
        // ReSharper disable once FunctionComplexityOverflow
        private List <SingleSankeyArrow> MakeElectricityArrow([ItemNotNull][NotNull] List <BuildingComplex> complexes, [ItemNotNull][NotNull] List <Localnet> rawEntries,
                                                              [ItemNotNull][NotNull] List <MonthlyElectricityUsePerStandort> monthlyElectricityUsePerStandorts,
                                                              Stage mystage)
        {
            const string section            = "Stromverbräuche";
            const string sectionDescription = "Analyse der Stromverbräuche";
            var          slice = Constants.PresentSlice;
            //write python
            var arrows = new List <SingleSankeyArrow>();

            {
                var arr1 = new SingleSankeyArrow("Stromkunden_Anzahl_nach_Verrechnungstyp", 20000, MyStage, SequenceNumber, Name, Services.Logger, slice);
                var rfe  = new ResultFileEntry(section, sectionDescription, arr1.FullPngFileName(), arr1.ArrowName, "", Constants.PresentSlice, mystage);
                rfe.Save();
                var verbrauchsList = rawEntries.Where(x => x.Verrechnungstyp == "Netz Nachtstrom (NT)" || x.Verrechnungstyp == "Netz Tagesstrom (HT)").ToList();
                arr1.AddEntry(new SankeyEntry("Total", verbrauchsList.Count, 100, Orientation.Up));
                var count2 = rawEntries.Count(x => x.Verrechnungstyp == "Netz Nachtstrom (NT)");
                arr1.AddEntry(new SankeyEntry("Nachtstrom", count2 * -1, 100, Orientation.Up));
                var countTag = rawEntries.Count(x => x.Verrechnungstyp == "Netz Tagesstrom (HT)");
                arr1.AddEntry(new SankeyEntry("Tagstrom", countTag * -1, 100, Orientation.Up));
                arrows.Add(arr1);
            }
            {
                var arr1 = new SingleSankeyArrow("Stromkunden_Verbrauch_nach_Verrechnungstyp", 2000, MyStage, SequenceNumber, Name, Services.Logger, slice);
                var rfe  = new ResultFileEntry(section, sectionDescription, arr1.FullPngFileName(), arr1.ArrowName, "", Constants.PresentSlice, mystage);
                rfe.Save();
                var verbrauchsList = rawEntries.Where(x => x.Verrechnungstyp == "Netz Nachtstrom (NT)" || x.Verrechnungstyp == "Netz Tagesstrom (HT)").ToList();

                var totalSum = verbrauchsList.Select(x => {
                    if (x.BasisVerbrauch == null)
                    {
                        throw new Exception("Basisverbrauch was null");
                    }

                    return(x.BasisVerbrauch.Value);
                }).Sum();
                const double factor = 1_000_000;
                arr1.AddEntry(new SankeyEntry("Total", totalSum / factor, 1000, Orientation.Up));
                var sumNight = rawEntries.Where(x => x.Verrechnungstyp == "Netz Nachtstrom (NT)").Select(x => {
                    if (x.BasisVerbrauch == null)
                    {
                        throw new Exception("Basisverbrauch was null");
                    }

                    return(x.BasisVerbrauch.Value);
                }).Sum();
                arr1.AddEntry(new SankeyEntry("Nachtstrom", sumNight / factor * -1, 1000, Orientation.Down));
                var sumDay = rawEntries.Where(x => x.Verrechnungstyp == "Netz Tagesstrom (HT)").Select(x => {
                    if (x.BasisVerbrauch == null)
                    {
                        throw new Exception("Basisverbrauch was null");
                    }

                    return(x.BasisVerbrauch.Value);
                }).Sum();
                arr1.AddEntry(new SankeyEntry("Tagstrom", sumDay / factor * -1, 1000, Orientation.Up));
                arrows.Add(arr1);
            }

            {
                var arr1 = new SingleSankeyArrow("Stromkunden_Verbrauch_Nach_Standort", 2000, MyStage, SequenceNumber, Name, Services.Logger, slice);
                var rfe  = new ResultFileEntry(section, sectionDescription, arr1.FullPngFileName(), arr1.ArrowName, "",
                                               Constants.PresentSlice, MyStage);
                rfe.Save();
                var verbrauchsList = rawEntries.Where(x => x.Verrechnungstyp == "Netz Nachtstrom (NT)" || x.Verrechnungstyp == "Netz Tagesstrom (HT)").ToList();
                var totalSum       = verbrauchsList.Select(x => {
                    if (x.BasisVerbrauch == null)
                    {
                        throw new Exception("Basisverbrauch was null");
                    }

                    return(x.BasisVerbrauch.Value);
                }).Sum();
                const double factor = 1_000_000;
                arr1.AddEntry(new SankeyEntry("Total", totalSum / factor, 1000, Orientation.Up));
                var monthlyElectricityUseNetz = monthlyElectricityUsePerStandorts.Sum(x => x.YearlyElectricityUseNetz);
                arr1.AddEntry(new SankeyEntry("MonthlyElectricityUseNetz", monthlyElectricityUseNetz / factor * -1, 1000, Orientation.Down));
                arrows.Add(arr1);
            }

            {
                var arr1 = new SingleSankeyArrow("Stromkunden_Verbrauch_Nach_Rechnungsart", 2000, MyStage, SequenceNumber, Name, Services.Logger, slice);
                var rfe  = new ResultFileEntry(section, sectionDescription, arr1.FullPngFileName(), arr1.ArrowName, "", Constants.PresentSlice, MyStage);
                rfe.Save();
                var verbrauchsList = rawEntries.Where(x => x.Verrechnungstyp == "Netz Nachtstrom (NT)" || x.Verrechnungstyp == "Netz Tagesstrom (HT)").ToList();
                var totalSum       = verbrauchsList.Select(x => {
                    if (x.BasisVerbrauch == null)
                    {
                        throw new Exception("Basisverbrauch was null");
                    }

                    return(x.BasisVerbrauch.Value);
                }).Sum();
                const double factor = 1_000_000;
                arr1.AddEntry(new SankeyEntry("Total", totalSum / factor, 1000, Orientation.Up));
                var rechungsarten = verbrauchsList.Select(x => x.Rechnungsart).Distinct().ToList();
                var pathlength    = 500;
                foreach (var rechnungsart in rechungsarten)
                {
                    var rechnungsartSum = verbrauchsList.Where(x => x.Rechnungsart == rechnungsart).Select(x => {
                        if (x.BasisVerbrauch == null)
                        {
                            throw new Exception("Basisverbrauch was null");
                        }

                        return(x.BasisVerbrauch.Value);
                    }).Sum();
                    arr1.AddEntry(new SankeyEntry(rechnungsart, rechnungsartSum / factor * -1, pathlength, Orientation.Down));
                    pathlength += 500;
                }

                arrows.Add(arr1);
            }

            {
                var arr1 = new SingleSankeyArrow("Stromkunden_Verbrauch_Nach_Identified_Complexed_Standort", 2000, MyStage, SequenceNumber, Name, Services.Logger, slice);
                var rfe  = new ResultFileEntry(section, sectionDescription, arr1.FullPngFileName(), arr1.ArrowName, "", Constants.PresentSlice, MyStage);
                rfe.Save();
                var          totalSum = monthlyElectricityUsePerStandorts.Select(x => x.YearlyElectricityUseNetz).Sum();
                const double factor   = 1_000_000;
                arr1.AddEntry(new SankeyEntry("Total", totalSum / factor, 1000, Orientation.Up));
                var cleandStandortIDs          = complexes.SelectMany(x => x.CleanedStandorte).ToList();
                var identifiedComplexStandorts = monthlyElectricityUsePerStandorts.Where(x => cleandStandortIDs.Contains(x.CleanedStandort));

                var identifiedmonthlyElectricityUseNetz = identifiedComplexStandorts.Sum(x => x.YearlyElectricityUseNetz);
                arr1.AddEntry(new SankeyEntry("MonthlyElectricityUseNetz", identifiedmonthlyElectricityUseNetz / factor * -1, 1000, Orientation.Down));
                arrows.Add(arr1);
            }

            {
                var arr1 = new SingleSankeyArrow("Stromkunden_Verbrauch_Nach_BuildingWithGeoCoords", 500, MyStage, SequenceNumber, Name, Services.Logger, slice);
                var rfe  = new ResultFileEntry(section, sectionDescription, arr1.FullPngFileName(), arr1.ArrowName, "", Constants.PresentSlice, MyStage);
                rfe.Save();
                var          totalSum = monthlyElectricityUsePerStandorts.Select(x => x.YearlyElectricityUseNetz).Sum();
                const double factor   = 1_000_000;
                arr1.AddEntry(new SankeyEntry("Stromverbrauch gesamt", totalSum / factor, 500, Orientation.Straight));
                var cleandStandortIDs                   = complexes.Where(x => x.Coords.Count > 0).SelectMany(x => x.CleanedStandorte).ToList();
                var identifiedComplexStandorts          = monthlyElectricityUsePerStandorts.Where(x => cleandStandortIDs.Contains(x.CleanedStandort));
                var identifiedmonthlyElectricityUseNetz = identifiedComplexStandorts.Sum(x => x.YearlyElectricityUseNetz);
                arr1.AddEntry(new SankeyEntry("Stromverbrauch in\\n Gebäuden mit Geokoordinaten", identifiedmonthlyElectricityUseNetz / factor * -1, 200, Orientation.Straight));

                var notidentified = monthlyElectricityUsePerStandorts.Where(x => !cleandStandortIDs.Contains(x.CleanedStandort));
                var notidentifiedmonthlyElectricityUseNetz = notidentified.Sum(x => x.YearlyElectricityUseNetz);
                arr1.AddEntry(new SankeyEntry("Stromverbrauch in nicht\\n zuordenbaren Gebäuden", notidentifiedmonthlyElectricityUseNetz / factor * -1, 200, Orientation.Up));

                arrows.Add(arr1);
            }
            return(arrows);
        }
        protected override void RunChartMaking()
        {
            var slice               = Constants.PresentSlice;
            var dbHouse             = SqlConnection.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice).Database;
            var dbRaw               = SqlConnection.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice).Database;
            var localnetEntries     = dbRaw.Fetch <Localnet>();
            var houses              = dbHouse.Fetch <House>();
            var househeatingentries = dbHouse.Fetch <HouseHeating>();

            MakeOilEnergySankey();
            MakeHeatingSystemSankey();
            MakeHeatingsystemMapLocalnet();
            MakeGasEnergySankey();
            MakeWärmeEnergySankey();
            MakeHeatingsystemMapEBBE();
            MakeEtagenHeizungenLocalnet();
            MakeEbbeLocalnetComparisonSankey();
            MakeHeatingIntensityMap();

            void MakeHeatingSystemSankey()
            {
                var ssa = new SingleSankeyArrow("Houses", 1000, MyStage, SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Houses total", houses.Count, 5000, Orientation.Straight));
                var housesWithZeroLocalnetHeatingSystems = 0;
                var housesWithOneLocalnetHeatingSystems  = 0;
                var housesWithManyLocalnetHeatingSystems = 0;

                foreach (var house in houses)
                {
                    var houseHeatings = househeatingentries.Single(x => x.HouseGuid == house.HouseGuid);
                    if (houseHeatings.LocalnetHeatingSystemEntryCount == 0)
                    {
                        housesWithZeroLocalnetHeatingSystems++;
                    }
                    else if (houseHeatings.LocalnetHeatingSystemEntryCount == 1)
                    {
                        housesWithOneLocalnetHeatingSystems++;
                    }
                    else
                    {
                        housesWithManyLocalnetHeatingSystems++;
                    }
                }

                ssa.AddEntry(new SankeyEntry("Häuser mit 0 Localnet heizungen", housesWithZeroLocalnetHeatingSystems * -1, 5000, Orientation.Down));
                ssa.AddEntry(new SankeyEntry("Häuser mit 1 Localnet Heizungen", housesWithOneLocalnetHeatingSystems * -1, 5000, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Häuser mit mehreren Localnet Heizungen", housesWithManyLocalnetHeatingSystems * -1, 5000, Orientation.Up));

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeEbbeLocalnetComparisonSankey()
            {
                var    ssa = new SingleSankeyArrow("MakeEbbeLocalnetComparisonSankey", 500, MyStage, SequenceNumber, Name, Services.Logger, slice);
                double ebbeHeizungsBedarf      = 0;
                double localnetHeizungsBedarf  = 0;
                double mergedHeizungsBedarf    = 0;
                double localnetFernWärmeBedarf = 0;
                double localnetGasBedarf       = 0;
                double mergedHeizungsBedarfOnlyLocalnetHouses = 0;
                double ebbeFernwärme = 0;

                foreach (var houseHeating in househeatingentries)
                {
                    ebbeHeizungsBedarf      += houseHeating.KantonTotalEnergyDemand;
                    localnetHeizungsBedarf  += houseHeating.LocalnetCombinedEnergyDemand;
                    mergedHeizungsBedarf    += houseHeating.MergedHeatingDemand;
                    localnetGasBedarf       += houseHeating.LocalnetGasEnergyUse;
                    localnetFernWärmeBedarf += houseHeating.LocalnetFernwärmeEnergyUse;
                    if (houseHeating.KantonHeatingMethods.Contains(HeatingSystemType.Fernwärme))
                    {
                        ebbeFernwärme += houseHeating.KantonTotalEnergyDemand;
                    }

                    var house = houses.Single(x => x.HouseGuid == houseHeating.HouseGuid);
                    if (house.GebäudeObjectIDs.Count > 0)
                    {
                        mergedHeizungsBedarfOnlyLocalnetHouses += houseHeating.MergedHeatingDemand;
                    }
                }

                var filenameCsv = MakeAndRegisterFullFilename("HeizungsVergleich.csv", Name, "", slice);

                using (var sw = new StreamWriter(filenameCsv)) {
                    sw.WriteLine("Ebbe Heizungsbedarf gesamt; " + ebbeHeizungsBedarf);
                    sw.WriteLine("Localnet Gas Bedarf;" + localnetGasBedarf);
                    sw.WriteLine("Localnet Fernwärme Bedarf;" + localnetFernWärmeBedarf);
                    sw.WriteLine("Localnet Combined Bedarf;" + localnetHeizungsBedarf);
                    sw.WriteLine("Merged Bedarf;" + mergedHeizungsBedarf);
                    sw.WriteLine("Merged Bedarf nur für Häuser mit Localnet Stromanschluss;" + mergedHeizungsBedarfOnlyLocalnetHouses);
                    sw.WriteLine("Ebbe Schätzung Fernwärme;" + ebbeFernwärme);
                }

                const double factor = 1_000_000;
                var          diff   = ebbeHeizungsBedarf - localnetHeizungsBedarf;

                ssa.AddEntry(new SankeyEntry("EbbeEnergieBedarf", ebbeHeizungsBedarf / factor, 500, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Merged Heizungsenergiebedarf", localnetHeizungsBedarf * -1 / factor, 500, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Differenz", diff * -1 / factor, 500, Orientation.Up));

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeOilEnergySankey()
            {
                var    ebbes = dbRaw.Fetch <EnergiebedarfsdatenBern>();
                double sumEbbeEnergyölHeizung = ebbes.Where(x => x.upd_genhz == 7201).Sum(x => x.calc_ehz);
                double sumEbbeEnergyölWw      = ebbes.Where(x => x.upd_genww == 7201).Sum(x => x.calc_eww);
                var    sumOilUsed             = househeatingentries.Where(x => x.KantonHeatingMethods.Contains(HeatingSystemType.Öl)).Select(x => x.KantonTotalEnergyDemand).Sum();
                //double sumOilFeuerung = househeatingentries.Where(x => x.KantonHeatingMethods.Contains(HeatingSystemType.FeuerungsstättenOil)).Select(x => x.KantonTotalEnergyDemand).Sum();
                var    feuerung = dbRaw.Fetch <FeuerungsStaette>();
                double sumFeuerungsstätteHaus = 0;
                var    oelcount = 0;

                foreach (var staette in feuerung)
                {
                    if (staette.Brennstoff == "Oel")
                    {
                        var ebbeEntry = ebbes.Where(x => x.egid == staette.EGID).ToList();
                        foreach (var bern in ebbeEntry)
                        {
                            sumFeuerungsstätteHaus += bern.calc_ehzww;
                        }

                        oelcount++;
                    }
                }

                Log(MessageType.Info, "Total Öl Gebäude aus feuerungsstätten: " + oelcount);
                const double factor = 1_000_000;
                var          ssa    = new SingleSankeyArrow("Öl", 1000, MyStage, SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Öl Heizung", sumEbbeEnergyölHeizung / factor, 500, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Öl WW", sumEbbeEnergyölWw / factor, 500, Orientation.Down));
                var diff = sumEbbeEnergyölHeizung + sumEbbeEnergyölWw - sumOilUsed - sumFeuerungsstätteHaus;

                ssa.AddEntry(new SankeyEntry("BFH Ebbe Öl", sumOilUsed * -1 / factor, 500, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Beco Öl", sumFeuerungsstätteHaus * -1 / factor, 500, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Differenz aus der Komplex-Bildung", diff / factor * -1, 500, Orientation.Straight));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeGasEnergySankey()
            {
                var verbrauchsList = localnetEntries.Where(x => x.Verrechnungstyp == "Erdgasverbrauch").ToList();
                var totalSum       = verbrauchsList.Select(x => {
                    if (x.BasisVerbrauch == null)
                    {
                        throw new Exception("Basisverbrauch was null");
                    }

                    return(x.BasisVerbrauch.Value);
                }).Sum();
                const double factor             = 1_000_000;
                var          sumAllocatedGasUse = househeatingentries.Sum(x => x.LocalnetGasEnergyUse);
                var          ssa = new SingleSankeyArrow("Erdgas", 1000, MyStage, SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Rohdaten Total", totalSum / factor, 5000, Orientation.Straight));

                ssa.AddEntry(new SankeyEntry("Heizungen zugewiesen", sumAllocatedGasUse * -1 / factor, 5000, Orientation.Down));
                ssa.AddEntry(new SankeyEntry("Keinen Heizungen zugewiesen", (totalSum - sumAllocatedGasUse) * -1 / factor, 5000, Orientation.Straight));

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeWärmeEnergySankey()
            {
                var verbrauchsList = localnetEntries.Where(x => x.Verrechnungstyp == "Arbeitspreis").ToList();
                var totalSum       = verbrauchsList.Select(x => {
                    if (x.BasisVerbrauch == null)
                    {
                        throw new Exception("Basisverbrauch was null");
                    }

                    return(x.BasisVerbrauch.Value);
                }).Sum();
                const double factor             = 1_000_000;
                var          sumAllocatedGasUse = househeatingentries.Sum(x => x.LocalnetFernwärmeEnergyUse);
                var          ssa = new SingleSankeyArrow("Fernwärme", 1000, MyStage, SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Rohdaten Total", totalSum / factor, 5000, Orientation.Straight));

                ssa.AddEntry(new SankeyEntry("Heizungen zugewiesen", sumAllocatedGasUse * -1 / factor, 5000, Orientation.Down));
                ssa.AddEntry(new SankeyEntry("Keinen Heizungen zugewiesen", (totalSum - sumAllocatedGasUse) * -1 / factor, 5000, Orientation.Straight));

                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeHeatingsystemMapLocalnet()
            {
                RGB GetColor(House h)
                {
                    var s = househeatingentries.Single(x => x.HouseGuid == h.HouseGuid);

                    if (s.LocalnetGasEnergyUse > 0)
                    {
                        return(Constants.Green);
                    }

                    return(Constants.Black);
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("MapLocalnetGasHeizungen.svg", Name, "", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("No Localnet heating", Constants.Black),
                    new MapLegendEntry("Localnet heating", Constants.Green)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries, MyStage);
            }

            void MakeEtagenHeizungenLocalnet()
            {
                RGB GetColor(House h)
                {
                    var s = househeatingentries.Single(x => x.HouseGuid == h.HouseGuid);

                    if (s.LocalnetHeatingSystemEntryCount == 0)
                    {
                        return(Constants.Black);
                    }

                    if (s.LocalnetHeatingSystemEntryCount == 1)
                    {
                        return(Constants.Blue);
                    }

                    return(Constants.Red);
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("MapLocalnetHeatingSystemCountsPerHouse.svg", Name, "", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("No Localnet heating", Constants.Black),
                    new MapLegendEntry("Genau 1 Localnet Heizsystem", Constants.Blue),
                    new MapLegendEntry("Viele Localnet Heizsysteme", Constants.Red)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries, MyStage);
            }

            // ReSharper disable once InconsistentNaming
            void MakeHeatingsystemMapEBBE()
            {
                RGB GetColor(House h)
                {
                    var s = househeatingentries.Single(x => x.HouseGuid == h.HouseGuid);

                    if (s.KantonHeatingMethods.Contains(HeatingSystemType.Gas))
                    {
                        return(Constants.Green);
                    }

                    return(Constants.Black);
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("MapHeatingSystemTypeEbbePerHouse.svg", Name, "", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("EBBE Gas", Constants.Green),
                    new MapLegendEntry("Sonstiges", Constants.Black)
                };

                //legendEntries.Add(new MapLegendEntry("EBBE Strom", 0, 0, 255));
                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries, MyStage);
            }

            // ReSharper disable once InconsistentNaming
            void MakeHeatingIntensityMap()
            {
                var maxEnergyDensity = househeatingentries.Max(x => x.MergedHeatingEnergyDensity);
                var maxEnergy        = househeatingentries.Max(x => x.MergedHeatingDemand);

                RGBWithSize GetColor(House h)
                {
                    var s      = househeatingentries.Single(x => x.HouseGuid == h.HouseGuid);
                    var color  = 250 * s.MergedHeatingEnergyDensity / maxEnergyDensity;
                    var energy = Math.Log(s.MergedHeatingDemand / maxEnergy * 100) * 50;

                    if (energy < 10)
                    {
                        energy = 10;
                    }

                    return(new RGBWithSize((int)color, 0, 0, (int)energy));
                }

                var mapPoints     = houses.Select(x => x.GetMapPointWithSize(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("MapHeatingIntensityPerHouse.svg", Name, "", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("Energiedichte: 0", Constants.Black),
                    new MapLegendEntry("Energiedichte: " + maxEnergyDensity, Constants.Red)
                };

                //legendEntries.Add(new MapLegendEntry("Sonstiges", Constants.Black));
                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries, MyStage);
            }
        }
        protected override void RunChartMaking()
        {
            var dbComplex        = SqlConnection.GetDatabaseConnection(Stage.Complexes, Constants.PresentSlice).Database;
            var dbComplexEnergie = SqlConnection.GetDatabaseConnection(Stage.ComplexEnergyData, Constants.PresentSlice).Database;
            var complexes        = dbComplex.Fetch <BuildingComplex>();


            var dbRaw = SqlConnection.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice).Database;
            var ebbe  = dbRaw.Fetch <EnergiebedarfsdatenBern>();
            //var complexes = dbComplex.Fetch<BuildingComplex>();
            var complexBuildingData = dbComplexEnergie.Fetch <ComplexBuildingData>();

            MakeComplexAreaSankey(Constants.PresentSlice);

            //var sonnendach = dbRaw.Fetch<SonnenDach>();
            MakeBuildingSizeComplex(Constants.PresentSlice);
            SizeHistogram();
            MovedCharts();
            void MakeBuildingSizeComplex(ScenarioSliceParameters slice)
            {
                var ssa = new SingleSankeyArrow("BuildingSizeComplex", 1000, MyStage, SequenceNumber,
                                                Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Complexes", complexes.Count, 2000, Orientation.Straight));
                var complexWithOneBuilding   = complexes.Count(x => x.EGids.Count == 1);
                var complexWithTwoBuilding   = complexes.Count(x => x.EGids.Count == 2);
                var complexWithThreeBuilding = complexes.Count(x => x.EGids.Count == 3);
                var complexWithManyBuilding  = complexes.Count(x => x.EGids.Count > 3);

                ssa.AddEntry(new SankeyEntry("Komplexe mit 1 Gebäude", complexWithOneBuilding * -1, 1000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Komplexe mit 2 Gebäuden", complexWithTwoBuilding * -1, 2000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Komplexe mit 3 Gebäuden", complexWithThreeBuilding * -1, 3000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Komplexe mit mehr als 3 Gebäuden", complexWithManyBuilding * -1, 3000, Orientation.Up));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeComplexAreaSankey(ScenarioSliceParameters slice)

            {
                var ssa = new SingleSankeyArrow("ComplexSankeyTotalArea", 1000, MyStage, SequenceNumber, Name, Services.Logger, slice);
                var ebbeEnergieBezugsfläche = ebbe.Select(x => x.upd_ebf).Sum() / 1000;
                var complexBuildingDataArea = complexBuildingData.Select(x => x.TotalEnergieBezugsfläche).Sum() / 1000;
                var diff = ebbeEnergieBezugsfläche - complexBuildingDataArea;

                ssa.AddEntry(new SankeyEntry("Ebbe EBF", ebbeEnergieBezugsfläche, 5000, Orientation.Straight));

                ssa.AddEntry(new SankeyEntry("Complex EBF ", complexBuildingDataArea * -1, 5000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Fehlend", diff * -1, 5000, Orientation.Down));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void SizeHistogram()
            {
                var counts = new Dictionary <int, int>();

                foreach (var complex in complexes)
                {
                    if (!counts.ContainsKey(complex.EGids.Count))
                    {
                        counts.Add(complex.EGids.Count, 0);
                    }

                    counts[complex.EGids.Count]++;
                }

                var filename  = MakeAndRegisterFullFilename("EgidPerComplexHistogram.png", Name, "", Constants.PresentSlice);
                var names     = new List <string>();
                var barSeries = new List <BarSeriesEntry>();
                var column    = 0;

                foreach (var pair in counts)
                {
                    names.Add(pair.Value.ToString());
                    var count = pair.Value;
                    barSeries.Add(BarSeriesEntry.MakeBarSeriesEntry(pair.Key.ToString(), count, column));
                    column++;
                }

                Services.PlotMaker.MakeBarChart(filename, "", barSeries, names);
            }

            //read database
            var dbComplexEnergy = SqlConnection.GetDatabaseConnection(Stage.ComplexEnergyData, Constants.PresentSlice).Database;
            var monthlyElectricityUsePerStandorts = dbComplexEnergy.Fetch <MonthlyElectricityUsePerStandort>();
            var localnetData = dbRaw.Fetch <Localnet>();
            var coords       = 0;

            foreach (var complex in complexes)
            {
                coords += complex.Coords.Count;
            }

            Log(MessageType.Info, "UsedCoords = " + coords);
            var arrows = new List <SingleSankeyArrow>();

            arrows.AddRange(MakeElectricityArrow(complexes, localnetData, monthlyElectricityUsePerStandorts, MyStage));
            arrows.AddRange(MakeGasArrow(complexes, localnetData, monthlyElectricityUsePerStandorts));
            arrows.AddRange(MakeFernwärmeArrow(complexes, localnetData, monthlyElectricityUsePerStandorts));
            Directory.SetCurrentDirectory(Constants.BasePath);
            foreach (var arrow in arrows)
            {
                Services.PlotMaker.MakeSankeyChart(arrow);
            }
        }
Exemplo n.º 28
0
        protected override void RunChartMaking()
        {
            var slice             = Constants.PresentSlice;
            var dbHouse           = SqlConnection.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice).Database;
            var houses            = dbHouse.Fetch <House>();
            var occupants         = dbHouse.Fetch <Occupant>();
            var outgoingCommuters = dbHouse.Fetch <OutgoingCommuterEntry>();
            var carDistances      = dbHouse.Fetch <CarDistanceEntry>();

            MakeCarDistanceHistogram();
            MakeCommuterSankey();
            MakeCommuterMap();
            MakeCommuterDistanceHistogram();
            MakeCommuterDistanceHistogramNonBurgdorf();

            void MakeCommuterSankey()
            {
                var ssa = new SingleSankeyArrow("OutgoingCommuters", 1500, MyStage, SequenceNumber, Name, Services.Logger, slice);

                ssa.AddEntry(new SankeyEntry("Einwohner", occupants.Count, 5000, Orientation.Straight));
                var workersOutside  = outgoingCommuters.Count(x => x.DistanceInKm > 0);
                var workersBurgdorf = outgoingCommuters.Count(x => Math.Abs(x.DistanceInKm) < 0.000001);
                var unemployed      = occupants.Count - workersOutside - workersBurgdorf;

                ssa.AddEntry(new SankeyEntry("Ohne Anstellung", unemployed * -1, 2000, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Pendler aus Burgdorf", workersOutside * -1, 2000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Arbeiter in Burgdorf", workersBurgdorf * -1, 2000, Orientation.Up));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeCarDistanceHistogram()
            {
                var commuterDistances = carDistances.Select(x => x.TotalDistance).ToList();
                var hg        = new Histogram(commuterDistances, 15);
                var bse       = new List <BarSeriesEntry>();
                var barSeries = BarSeriesEntry.MakeBarSeriesEntry(hg, out var colNames, "F1");

                bse.Add(barSeries);
                var filename = MakeAndRegisterFullFilename("CarDistanceHistogram.png", Name, "", slice);

                Services.PlotMaker.MakeBarChart(filename, "Anzahl Autos mit dieser Entfernung", bse, colNames);
            }

            void MakeCommuterDistanceHistogram()
            {
                var commuterDistances = outgoingCommuters.Select(x => x.DistanceInKm).ToList();
                var hg        = new Histogram(commuterDistances, 15);
                var bse       = new List <BarSeriesEntry>();
                var barSeries = BarSeriesEntry.MakeBarSeriesEntry(hg, out var colNames, "F1");

                bse.Add(barSeries);
                var filename = MakeAndRegisterFullFilename("OutgoingCommutersDistanceHistogram.png", Name, "", slice);

                Services.PlotMaker.MakeBarChart(filename, "Anzahl Pendler mit dieser Entfernung", bse, colNames);
            }

            void MakeCommuterDistanceHistogramNonBurgdorf()
            {
                var commuterDistances = outgoingCommuters.Where(x => x.DistanceInKm > 0).Select(x => x.DistanceInKm).ToList();
                var hg        = new Histogram(commuterDistances, 15);
                var bse       = new List <BarSeriesEntry>();
                var barSeries = BarSeriesEntry.MakeBarSeriesEntry(hg, out var colNames, "F1");

                bse.Add(barSeries);
                var filename = MakeAndRegisterFullFilename("OutgoingCommutersDistanceHistogramNoBurgdorf.png", Name, "", slice);

                Services.PlotMaker.MakeBarChart(filename, "Anzahl Pendler mit dieser Entfernung", bse, colNames);
            }

            void MakeCommuterMap()
            {
                RGBWithSize GetColor(House h)
                {
                    var outgoing = outgoingCommuters.Count(x => x.HouseGuid == h.HouseGuid);

                    if (outgoing > 0)
                    {
                        return(new RGBWithSize(Constants.Red, outgoing + 10));
                    }

                    return(new RGBWithSize(Constants.Black, 10));
                }

                var mapPoints = houses.Select(x => x.GetMapPointWithSize(GetColor)).ToList();

                var filename      = MakeAndRegisterFullFilename("OutgoingCommutersMap.svg", Name, "", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("Arbeiter", Constants.Red),
                    new MapLegendEntry("Keine Pendler", Constants.Black)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries, MyStage);
            }
        }
        protected override void MakeVisualization([NotNull] ScenarioSliceParameters slice, bool isPresent)
        {
            var dbHouses       = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice);
            var dbRaw          = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice);
            var houses         = dbHouses.Fetch <House>();
            var pvPotentials   = dbHouses.Fetch <PVPotential>();
            var heatingsystems = dbHouses.Fetch <HeatingSystemEntry>();
            List <SonnenDach>           sonnendach = dbRaw.Fetch <SonnenDach>();
            HashSet <string>            houseGuidsForSystemsWithPV = new HashSet <string>();
            Dictionary <string, double> pvPotentialByHouseGuid     = new Dictionary <string, double>();

            foreach (var house in houses)
            {
                pvPotentialByHouseGuid.Add(house.Guid, 0);
            }

            foreach (var pvpot in pvPotentials)
            {
                if (!houseGuidsForSystemsWithPV.Contains(pvpot.HouseGuid) && pvpot.SonnendachStromErtrag > 0)
                {
                    houseGuidsForSystemsWithPV.Add(pvpot.HouseGuid);
                }

                pvPotentialByHouseGuid[pvpot.HouseGuid] += pvpot.SonnendachStromErtrag;
            }

            PVPotentialSankey();
            MakePhotovoltaicDemandComparison();
            MakePvSystemSankey();
            MakePhotovoltaicSystemMap();
            MakePvPowerSankey();
            MakeHousePhotovotaikPoowerAufHousesMitLocalnet();
            MakeHousePhotovotaikAufHouses();
            MakeHousePhotovotaikAufHousesMitLocalnet();

            void PVPotentialSankey()
            {
                var          ssa = new SingleSankeyArrow("PVPotentialSankey", 1000, MyStage, SequenceNumber, Name, slice, Services);
                const double fac = 1_000_000;
                double       sonnendachPotential = sonnendach.Sum(x => x.stromertrag);

                ssa.AddEntry(new SankeyEntry("PVPotential", sonnendachPotential / fac, 5000, Orientation.Straight));
                var housesPotential = houses.Sum(x => pvPotentialByHouseGuid[x.Guid]);
                var diff            = sonnendachPotential - housesPotential;

                ssa.AddEntry(new SankeyEntry("Auf Häusern", housesPotential * -1 / fac, 5000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Sonstiges", diff / fac * -1, 5000, Orientation.Down));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeHousePhotovotaikAufHousesMitLocalnet()
            {
                var ssa = new SingleSankeyArrow("HouseSankeyFürPvZuordnungMitLocalnet",
                                                1000,
                                                MyStage,
                                                SequenceNumber,
                                                nameof(PVPotentialSankey),
                                                slice,
                                                Services);

                ssa.AddEntry(new SankeyEntry("Complexes", houses.Count, 5000, Orientation.Straight));
                var housesMitGebäude      = houses.Where(x => houseGuidsForSystemsWithPV.Contains(x.Guid) && x.GebäudeObjectIDs.Count > 0).ToList();
                var countHousesMitGebäude = housesMitGebäude.Count;
                var housesTotal           = houses.Count;

                ssa.AddEntry(new SankeyEntry("Gebäude mit Objektids und PV", countHousesMitGebäude * -1, 5000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Gebäude ohne Objektids und/oder ohne PV",
                                             (housesTotal - countHousesMitGebäude) * -1,
                                             5000,
                                             Orientation.Down));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeHousePhotovotaikAufHouses()
            {
                var ssa = new SingleSankeyArrow("HouseSankeyFürPvZuordnung", 1000, MyStage, SequenceNumber, Name, slice, Services);

                ssa.AddEntry(new SankeyEntry("Complexes", houses.Count, 5000, Orientation.Straight));
                var housesMitGebäude      = houses.Where(x => houseGuidsForSystemsWithPV.Contains(x.Guid)).ToList();
                var countHousesMitGebäude = housesMitGebäude.Count;
                var housesTotal           = houses.Count;

                ssa.AddEntry(new SankeyEntry("Gebäude mit PV", countHousesMitGebäude * -1, 5000, Orientation.Up));
                ssa.AddEntry(new SankeyEntry("Gebäude ohne PV", (housesTotal - countHousesMitGebäude) * -1, 5000, Orientation.Down));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakePhotovoltaicSystemMap()
            {
                RGB GetColor(House h)
                {
                    if (pvPotentials.Any(x => x.HouseGuid == h.Guid))
                    {
                        return(Constants.Green);
                    }

                    return(Constants.Blue);
                }

                var mapColors = houses.Select(x => x.GetMapColorForHouse(GetColor)).ToList();

                var filename      = MakeAndRegisterFullFilename("PotentialPVSystems.png", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("Hat PV Potential", Constants.Green),
                    new MapLegendEntry("Hat kein PV", Constants.Blue),
                    new MapLegendEntry("Hat kein Daten", Constants.Red)
                };

                Services.PlotMaker.MakeOsmMap(Name, filename, mapColors, new List <WgsPoint>(), legendEntries, new List <LineEntry>());
                SaveToPublicationDirectory(filename, slice, "4");
            }

            void MakePvSystemSankey()
            {
                var ssa = new SingleSankeyArrow("HousePVPotentialSystems", 1500, MyStage, SequenceNumber, Name, slice, Services);

                ssa.AddEntry(new SankeyEntry("Houses", houses.Count, 5000, Orientation.Straight));
                var houseguidsWithPV = pvPotentials.Select(x => x.HouseGuid).Distinct().ToList();

                ssa.AddEntry(new SankeyEntry("PVSystems", houseguidsWithPV.Count * -1, 2000, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Kein PV", (houses.Count - houseguidsWithPV.Count) * -1, 2000, Orientation.Straight));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakePvPowerSankey()
            {
                var          sonnendachRaw = dbRaw.Fetch <SonnenDach>();
                double       rawSum        = sonnendachRaw.Sum(x => x.stromertrag);
                const double fac           = 1_000_000;
                var          ssa           = new SingleSankeyArrow("HousePVPowerSystems", 1500, MyStage, SequenceNumber, Name, slice, Services);
                var          installed     = pvPotentials.Sum(x => x.SonnendachStromErtrag);

                ssa.AddEntry(new SankeyEntry("Gesamt", rawSum / fac, 5000, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("PV Systems", installed * -1 / fac, 2000, Orientation.Straight));
                ssa.AddEntry(new SankeyEntry("Kein PV", (rawSum - installed) * -1 / fac, 2000, Orientation.Down));
                Services.PlotMaker.MakeSankeyChart(ssa);
            }

            void MakeHousePhotovotaikPoowerAufHousesMitLocalnet()
            {
                var ssa = new SingleSankeyArrow("HouseSankeyFürPvPowerZuordnung", 1000, MyStage, SequenceNumber, Name, slice, Services);

                ssa.AddEntry(new SankeyEntry("Complexes", houses.Count, 5000, Orientation.Straight));
                var housesMitGebäude      = houses.Where(x => houseGuidsForSystemsWithPV.Contains(x.Guid) && x.GebäudeObjectIDs.Count > 0).ToList();
                var countHousesMitGebäude = housesMitGebäude.Count;
                var housesTotal           = houses.Count;

                ssa.AddEntry(new SankeyEntry("Gebäude mit Objektids und PV", countHousesMitGebäude * -1, 5000, Orientation.Up));
                ssa.AddEntry(
                    new SankeyEntry("Gebäude ohne Objektids und ohne PV", (housesTotal - countHousesMitGebäude) * -1, 5000, Orientation.Down));
                Services.PlotMaker.MakeSankeyChart(ssa);

                RGB GetColor(House h)
                {
                    if (h.GebäudeObjectIDs.Count > 0 && houseGuidsForSystemsWithPV.Contains(h.Guid))
                    {
                        return(new RGB(255, 0, 0));
                    }

                    if (h.GebäudeObjectIDs.Count > 0)
                    {
                        return(new RGB(0, 0, 255));
                    }

                    return(new RGB(0, 255, 0));
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("MapPVWithLocalnet.svg", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("Localnet und Solar", 255, 0, 0),
                    new MapLegendEntry("Localnet Daten verfügbar", 0, 0, 255),
                    new MapLegendEntry("Rest", 0, 255, 0)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }

            void MakePhotovoltaicDemandComparison()
            {
                var differenceInPower = new List <double>();

                foreach (var heatingSystemEntry in heatingsystems)
                {
                    if (heatingSystemEntry.OriginalHeatingSystemType == HeatingSystemType.GasheatingLocalnet)
                    {
                        continue;
                    }

                    var pvpotentialentries = pvPotentials.Where(x => x.HouseGuid == heatingSystemEntry.HouseGuid).ToList();
                    var energysum          = pvpotentialentries.Sum(x => x.SonnendachBedarfHeizung + x.SonnendachBedarfWarmwasser);
                    var h = houses.Single(x => x.Guid == heatingSystemEntry.HouseGuid);
                    if (energysum > 0 && heatingSystemEntry.EffectiveEnergyDemand > 0 && h.EnergieBezugsFläche > 0)
                    {
                        var diff = (energysum - heatingSystemEntry.EffectiveEnergyDemand) / h.EnergieBezugsFläche;
                        if (diff > 500)
                        {
                            diff = 500;
                        }

                        if (diff < -500)
                        {
                            diff = -500;
                        }

                        differenceInPower.Add(diff);
                    }
                }

                differenceInPower.Sort();
                var barSeries = new List <BarSeriesEntry>();
                var bs        = BarSeriesEntry.MakeBarSeriesEntry("differences");

                bs.Values.AddRange(differenceInPower);
                barSeries.Add(bs);
                var filename = MakeAndRegisterFullFilename("ComparisonSonnendachVsReal.svg", slice);
                var labes    = new List <string>();

                Services.PlotMaker.MakeBarChart(filename, "ComparisonSonnendachVsReal", barSeries, labes, ExportType.SVG);
            }
        }
Exemplo n.º 30
0
        protected override void MakeVisualization([NotNull] ScenarioSliceParameters slice,
                                                  bool isPresent)
        {
            var dbHouse    = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, slice);
            var houses     = dbHouse.Fetch <House>();
            var households = dbHouse.Fetch <Household>();

            if (households.Count == 0)
            {
                throw new FlaException("Not a single household");
            }
            MakeAgeHistogram();
            MakePeopleCountMap2();
            MakeFamilySizeSankey();
            MakePeopleCountMap();
            MakeAgeMap();

            void MakeAgeHistogram()
            {
                List <Occupant> occupants  = households.SelectMany(x => x.Occupants).ToList();
                double          maxAge     = occupants.Max(x => x.Age);
                var             histogram  = new Histogram();
                const int       bucketSize = 5;

                for (var i = 0; i < maxAge; i += bucketSize)
                {
                    histogram.AddBucket(new Bucket(i, i + bucketSize));
                }

                var ages = occupants.Select(x => (double)x.Age).ToList();

                histogram.AddData(ages);
                var filename = MakeAndRegisterFullFilename("Altersverteilung.png", slice);
                var bs       = BarSeriesEntry.MakeBarSeriesEntry(histogram, out var colNames);
                var bss      = new List <BarSeriesEntry> {
                    bs
                };

                Services.PlotMaker.MakeBarChart(filename, "Anzahl von Personen in diesem Altersbereich", bss, colNames);
            }

            void MakeFamilySizeSankey()
            {
                var ssa = new SingleSankeyArrow("Households", 1000, MyStage, SequenceNumber,
                                                Name, slice, Services);

                ssa.AddEntry(new SankeyEntry("Households", houses.Count, 5000, Orientation.Straight));
                var counts    = households.Select(x => x.Occupants.Count).ToList();
                var maxSize   = counts.Max();
                var filename  = MakeAndRegisterFullFilename("HouseholdSizeHistogram.png", slice);
                var names     = new List <string>();
                var barSeries = new List <BarSeriesEntry>();

                for (var i = 0; i < maxSize + 1; i++)
                {
                    names.Add(i.ToString());
                    var j     = i; // because of closure
                    var count = counts.Count(x => x == j);
                    barSeries.Add(BarSeriesEntry.MakeBarSeriesEntry(i + "Personen", count, i));
                }

                Services.PlotMaker.MakeBarChart(filename, "HouseholdSizeHistogram", barSeries, names);
            }

            void MakePeopleCountMap()
            {
                RGB GetColor(House h)
                {
                    var hhs         = households.Where(x => x.HouseGuid == h.Guid).ToList();
                    var peopleCount = hhs.Select(x => x.Occupants.Count).Sum();

                    if (peopleCount == 0)
                    {
                        return(new RGB(128, 128, 128));
                    }

                    if (peopleCount == 1)
                    {
                        return(Constants.Green);
                    }

                    if (peopleCount == 2)
                    {
                        return(Constants.Blue);
                    }

                    return(Constants.Red);
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("AnzahlPersonenProHaushalt.svg", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("Keine Einwohner", new RGB(128, 128, 128)),
                    new MapLegendEntry("Ein Einwohner", Constants.Green),
                    new MapLegendEntry("Zwei Einwohner", Constants.Blue),
                    new MapLegendEntry("Drei+ Einwohner", Constants.Red)
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }

            void MakePeopleCountMap2()
            {
                var maxCount = 0;

                foreach (var house in houses)
                {
                    var hhs      = households.Where(x => x.HouseGuid == house.Guid).ToList();
                    var sumCount = hhs.Sum(x => x.Occupants.Count);
                    if (maxCount < sumCount)
                    {
                        maxCount = sumCount;
                    }
                }

                var    colorStep = 250.0 / maxCount;
                double color     = 0;
                var    colorDict = new Dictionary <int, int>();

                for (var i = 1; i <= maxCount; i++)
                {
                    colorDict.Add(i, (int)color);
                    color += colorStep;
                }

                RGBWithSize GetColor(House h)
                {
                    var hhs         = households.Where(x => x.HouseGuid == h.Guid).ToList();
                    var peopleCount = hhs.Select(x => x.Occupants.Count).Sum();

                    if (peopleCount == 0)
                    {
                        return(new RGBWithSize(128, 128, 128, 10));
                    }

                    var red  = colorDict[peopleCount];
                    var size = 10;

                    if (peopleCount > size)
                    {
                        size = peopleCount;
                    }

                    return(new RGBWithSize(red, 0, 0, size));
                }

                var mapPoints     = houses.Select(x => x.GetMapPointWithSize(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("AnzahlPersonenProHaushaltRelative.svg", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("Keine Einwohner", new RGB(128, 128, 128))
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }

            void MakeAgeMap()
            {
                RGB GetColor(House h)
                {
                    var    hhs            = households.Where(x => x.HouseGuid == h.Guid).ToList();
                    var    houseoccupants = hhs.SelectMany(x => x.Occupants).ToList();
                    double averageAge     = 0;

                    if (houseoccupants.Count > 0)
                    {
                        averageAge = houseoccupants.Average(x => x.Age);
                    }

                    if (houseoccupants.Count == 0)
                    {
                        return(new RGB(128, 128, 128));
                    }

                    var agefactor = averageAge / 100;

                    if (agefactor > 1)
                    {
                        agefactor = 1;
                    }
                    return(new RGB((int)(255.0 * agefactor), 0, 0));
                }

                var mapPoints     = houses.Select(x => x.GetMapPoint(GetColor)).ToList();
                var filename      = MakeAndRegisterFullFilename("Durchschnittsalter.svg", slice);
                var legendEntries = new List <MapLegendEntry> {
                    new MapLegendEntry("Keine Einwohner", new RGB(128, 128, 128)),
                    new MapLegendEntry("0 Jahre Durchschnittsalter", new RGB(0, 0, 0)),
                    new MapLegendEntry("100 Jahre Durchschnittsalter", new RGB(255, 0, 0))
                };

                Services.PlotMaker.MakeMapDrawer(filename, Name, mapPoints, legendEntries);
            }
        }