ThinkGeo.com    |     Documentation    |     Premium Support

Routing User's added markers

Hi, I am trying to route added markers from user. When the user finishes to adding markers click to getRoute button and then I try to route the markers but I could not do it. Also I want to know if it is possible to route as soon as the user add the second, third and n marker without clicking getRoute button. thanks. 
 private static RoutingEngine routingEngine;
 private static RoutingSource RoutingSourceForShortest;
 private static RoutingSource RoutingSourceForFastest;
 static RoutingLayer routingLayer;
 static Dictionary<double, double> stops;
   protected void Page_Load(object sender, EventArgs e)
 {
 if (!Page.IsPostBack)

 {
 ShapeFileFeatureSource featureSource = new ShapeFileFeatureSource(Server.MapPath("RoutingData/Kadikoy_polyline.shp"));
 RoutingSourceForShortest = new RtgRoutingSource(Server.MapPath("RoutingData/Kadikoy_polyline.rtg"));
 routingEngine = new RoutingEngine(RoutingSourceForShortest, featureSource);
 routingEngine.GeographyUnit = GeographyUnit.Meter;
 Map1.MapUnit = GeographyUnit.Meter;
 Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));
 Map1.CurrentExtent = turkeyShape;// new RectangleShape(-10884474.4001792, 3542175.58734002, -10877416.7249544, 3537139.84069311);
 
 PointShape point = Map1.CurrentExtent.GetCenterPoint();
 Map1.ZoomTo(point, Map1.ClientZoomLevelScales[6]);
 GoogleOverlay google = new GoogleOverlay("Google Map");
 google.JavaScriptLibraryUri = new Uri(ConfigurationManager.AppSettings["GoogleUri"]);
 google.GoogleMapType = GoogleMapType.Normal;
 Map1.BackgroundOverlay = google;

 InMemoryMarkerOverlay markerOverlay = new InMemoryMarkerOverlay("MarkerOverlay");
 markerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageWidth = 21;
 markerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageHeight = 25;
 markerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageOffsetX = -10.5f;
 markerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageOffsetY = -25f;
 markerOverlay.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 Map1.CustomOverlays.Add(markerOverlay);
 routingLayer = new RoutingLayer();
 Map1.DynamicOverlay.Layers.Add("RoutingLayer", routingLayer);
 stops = new Dictionary<double,double>();
 }
 }
 private void RenderMap()
 {

 ((InMemoryMarkerOverlay)Map1.CustomOverlays["MarkerOverlay"]).Features.Clear();
 var points = stops.ToList();
 Vertex v = MapGlobals.ConvertCoord(points[0].Key, points[0].Value, false);
 routingLayer.StartPoint = new PointShape(double.Parse(v.X.ToString(), CultureInfo.InvariantCulture), double.Parse(v.Y.ToString(), CultureInfo.InvariantCulture));
 v = MapGlobals.ConvertCoord(points[points.Count - 1].Key, points[points.Count - 1].Value, false);
 routingLayer.EndPoint = new PointShape(double.Parse(v.X.ToString(), CultureInfo.InvariantCulture), double.Parse(v.Y.ToString(), CultureInfo.InvariantCulture));
 

 for(int i = 1; i<= points.Count -1; i++)

 {
 v = MapGlobals.ConvertCoord(points[i].Key, points[i].Value, false);
 PointShape pointNeedVisit = new PointShape(double.Parse(v.X.ToString(), CultureInfo.InvariantCulture), double.Parse(v.Y.ToString(), CultureInfo.InvariantCulture));
 routingLayer.StopPoints.Add(pointNeedVisit);

 }
 routingLayer.ShowStopOrder = false;
 InMemoryFeatureLayer routingExtentLayer = new InMemoryFeatureLayer();
 routingExtentLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = new AreaStyle(new GeoPen(GeoColor.SimpleColors.Green));
 routingExtentLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 routingExtentLayer.InternalFeatures.Add(new Feature(turkeyShape));
 Map1.DynamicOverlay.Layers.Add("RoutingExtentLayer", routingExtentLayer);
 }
 private void FindPath()
 {
 RoutingLayer routingLayer = (RoutingLayer)Map1.DynamicOverlay.Layers["RoutingLayer"];

 ManagedProj4Projection projection = new ManagedProj4Projection();
 projection.InternalProjectionParameters = Proj4Projection.GetEpsgParametersString(4326);
 projection.ExternalProjectionParameters = Proj4Projection.GetGoogleMapParametersString();
 projection.Open();
 routingLayer.ShowStopOrder = true;
 Stopwatch watch = new Stopwatch();
 watch.Start();
routingLayer.StopPoints, 100);
 MultilineShape projectedRoute = projection.ConvertToExternalProjection(routingEngine.GetRouteViaVisitStops(routingLayer.StartPoint, routingLayer.EndPoint, routingLayer.StopPoints, 100).Route) as MultilineShape;
 watch.Stop();
 routingLayer.Routes.Clear();
 routingLayer.Routes.Add(projectedRoute);
 routingLayer.StopPoints.Clear();
 Map1.DynamicOverlay.Redraw();
 }
 protected void btnGetRoute_Click(object sender, EventArgs e)
 {
 RenderMap();
 FindPath();
 }
 protected void Map1_Click(object sender, MapClickedEventArgs e)
 {
 InMemoryMarkerOverlay markerOverlay = (InMemoryMarkerOverlay)Map1.CustomOverlays["MarkerOverlay"];
 markerOverlay.Features.Add("marker" + DateTime.Now.ToString("mmssms"), new Feature(e.Position));
 stops.Add(e.Position.X, e.Position.Y);
 }
 public static Vertex ConvertCoord(double x, double y, Boolean WGS842Google)
 {
 Proj4Projection WGS84toGoogle;
 if (WGS842Google)
 {
 WGS84toGoogle = new Proj4Projection(Proj4Projection.GetEsriParametersString(4326), Proj4Projection.GetGoogleMapParametersString());
 }
 else  // google to wgs84

 {

 WGS84toGoogle = new Proj4Projection(Proj4Projection.GetGoogleMapParametersString(), Proj4Projection.GetEsriParametersString(4326));
 }
 WGS84toGoogle.Open();
 try
 {
 return WGS84toGoogle.ConvertToExternalProjection(x, y);
 }
 finally
 {
 WGS84toGoogle.Close();
 }
 }



Ayhan,


We found it’s a bug from RoutingViaVisitStops method and we have fixed in the latest version, please get it (4.5.121.0 or later) and have another try with the attached sample.
Basically, the attached sample is modified upon the HowDoI Samples of MapSuiteRouting web samples, DifferentProjectionsWithRouting. To run this sample, you need to copy the file “AustinStreets.shp” and the associated files to the SampleData folder contained in the solution. You can focus on the methods Map1_Click and FindPath where your requirement is implemented.
Further questions please let me know.
Thanks.

James



RoutingMarkerByMarker.zip (123 KB)

Thank you James, 
  
    James, The latest version that we have  4.5.120.0 not 4.5.121.0 and I tried the sample with version 4.5.120.0, it works fine just only when I add third marker it waits for routing about 7-8 minutes but after routing third marker it works fine for other markers (fourth, fifth, sixth …)   
     
    If the version that we have it has that bug so I am waiting for the latest version. 
   
 Thanks, 
  
 Ayhan

Ayhan, 
  
 Yes, that’s the bug I mentioned in earlier post and version 4.5.121.0 is already available now. You can download and try this version which has this bug fixed. 
 Further questions please don’t hesitate but give us a post. 
  
 Thanks. 
  
 James