using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using ThinkGeo.MapSuite.SilverlightCore;
using ThinkGeo.MapSuite.SilverlightEdition;
namespace CSharp_Silverlight_HowDoISamples.Samples
{
public partial class IntermediatePointsSupport : UserControl
{
private SimpleMarkerOverlay markerOverlay;
private InMemoryFeatureLayer routeLayer;
private bool isRequestEnded;
public IntermediatePointsSupport()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(IntermediatePointsSupport_Loaded);
}
void IntermediatePointsSupport_Loaded(object sender, RoutedEventArgs e)
{
Map1.MapUnit = GeographyUnit.DecimalDegree;
WorldMapKitWmsSilverlightOverlay baseOverlay = new WorldMapKitWmsSilverlightOverlay();
Map1.Overlays.Add(baseOverlay);
markerOverlay = new SimpleMarkerOverlay();
Map1.Overlays.Add("SimpleMarkerOverlay", markerOverlay);
// Add the start and end flag
string[] startPointString = txtStartPoint.Text.Split(',');
RenderMarker(new PointShape(double.Parse(startPointString[0], CultureInfo.InvariantCulture), double.Parse(startPointString[1], CultureInfo.InvariantCulture)), "start");
string[] endPointString = txtEndPoint.Text.Split(',');
RenderMarker(new PointShape(double.Parse(endPointString[0], CultureInfo.InvariantCulture), double.Parse(endPointString[1], CultureInfo.InvariantCulture)), "end");
// Render intermediat point
string[] pointString = txtIntermediatePoint.Text.Split(',');
Marker marker = new Marker(new PointShape(double.Parse(pointString[0], CultureInfo.InvariantCulture), double.Parse(pointString[1], CultureInfo.InvariantCulture)));
marker.ImageSource = new BitmapImage(new Uri("/theme/StopMarker.png", UriKind.RelativeOrAbsolute));
marker.Text = "1";
marker.TextOffsetX = -5.0;
marker.TextOffsetY = -23.0;
marker.ImageOffsetX = -10.0;
marker.ImageOffsetY = -25.0;
marker.ImageWidth = 17.0;
marker.ImageHeight = 25.0;
markerOverlay.Markers.Add("Intermediate", marker);
routeLayer = new InMemoryFeatureLayer();
routeLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = new LineStyle(new GeoPen(GeoColor.FromArgb(100, GeoColor.StandardColors.Purple), 5));
routeLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.OuterPen.LineJoin = DrawingLineJoin.Round;
routeLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.OuterPen.StartCap = GeoDashCap.Round;
routeLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.OuterPen.EndCap = GeoDashCap.Round;
routeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
LayerOverlay routeOverlay = new LayerOverlay();
routeOverlay.Layers.Add("routeLayer", routeLayer);
Map1.Overlays.Add("RouteOverlay", routeOverlay);
Map1.CurrentExtent = new RectangleShape(-97.767606539917, 30.3307351959229, -97.7040918304443, 30.2854165924072);
chkRouteMiddlePoint_Unchecked(null, null);
}
private void chkRouteMiddlePoint_Checked(object sender, RoutedEventArgs e)
{
routeLayer.InternalFeatures.Clear();
GeoDataService.GeoDataGettingClient client = new CSharp_Silverlight_HowDoISamples.GeoDataService.GeoDataGettingClient();
client.GetRouteByCoordinateCompleted += new EventHandler(client_GetRouteByCoordinateCompleted);
client.GetRouteByCoordinateAsync(txtStartPoint.Text, txtIntermediatePoint.Text);
isRequestEnded = true;
}
private void chkRouteMiddlePoint_Unchecked(object sender, RoutedEventArgs e)
{
GeoDataService.GeoDataGettingClient client = new CSharp_Silverlight_HowDoISamples.GeoDataService.GeoDataGettingClient();
client.GetRouteByCoordinateCompleted += new EventHandler(client_GetRouteByCoordinateCompleted);
client.GetRouteByCoordinateAsync(txtStartPoint.Text, txtEndPoint.Text);
}
void client_GetRouteByCoordinateCompleted(object sender, CSharp_Silverlight_HowDoISamples.GeoDataService.GetRouteByCoordinateCompletedEventArgs e)
{
if (e.Error == null)
{
string wkt = e.Result;
LineShape route = LineShape.CreateShapeFromWellKnownData(wkt) as LineShape;
if (chkRouteMiddlePoint.IsChecked == false)
{
routeLayer.InternalFeatures.Clear();
}
routeLayer.InternalFeatures.Add(new Feature(route));
Map1.Refresh();
}
if (isRequestEnded)
{
GeoDataService.GeoDataGettingClient client = new CSharp_Silverlight_HowDoISamples.GeoDataService.GeoDataGettingClient();
client.GetRouteByCoordinateCompleted += new EventHandler(client_GetRouteByCoordinateCompleted);
client.GetRouteByCoordinateAsync(txtIntermediatePoint.Text, txtEndPoint.Text);
isRequestEnded = false;
}
}
internal void GetStartPointByFeatureId(string featureId)
{
GeoDataService.GeoDataGettingClient client = new CSharp_Silverlight_HowDoISamples.GeoDataService.GeoDataGettingClient();
client.GetPointShapeByIdCompleted += new EventHandler(client_GetStartPointShapeByIdCompleted);
client.GetPointShapeByIdAsync(featureId);
}
void client_GetStartPointShapeByIdCompleted(object sender, CSharp_Silverlight_HowDoISamples.GeoDataService.GetPointShapeByIdCompletedEventArgs e)
{
if (e.Error == null)
{
string[] positions = e.Result.Split(',');
PointShape pointShape = new PointShape(double.Parse(positions[0], CultureInfo.InvariantCulture), double.Parse(positions[1], CultureInfo.InvariantCulture));
RenderMarker(pointShape, "start");
}
}
internal void GetEndPointByFeatureId(string featureId)
{
GeoDataService.GeoDataGettingClient client = new CSharp_Silverlight_HowDoISamples.GeoDataService.GeoDataGettingClient();
client.GetPointShapeByIdCompleted += new EventHandler(client_GetEndPointShapeByIdCompleted);
client.GetPointShapeByIdAsync(featureId);
}
void client_GetEndPointShapeByIdCompleted(object sender, CSharp_Silverlight_HowDoISamples.GeoDataService.GetPointShapeByIdCompletedEventArgs e)
{
if (e.Error == null)
{
string[] positions = e.Result.Split(',');
PointShape pointShape = new PointShape(double.Parse(positions[0], CultureInfo.InvariantCulture), double.Parse(positions[1], CultureInfo.InvariantCulture));
RenderMarker(pointShape, "end");
}
}
private void RenderMarker(PointShape pointShape, string renderTag)
{
Marker marker = new Marker(pointShape);
if (renderTag == "start")
{
marker.ImageSource = new BitmapImage(new Uri("/theme/StartpointMarker.png", UriKind.RelativeOrAbsolute));
}
else if (renderTag == "end")
{
marker.ImageSource = new BitmapImage(new Uri("/theme/EndpointMarker.png", UriKind.RelativeOrAbsolute));
}
marker.ImageOffsetY = -10;
markerOverlay.Markers.Add(marker);
Map1.Refresh();
}
}
}