/// <summary>
        /// This method visits a KML LatLonQuad element
        /// </summary>
        /// <param name="element">LatLonQuad KML element to be visited</param>
        protected void VisitLatLonQuad(XmlElement element)
        {
            if (element == null)
            {
                return;
            }

            var coordinates = GetChildElementText(element, "coordinates");

            var points = ParseCoordinates(coordinates);

            if (points == null || points.Count != 4)
            {
                throw new KMLException("In KML element LatLonQuad has to have exactly the 4 coordinates.");
            }

            // Closes the polygon. Stores the last point the same as the first one.
            points.Add(points[0].Clone());

            var llq = new LatLonQuad();

            llq.Points.Clear();
            llq.Points.AddRange(points);

            Geographies.Add(llq);
        }
        /// <summary>
        /// This method visits a KML MultiGeometry element
        /// </summary>
        /// <param name="element">KML MultiGeometry element to be visited</param>
        protected void VisitMultiGeometry(XmlElement element)
        {
            if (element == null)
            {
                return;
            }

            var mg = new MultiGeometry();

            if (element.HasChildNodes)
            {
                foreach (XmlNode child in element.ChildNodes)
                {
                    var lastIndexBefore = Geographies.Count - 1;

                    Visit(child);

                    var lastIndex = Geographies.Count - 1;

                    if (lastIndex > lastIndexBefore)
                    {
                        var childGeography = Geographies[lastIndex];
                        Geographies.RemoveAt(lastIndex);
                        mg.Geographies.Add(childGeography);
                    }
                }
            }

            // Sets the geography instance context
            mg.Context = (element.ParentNode != null) ? element.ParentNode.OuterXml : element.OuterXml;

            Geographies.Add(mg);
        }
        /// <summary>
        /// This method visits a KML LineString element
        /// </summary>
        /// <param name="elem">KML line string element to be visited</param>
        /// <param name="isLineRing">True if the line is the ring</param>
        protected void VisitLineString(
            XmlElement elem,
            bool isLineRing = false)
        {
            if (elem == null)
            {
                return;
            }

            XmlNode coordinates = GetFirstChild(elem, "coordinates");

            if (coordinates == null || !coordinates.HasChildNodes)
            {
                return;
            }

            var txt = coordinates.ChildNodes[0];

            var allCoordinates = txt.InnerText;

            var points = ParseCoordinates(allCoordinates);

            if (points == null || points.Count == 0)
            {
                return;
            }

            var ls = isLineRing ? new LinearRing() : new LineString();

            ls.Points.AddRange(points);

            var altitudeModeCode = GetAltitudeModeCode(elem);

            foreach (var p in ls.Points)
            {
                p.Measure = altitudeModeCode;
            }

            // Extract other non-geographic data
            VisitGeography(elem, ls);

            #region Handle tessellate flag

            ls.StoreTessellateFlag();

            #endregion

            // Sets the geography instance context
            ls.Context = (elem.ParentNode != null) ? elem.ParentNode.OuterXml : elem.OuterXml;

            Geographies.Add(ls);
        }
        /// <summary>
        /// This method visits a KML LatLonAltBox element
        /// </summary>
        /// <param name="element">KML LatLonAltBox element to be visited</param>
        protected void VisitLatLonAltBox(XmlElement element)
        {
            if (element == null)
            {
                return;
            }

            #region Required properties

            var north = GetChildElementText <double>(element, "north");
            var south = GetChildElementText <double>(element, "south");
            var west  = GetChildElementText <double>(element, "west");
            var east  = GetChildElementText <double>(element, "east");

            #endregion

            #region Optional properties

            double minAltitude  = 0;
            double maxAltitude  = 0;
            var    minAltitudeS = GetChildElementText(element, "minAltitude");
            if (!string.IsNullOrEmpty(minAltitudeS))
            {
                minAltitude = double.Parse(minAltitudeS);
            }

            var maxAltitudeS = GetChildElementText(element, "maxAltitude");
            if (!string.IsNullOrEmpty(maxAltitudeS))
            {
                maxAltitude = double.Parse(maxAltitudeS);
            }

            var altitudeMode = GetAltitudeMode(element);

            #endregion

            var altBox = new LatLonAltBox
            {
                North        = north,
                South        = south,
                West         = west,
                East         = east,
                MinAltitude  = minAltitude,
                MaxAltitude  = maxAltitude,
                AltitudeMode = altitudeMode
            };

            Geographies.Add(altBox);
        }
        public void LoadGeographyData(StorageFile dataFile)
        {
            var document = new XmlDocument();

            document.Load(dataFile.LocalPath);

            var node = document.SelectSingleNode(@"./Age");

            if (node == null)
            {
                return;
            }
            foreach (XmlNode childNode in node.ChildNodes)
            {
                switch (childNode.Name)
                {
                case "Age":
                    Geographies.Add(ListDataItem.FromXml(childNode));
                    break;
                }
            }
        }
        /// <summary>
        /// This method visits a KML LatLonBox element
        /// </summary>
        /// <param name="element">KML LatLonBox element to be visited</param>
        protected void VisitLatLonBox(XmlElement element)
        {
            if (element == null)
            {
                return;
            }

            #region Required properties

            var north = GetChildElementText <double>(element, "north");
            var south = GetChildElementText <double>(element, "south");
            var west  = GetChildElementText <double>(element, "west");
            var east  = GetChildElementText <double>(element, "east");

            #endregion

            #region Optional properties

            double rotation = 0;

            var rotationS = GetChildElementText(element, "rotation");
            if (!string.IsNullOrEmpty(rotationS))
            {
                rotation = double.Parse(rotationS);
            }

            #endregion

            var altBox = new LatLonBox
            {
                North    = north,
                South    = south,
                West     = west,
                East     = east,
                Rotation = rotation
            };

            Geographies.Add(altBox);
        }
        /// <summary>
        /// This method visits a KML Point element
        /// </summary>
        /// <param name="elem">KML Point element to be visited</param>
        protected void VisitPoint(XmlElement elem)
        {
            if (elem == null)
            {
                return;
            }

            // Extracts the point coordinates
            var coordinates = GetFirstChild(elem, "coordinates");

            if (coordinates == null || !coordinates.HasChildNodes)
            {
                return;
            }

            var coordinatesTextNode = coordinates.ChildNodes[0];

            var coordinatesText = coordinatesTextNode.InnerText;

            var pts = ParseCoordinates(coordinatesText);

            if (pts.Count == 0)
            {
                return;
            }

            var point = pts[0];

            // Extracts the altitude mode
            point.Measure = GetAltitudeModeCode(elem);

            // Extracts the other non-geographic data
            VisitGeography(elem, point);

            // Sets the geography instance context
            point.Context = (elem.ParentNode != null) ? elem.ParentNode.OuterXml : elem.OuterXml;

            Geographies.Add(point);
        }
        public void LoadCombinedData(StorageFile dataFile)
        {
            var document = new XmlDocument();

            document.Load(dataFile.LocalPath);

            var node = document.SelectSingleNode(@"/TargetCustomers");

            if (node == null)
            {
                return;
            }
            foreach (XmlNode childNode in node.ChildNodes)
            {
                switch (childNode.Name)
                {
                case "SlideHeader":
                    Headers.Add(ListDataItem.FromXml(childNode));
                    break;

                case "Demo":
                    Demos.Add(ListDataItem.FromXml(childNode));
                    break;

                case "HHI":
                    HHIs.Add(ListDataItem.FromXml(childNode));
                    break;

                case "Geography":
                    Geographies.Add(ListDataItem.FromXml(childNode));
                    break;
                }
            }

            CombinedList.AddRange(Demos);
            CombinedList.AddRange(HHIs);
            CombinedList.AddRange(Geographies);
        }
        /// <summary>
        /// This method visits a KML element. Method extracts the child elements:
        /// Longitude, Latitude, Altitude and AltitudeMode and creates the point instance from those values.
        /// </summary>
        /// <param name="element">KML element to be visited</param>
        protected void VisitLonLatAltElement(XmlElement element)
        {
            double longitude = 0, latitude = 0, altitude = 0;
            int?   altitudeMode;

            try
            {
                var longitudeElem = GetFirstChild(element, "longitude");
                if (longitudeElem != null && longitudeElem.HasChildNodes)
                {
                    var s = longitudeElem.ChildNodes[0].InnerText;
                    longitude = double.Parse(s);
                }
                var latitudeElem = GetFirstChild(element, "latitude");
                if (latitudeElem != null && latitudeElem.HasChildNodes)
                {
                    var s = latitudeElem.ChildNodes[0].InnerText;
                    latitude = double.Parse(s);
                }
                var altitudeElem = GetFirstChild(element, "altitude");
                if (altitudeElem != null && altitudeElem.HasChildNodes)
                {
                    var s = altitudeElem.ChildNodes[0].InnerText;
                    altitude = double.Parse(s);
                }

                altitudeMode = GetAltitudeModeCode(element);
            }
            catch (Exception exc)
            {
                throw new KMLException("Location coordinates in wrong format!", exc);
            }

            var pt = new Point(longitude, latitude, altitude, altitudeMode);

            Geographies.Add(pt);
        }
    SeriesCollection GetVotingDayRankingData ()
    {
        GeographyBallotCoverageLookup lookup;
        lookup= GetLookupFromCache();

        Geographies geos = null;

        string circuitString = Request.QueryString["CircuitId"];
        int circuitId = 0;

        if (String.IsNullOrEmpty(Request.QueryString["CircuitId"]))
        {
            geos = Geographies.FromLevel(Country.FromCode("SE"), GeographyLevel.ElectoralCircuit);
        }
        else
        {
            circuitId = Int32.Parse(circuitString);
            Geographies candidateGeos = Geography.FromIdentity(circuitId).GetTree();
            geos = new Geographies();

            foreach (Geography geo in candidateGeos)
            {
                if (lookup.ContainsKey(geo.Identity) && geo.Identity != circuitId)
                {
                    geos.Add(geo);
                }
            }
        }

        GeographyBallotCoverageData data = new GeographyBallotCoverageData();
        foreach (Geography geo in geos)
        {
            if (lookup.ContainsKey(geo.Identity))
            {
                data.Add(lookup[geo.Identity]);
            }
        }

        data.Sort(
            delegate(GeographyBallotCoverageDataPoint p1, GeographyBallotCoverageDataPoint p2)
            {
                int i1 = (absoluteMode?p1.VotingStationsTotal: p1.WVotingStationsTotal) 
                        - (absoluteMode?p1.VotingStationsDistroSingle: p1.WVotingStationsDistroSingle);
                int i2 = (absoluteMode?p2.VotingStationsTotal: p2.WVotingStationsTotal) 
                        - (absoluteMode?p2.VotingStationsDistroSingle: p2.WVotingStationsDistroSingle);
                return i1.CompareTo(i2);
            });

        SeriesCollection collection = new SeriesCollection();

        Series seriesPositiveSingle = new Series();
        seriesPositiveSingle.Name = "Positive, single distro";

        Label2.Text = "(I hela Sverige saknar " + (lookup[Geography.SwedenId].VotingStationsTotal - lookup[Geography.SwedenId].VotingStationsDistroSingle).ToString("#,##0") + " väljare Piratpartiets valsedlar.)";

        if (circuitId != 0)
        {
            AddSingleVotingDayDataPoint(lookup[circuitId], seriesPositiveSingle);
        }

        seriesPositiveSingle.Elements.Add(new Element());

        foreach (GeographyBallotCoverageDataPoint dataPoint in data)
        {
            AddSingleVotingDayDataPoint(dataPoint, seriesPositiveSingle);
        }

        seriesPositiveSingle.DefaultElement.Color = System.Drawing.Color.Red;
        seriesPositiveSingle.DefaultElement.ShowValue = true;

        SeriesCollection result = new SeriesCollection();
        result.Add(seriesPositiveSingle);

        return result;
    }
        /// <summary>
        /// This method visits a KML Polygon element
        /// </summary>
        /// <param name="elem">KML Polygon element to be visited</param>
        protected void VisitPolygon(XmlElement elem)
        {
            if (elem == null)
            {
                return;
            }

            #region Extract Outer Border

            var outerBoundaryIs = GetFirstChild(elem, "outerBoundaryIs");
            if (outerBoundaryIs == null)
            {
                return;
            }

            var outerLinearRing = GetFirstChild(outerBoundaryIs, "LinearRing");
            if (outerLinearRing == null)
            {
                return;
            }

            var numOfGeographiesBefore = Geographies.Count;

            VisitLinearRing(outerLinearRing);

            var numOfGeographiesAfter = Geographies.Count;

            // Extracts the outer ring
            if (numOfGeographiesAfter == numOfGeographiesBefore)
            {
                throw new KMLException("Outer ring not found!");
            }

            var index = Geographies.Count - 1;
            var g     = Geographies[index];
            Geographies.RemoveAt(index);

            if (!(g is LinearRing outerRing))
            {
                throw new KMLException("Outer ring not created!");
            }

            var polygon = new Polygon();

            var isValidPolygon = true;

            #region Check outer ring orientation. Outer boundary should be oriented counter-clockwise

            if (!outerRing.IsValid)
            {
                // Checks if just the ring's orientation is wrong
                outerRing.SwitchOrientation();

                if (!outerRing.IsValid)
                {
                    isValidPolygon = false;
                    outerRing.SwitchOrientation();
                }
            }

            #endregion

            polygon.OuterRing = outerRing;

            #endregion

            #region Extract Inner Borders

            var innerBoundaryIsLst = elem.GetElementsByTagName("innerBoundaryIs");
            foreach (XmlNode innerBorderNode in innerBoundaryIsLst)
            {
                if (!(innerBorderNode is XmlElement innerBoundaryIs))
                {
                    continue;
                }

                var innerLinearRing = GetFirstChild(innerBoundaryIs, "LinearRing");
                if (innerLinearRing == null)
                {
                    continue;
                }

                numOfGeographiesBefore = Geographies.Count;

                VisitLinearRing(innerLinearRing);

                numOfGeographiesAfter = Geographies.Count;

                // Extracts the inner ring
                if (numOfGeographiesBefore == numOfGeographiesAfter)
                {
                    throw new KMLException("Inner ring not found!");
                }

                index = Geographies.Count - 1;
                g     = Geographies[index];
                Geographies.RemoveAt(index);

                if (!(g is LinearRing innerRing))
                {
                    throw new KMLException("Inner ring not created!");
                }

                #region Check the ring's orientation. Inner rings should be clockwise oriented

                if (isValidPolygon)
                {
                    if (innerRing.IsValid)
                    {
                        // The inner rings should be in the opposite direction from the outer ring

                        innerRing.SwitchOrientation();
                    }
                }

                #endregion

                polygon.InnerRing.Add(innerRing);
            }

            #endregion

            // Extracts the other non-geographic data
            VisitGeography(elem, polygon);

            #region Extract altitude mode

            var altitudeModeCode = GetAltitudeModeCode(elem);
            if (altitudeModeCode.HasValue)
            {
                // Updates all the points on the outer bound
                if (polygon.OuterRing != null)
                {
                    foreach (var p in polygon.OuterRing.Points)
                    {
                        p.Measure = altitudeModeCode;
                    }
                }

                // Update all the points on all the inner bounds
                if (polygon.InnerRing != null)
                {
                    foreach (var r in polygon.InnerRing)
                    {
                        if (r.Points == null)
                        {
                            return;
                        }

                        foreach (var p1 in r.Points)
                        {
                            p1.Measure = altitudeModeCode;
                        }
                    }
                }
            }

            #endregion

            #region Handles tessellate flag

            if (polygon.Tessellate)
            {
                polygon.OuterRing?.StoreTessellateFlag();

                if (polygon.InnerRing != null)
                {
                    foreach (var r in polygon.InnerRing)
                    {
                        r.StoreTessellateFlag();
                    }
                }
            }

            #endregion

            // Sets the geography instance context
            polygon.Context = (elem.ParentNode != null) ? elem.ParentNode.OuterXml : elem.OuterXml;

            Geographies.Add(polygon);
        }
    SeriesCollection GetVotingDayRankingData ()
    {
        GeographyBallotCoverageLookup lookup = GetLookupFromCache();
        Geographies geos = null;

        string circuitString = Request.QueryString["CircuitId"];
        int circuitId = 0;

        if (String.IsNullOrEmpty(circuitString) || Int32.Parse(circuitString) == Geography.SwedenId)
        {
            geos = Geographies.FromLevel(Country.FromCode("SE"), GeographyLevel.ElectoralCircuit);
        }
        else
        {
            circuitId = Int32.Parse(circuitString);
            Geographies candidateGeos = Geography.FromIdentity(circuitId).GetTree();
            geos = new Geographies();

            foreach (Geography geo in candidateGeos)
            {
                if (lookup.ContainsKey(geo.Identity) && geo.Identity != circuitId)
                {
                    geos.Add(geo);
                }
            }
        }
        Dictionary<int, Geography> geoLookup = new Dictionary<int, Geography>();
        foreach (Geography geo in geos)
            geoLookup[geo.Identity] = geo;

        GeographyBallotCoverageData data = new GeographyBallotCoverageData();
        foreach (Geography geo in geos)
        {
            if (lookup.ContainsKey(geo.Identity))
            {
                data.Add(lookup[geo.Identity]);
            }
        }

        bool sortByValue = cbSort.Checked;
        data.Sort(
            delegate(GeographyBallotCoverageDataPoint p1, GeographyBallotCoverageDataPoint p2)
            {
                if (sortByValue)
                {
                    if (advanceVotingMode)
                    {
                        double i1 = (absoluteMode ? p1.AdvanceVotingCoverage : p1.WWAdvanceVotingCoverage);
                        double i2 = (absoluteMode ? p2.AdvanceVotingCoverage : p2.WWAdvanceVotingCoverage);
                        return i1.CompareTo(i2);
                    }
                    else
                    {
                        double i1 = (absoluteMode ? p1.VotingCoverage : p1.WVotingCoverage);
                        double i2 = (absoluteMode ? p2.VotingCoverage : p2.WVotingCoverage);
                        return i1.CompareTo(i2);
                    }
                }
                else
                {
                    return geoLookup[p2.GeographyId].Name.CompareTo(geoLookup[p1.GeographyId].Name);
                }
            });



        SeriesCollection collection = new SeriesCollection();

        Series seriesPositiveSingle = new Series();
        seriesPositiveSingle.Name = "Positive, single distro";

        Series seriesPositiveDouble = new Series();
        seriesPositiveDouble.Name = "Positive, double distro";

        Series seriesPositiveFull = new Series();
        seriesPositiveFull.Name = "Positive, full coverage";

        Series seriesNegative = new Series();
        seriesNegative.Name = "Negative";

        // Add empties, then Sweden

        AddSingleVotingDayDataPoint(lookup[Geography.SwedenId], seriesPositiveSingle, seriesPositiveDouble, seriesPositiveFull, seriesNegative);

        if (circuitId != 0)
        {
            AddSingleVotingDayDataPoint(lookup[circuitId], seriesPositiveSingle, seriesPositiveDouble, seriesPositiveFull, seriesNegative);
        }

        seriesPositiveSingle.Elements.Add(new Element());
        seriesNegative.Elements.Add(new Element());

        foreach (GeographyBallotCoverageDataPoint dataPoint in data)
        {
            AddSingleVotingDayDataPoint(dataPoint, seriesPositiveSingle, seriesPositiveDouble, seriesPositiveFull, seriesNegative);
        }

        seriesPositiveSingle.DefaultElement.Color = System.Drawing.Color.Yellow;
        seriesPositiveDouble.DefaultElement.Color = System.Drawing.Color.YellowGreen;
        seriesPositiveFull.DefaultElement.Color = System.Drawing.Color.Green;
        seriesPositiveSingle.DefaultElement.ShowValue = true;
        seriesNegative.DefaultElement.Color = System.Drawing.Color.DarkRed;

        SeriesCollection result = new SeriesCollection();
        result.Add(seriesPositiveSingle);
        result.Add(seriesPositiveDouble);
        result.Add(seriesPositiveFull);
        result.Add(seriesNegative);

        return result;
    }
