/// <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; }
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); }