using System.Windows;
using System.Windows.Controls;
using ThinkGeo.MapSuite.SilverlightCore;
using ThinkGeo.MapSuite.SilverlightEdition;
using CSharp_Silverlight_HowDoISamples;
using System;
using System.Globalization;
using System.Collections.ObjectModel;
using System.Collections.Generic;
namespace CSharp_Silverlight_HowDoISamples.Samples
{
public partial class GetRoadInformationByRoadId : UserControl
{
private InMemoryFeatureLayer currentRoadLayer;
private InMemoryFeatureLayer adjacentRoadsLayer;
public GetRoadInformationByRoadId()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(GetRoadInformationByRoadId_Loaded);
}
void GetRoadInformationByRoadId_Loaded(object sender, RoutedEventArgs e)
{
Map1.MapUnit = GeographyUnit.DecimalDegree;
WorldMapKitWmsSilverlightOverlay baseOverlay = new WorldMapKitWmsSilverlightOverlay();
Map1.Overlays.Add(baseOverlay);
LayerOverlay overlay = new LayerOverlay();
Map1.Overlays.Add("routeOverlay", overlay);
currentRoadLayer = new InMemoryFeatureLayer();
currentRoadLayer.Open();
currentRoadLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = new LineStyle(new GeoPen(GeoColor.FromArgb(100, GeoColor.SimpleColors.Red), 6));
currentRoadLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
overlay.Layers.Add("currentRoadLayer", currentRoadLayer);
adjacentRoadsLayer = new InMemoryFeatureLayer();
adjacentRoadsLayer.Open();
adjacentRoadsLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = new LineStyle(new GeoPen(GeoColor.FromArgb(100, GeoColor.SimpleColors.Yellow), 6));
adjacentRoadsLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
overlay.Layers.Add("adjacentRoadsLayer", adjacentRoadsLayer);
Map1.CurrentExtent = new RectangleShape(-97.719413308724725, 30.265265470131723, -97.714209823235834, 30.261547928437082);
}
private void GetRoadInformation_Click(object sender, RoutedEventArgs e)
{
GeoDataService.GeoDataGettingClient client = new CSharp_Silverlight_HowDoISamples.GeoDataService.GeoDataGettingClient();
client.GetRouteSegmentByFeatureIdCompleted += new System.EventHandler(client_GetRouteSegmentByFeatureIdCompleted);
client.GetRouteSegmentByFeatureIdAsync(txtFeatureId.Text);
}
void client_GetRouteSegmentByFeatureIdCompleted(object sender, CSharp_Silverlight_HowDoISamples.GeoDataService.GetRouteSegmentByFeatureIdCompletedEventArgs e)
{
if (e.Error == null)
{
Dictionary routeSegment = e.Result;
RenderRoadInformation(routeSegment);
RenderAdjacentRoadsInformation(routeSegment);
}
}
private void RenderRoadInformation(Dictionary road)
{
string featureId = road["featureId"].Split(new string[] { "::" }, StringSplitOptions.RemoveEmptyEntries)[0];
RequestFeature(featureId);
txtStartPoint.Text = road["startPoint"];
txtEndPoint.Text = road["endPoint"];
switch (road["type"])
{
case "0":
txtRoadType.Text = "Local Road";
break;
case "1":
txtRoadType.Text = "Major Road";
break;
case "2":
txtRoadType.Text = "High Way";
break;
default:
break;
}
}
private void RequestFeature(string featureId)
{
GeoDataService.GeoDataGettingClient client = new CSharp_Silverlight_HowDoISamples.GeoDataService.GeoDataGettingClient();
client.GetFeatureByIdCompleted += new EventHandler(client_GetFeatureByIdCompleted);
client.GetFeatureByIdAsync(featureId);
}
void client_GetFeatureByIdCompleted(object sender, CSharp_Silverlight_HowDoISamples.GeoDataService.GetFeatureByIdCompletedEventArgs e)
{
if (e.Error == null)
{
string feature = e.Result;
currentRoadLayer.InternalFeatures.Clear();
Feature silverlightFeature = new Feature(BaseShape.CreateShapeFromWellKnownData(feature));
currentRoadLayer.InternalFeatures.Add(silverlightFeature);
LineShape line = ((MultilineShape)silverlightFeature.GetShape()).Lines[0];
txtLength.Text = Math.Round(line.GetLength(Map1.MapUnit, DistanceUnit.Meter), 4).ToString(CultureInfo.InvariantCulture);
Map1.Refresh();
}
}
private void RenderAdjacentRoadsInformation(Dictionary road)
{
ObservableCollection featureIds = new ObservableCollection();
foreach (string id in road["startAdjacentIds"].Split('_'))
{
featureIds.Add(id);
}
foreach (string id in road["endAdjacentIds"].Split('_'))
{
featureIds.Add(id);
}
GeoDataService.GeoDataGettingClient client = new CSharp_Silverlight_HowDoISamples.GeoDataService.GeoDataGettingClient();
client.GetFeaturesByIdsCompleted += new EventHandler(client_GetFeaturesByIdsCompleted);
client.GetFeaturesByIdsAsync(featureIds);
}
void client_GetFeaturesByIdsCompleted(object sender, CSharp_Silverlight_HowDoISamples.GeoDataService.GetFeaturesByIdsCompletedEventArgs e)
{
if (e.Error == null)
{
Collection features = e.Result;
adjacentRoadsLayer.InternalFeatures.Clear();
foreach (string wkt in features)
{
Feature silverlightFeature = new Feature(BaseShape.CreateShapeFromWellKnownData(wkt));
adjacentRoadsLayer.InternalFeatures.Add(silverlightFeature);
}
Map1.Refresh();
}
}
}
}