void request_MapDataDownloadCompleted(object sender, DownloadStringCompletedEventArgs e) { KMLFeed feed = currentFeed; currentFeed = null; // let the next one go ... if (e.Error != null) { Console.WriteLine("Error : " + e.Error.Message); return; } Console.Error.WriteLine("Success : "); XDocument xDoc = XDocument.Parse(e.Result); XNamespace ns = xDoc.Root.Attributes("xmlns").First().Value;//http://earth.google.com/kml/2.1"; // seems some are 2.2 if (xDoc.Descendants(ns + "Polygon").Count() > 0) { var elements = from results in xDoc.Descendants(ns + "Placemark") select new PlaceMarkRegion { description = results.Element(ns + "description").Value, // Polygon, outerBoundaryIs, LinearRing, coordinates coords = results.Element(ns + "Polygon").Element(ns + "outerBoundaryIs").Element(ns + "LinearRing").Element(ns + "coordinates").Value }; feed.RefMapLayer = new MapLayer(); feed.IsRegionData = true; foreach (PlaceMarkRegion reg in elements) { MapRegionControl polygon = new MapRegionControl(); polygon.Tag = reg.description; polygon.Locations = new LocationCollection(); foreach (Location loc in reg.coordList) { polygon.Locations.Add(loc); } feed.RefMapLayer.Children.Add(polygon); } } else { var elements = from results in xDoc.Descendants(ns + "Placemark") select new PlaceMark { Id = results.Element(ns + "description").Value, FeedId = feed.ID, IsSystem = feed.IsSystem, Name = results.Element(ns + "name").Value, Coords = results.Element(ns + "Point").Element(ns + "coordinates").Value }; ImageBrush brush = null; if (feed.Icon != null) { brush = new ImageBrush(); brush.ImageSource = new BitmapImage(new Uri(feed.Icon)); } feed.RefMapLayer = new MapLayer(); feed.IsRegionData = false; foreach (PlaceMark elem in elements) { if (brush != null) { Pushpin pin = new Pushpin(); pin.Background = brush; pin.MouseLeftButtonUp += pin_MouseLeftButtonUp; pin.Tag = elem; pin.Name = Guid.NewGuid().ToString(); pin.RenderTransform = new CompositeTransform(); (pin.RenderTransform as CompositeTransform).TranslateY = -300; pin.Loaded += (loadedSender, loadedEventArgs) => { Pushpin currentPin = loadedSender as Pushpin; Guid random = new Guid(currentPin.Name); byte[] bytes = random.ToByteArray(); int seed = BitConverter.ToInt32(bytes, 0); Random fromValueRandom = new Random(seed); Random durationRandom = new Random(seed); var storyboard = new Storyboard(); var translateAnimation = new DoubleAnimation() { From = -fromValueRandom.Next(100, 400), To = 0, Duration = TimeSpan.FromMilliseconds(durationRandom.Next(1000, 5000)), EasingFunction = new CircleEase() { EasingMode = EasingMode.EaseInOut } }; translateAnimation.SetValue(Storyboard.TargetNameProperty, currentPin.Name); translateAnimation.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.TranslateY)")); storyboard.Children.Add(translateAnimation); Resources.Add(currentPin.Name, storyboard); storyboard.Begin(); }; feed.RefMapLayer.AddChild(pin, elem.Location, PositionOrigin.BottomCenter); string hint = elem.Id.Replace("<br/>", "\n"); ToolTipService.SetToolTip(pin, hint); } else { Pushpin pin = new Pushpin(); pin.Location = elem.Location; pin.Height = pin.Width = 22; pin.Tag = elem; feed.RefMapLayer.AddChild(pin, elem.Location,PositionOrigin.BottomCenter); } } } // we are seperating region layers from points, so everything stacks nicely if (feed.IsRegionData) { regionsMapLayer.Children.Add(feed.RefMapLayer); } else { pointsMapLayer.Children.Add(feed.RefMapLayer); } }
void onLoadRegionData(object sender, DownloadStringCompletedEventArgs e) { if (e.Error != null) { Console.Error.WriteLine(e.Error.Message); return; } XmlReaderSettings settings = new XmlReaderSettings(); settings.DtdProcessing = DtdProcessing.Ignore; XmlReader reader = XmlReader.Create(new StringReader(e.Result), settings); SyndicationFeed feed = SyndicationFeed.Load(reader); List<KMLFeed> kmlFeedList = new List<KMLFeed>(); KMLFeed emptyFeed = new KMLFeed(); emptyFeed.Title = MainPageResource.HideallMapAttributes; emptyFeed.Link = null; kmlFeedList.Add(emptyFeed); foreach (SyndicationItem item in feed.Items) { KMLFeed kFeed = new KMLFeed(); kFeed.ID = item.Id; kFeed.Title = item.Title.Text; kFeed.Summary = item.Summary.Text; kFeed.IsSystem = true; foreach (SyndicationLink link in item.Links) { if (link.RelationshipType == "enclosure") { if (link.MediaType == "application/vnd.google-earth.kml+xml") { if (link.Uri.IsAbsoluteUri) { kFeed.Link = link.Uri.ToString(); } else { kFeed.Link = BaseURL + link.Uri.ToString(); } } else if (link.MediaType == "image/png") { kFeed.Icon = link.Uri.ToString(); } } } // we discard the item if it does NOT have a kml link if (kFeed.Link != null) { kmlFeedList.Add(kFeed); } } lbRegionFeeds.ItemsSource = kmlFeedList; }
// TODO: Put this in service.Feeds or something private void CreateMapLayer(KMLFeed feed) { if (feed.Link == null) { // special case for the empty radio button to hide all return; } if (currentFeed == null) { currentFeed = feed; // one at a time WebClient client = new WebClient(); client.DownloadStringCompleted += request_MapDataDownloadCompleted; client.DownloadStringAsync(new Uri(feed.Link)); } else { //throw new Exception("one at a time"); } }
void InitSocialFeeds() { KMLFeed communityFeed = new KMLFeed(); communityFeed.Title = MainPageResource.SharedLandmarks; communityFeed.Icon = "Images/icon_star.png"; communityFeed.RefMapLayer = communityMapLayer; lbSocialFeeds.Items.Add(communityFeed); KMLFeed twitFeed = new KMLFeed(); twitFeed.Title = MainPageResource.NearbyTweets; twitFeed.Icon = BaseURL + "Images/TwitterSignin.png"; twitFeed.RefMapLayer = twitterMapLayer; lbSocialFeeds.Items.Add(twitFeed); Service.User.GetUser(); }
void User_AuthUpdate(UserController sender) { if (sender.IsAuthenticated) { // TODO: feed should be generic, not always KML KMLFeed feed = new KMLFeed(); feed.Title = MainPageResource.YourLandmarks; feed.Icon = Service.User.currentUser.profile_image_url; feed.RefMapLayer = currentUserMapLayer; lbSocialFeeds.Items.Insert(0, feed); // we want it FIRST in the list socialStackPanel.Visibility = Visibility.Visible; btnAddLandmark.Visibility = Visibility.Visible; this.currentUserBadge.CurrentUser = sender.currentUser; InitUserLandmarkLayers(); } else { btnAddLandmark.Visibility = Visibility.Collapsed; this.currentUserBadge.CurrentUser = null; } }