Esempio n. 13
0
    SeriesCollection GetVotingDayRankingData()
    {
        GeographyBallotCoverageLookup lookup = GetLookupFromCache();
        Geographies geos = null;

        string circuitString = Request.QueryString["CircuitId"];
        int    circuitId     = 0;

        if (String.IsNullOrEmpty(circuitString) || Int32.Parse(circuitString) == Geography.SwedenId)
        {
            geos = Geographies.FromLevel(Country.FromCode("SE"), GeographyLevel.ElectoralCircuit);
        }
        else
        {
            circuitId = Int32.Parse(circuitString);
            Geographies candidateGeos = Geography.FromIdentity(circuitId).GetTree();
            geos = new Geographies();

            foreach (Geography geo in candidateGeos)
            {
                if (lookup.ContainsKey(geo.Identity) && geo.Identity != circuitId)
                {
                    geos.Add(geo);
                }
            }
        }
        Dictionary <int, Geography> geoLookup = new Dictionary <int, Geography>();

        foreach (Geography geo in geos)
        {
            geoLookup[geo.Identity] = geo;
        }

        GeographyBallotCoverageData data = new GeographyBallotCoverageData();

        foreach (Geography geo in geos)
        {
            if (lookup.ContainsKey(geo.Identity))
            {
                data.Add(lookup[geo.Identity]);
            }
        }

        bool sortByValue = cbSort.Checked;

        data.Sort(
            delegate(GeographyBallotCoverageDataPoint p1, GeographyBallotCoverageDataPoint p2)
        {
            if (sortByValue)
            {
                if (advanceVotingMode)
                {
                    double i1 = (absoluteMode ? p1.AdvanceVotingCoverage : p1.WWAdvanceVotingCoverage);
                    double i2 = (absoluteMode ? p2.AdvanceVotingCoverage : p2.WWAdvanceVotingCoverage);
                    return(i1.CompareTo(i2));
                }
                else
                {
                    double i1 = (absoluteMode ? p1.VotingCoverage : p1.WVotingCoverage);
                    double i2 = (absoluteMode ? p2.VotingCoverage : p2.WVotingCoverage);
                    return(i1.CompareTo(i2));
                }
            }
            else
            {
                return(geoLookup[p2.GeographyId].Name.CompareTo(geoLookup[p1.GeographyId].Name));
            }
        });



        SeriesCollection collection = new SeriesCollection();

        Series seriesPositiveSingle = new Series();

        seriesPositiveSingle.Name = "Positive, single distro";

        Series seriesPositiveDouble = new Series();

        seriesPositiveDouble.Name = "Positive, double distro";

        Series seriesPositiveFull = new Series();

        seriesPositiveFull.Name = "Positive, full coverage";

        Series seriesNegative = new Series();

        seriesNegative.Name = "Negative";

        // Add empties, then Sweden

        AddSingleVotingDayDataPoint(lookup[Geography.SwedenId], seriesPositiveSingle, seriesPositiveDouble, seriesPositiveFull, seriesNegative);

        if (circuitId != 0)
        {
            AddSingleVotingDayDataPoint(lookup[circuitId], seriesPositiveSingle, seriesPositiveDouble, seriesPositiveFull, seriesNegative);
        }

        seriesPositiveSingle.Elements.Add(new Element());
        seriesNegative.Elements.Add(new Element());

        foreach (GeographyBallotCoverageDataPoint dataPoint in data)
        {
            AddSingleVotingDayDataPoint(dataPoint, seriesPositiveSingle, seriesPositiveDouble, seriesPositiveFull, seriesNegative);
        }

        seriesPositiveSingle.DefaultElement.Color     = System.Drawing.Color.Yellow;
        seriesPositiveDouble.DefaultElement.Color     = System.Drawing.Color.YellowGreen;
        seriesPositiveFull.DefaultElement.Color       = System.Drawing.Color.Green;
        seriesPositiveSingle.DefaultElement.ShowValue = true;
        seriesNegative.DefaultElement.Color           = System.Drawing.Color.DarkRed;

        SeriesCollection result = new SeriesCollection();

        result.Add(seriesPositiveSingle);
        result.Add(seriesPositiveDouble);
        result.Add(seriesPositiveFull);
        result.Add(seriesNegative);

        return(result);
    }
    SeriesCollection GetVotingDayRankingData()
    {
        GeographyBallotCoverageLookup lookup;

        lookup = GetLookupFromCache();

        Geographies geos = null;

        string circuitString = Request.QueryString["CircuitId"];
        int    circuitId     = 0;

        if (String.IsNullOrEmpty(Request.QueryString["CircuitId"]))
        {
            geos = Geographies.FromLevel(Country.FromCode("SE"), GeographyLevel.ElectoralCircuit);
        }
        else
        {
            circuitId = Int32.Parse(circuitString);
            Geographies candidateGeos = Geography.FromIdentity(circuitId).GetTree();
            geos = new Geographies();

            foreach (Geography geo in candidateGeos)
            {
                if (lookup.ContainsKey(geo.Identity) && geo.Identity != circuitId)
                {
                    geos.Add(geo);
                }
            }
        }

        GeographyBallotCoverageData data = new GeographyBallotCoverageData();

        foreach (Geography geo in geos)
        {
            if (lookup.ContainsKey(geo.Identity))
            {
                data.Add(lookup[geo.Identity]);
            }
        }

        data.Sort(
            delegate(GeographyBallotCoverageDataPoint p1, GeographyBallotCoverageDataPoint p2)
        {
            int i1 = (absoluteMode?p1.VotingStationsTotal: p1.WVotingStationsTotal)
                     - (absoluteMode?p1.VotingStationsDistroSingle: p1.WVotingStationsDistroSingle);
            int i2 = (absoluteMode?p2.VotingStationsTotal: p2.WVotingStationsTotal)
                     - (absoluteMode?p2.VotingStationsDistroSingle: p2.WVotingStationsDistroSingle);
            return(i1.CompareTo(i2));
        });

        SeriesCollection collection = new SeriesCollection();

        Series seriesPositiveSingle = new Series();

        seriesPositiveSingle.Name = "Positive, single distro";

        Label2.Text = "(I hela Sverige saknar " + (lookup[Geography.SwedenId].VotingStationsTotal - lookup[Geography.SwedenId].VotingStationsDistroSingle).ToString("#,##0") + " väljare Piratpartiets valsedlar.)";

        if (circuitId != 0)
        {
            AddSingleVotingDayDataPoint(lookup[circuitId], seriesPositiveSingle);
        }

        seriesPositiveSingle.Elements.Add(new Element());

        foreach (GeographyBallotCoverageDataPoint dataPoint in data)
        {
            AddSingleVotingDayDataPoint(dataPoint, seriesPositiveSingle);
        }

        seriesPositiveSingle.DefaultElement.Color     = System.Drawing.Color.Red;
        seriesPositiveSingle.DefaultElement.ShowValue = true;

        SeriesCollection result = new SeriesCollection();

        result.Add(seriesPositiveSingle);

        return(result);
    }