none
Bing Maps mit SOAP Minimize total distance RRS feed

  • Frage

  • Hi,

    Ich will mit Bing eine Route berechnen lassen, wo es einen Startpunkt, einen Endpunkt und mehrere Zwischenpunktet gibt. Als Vorlage habe ich den Code von http://msdn.microsoft.com/en-us/library/ee681887.aspx genommen. Alle Punkte werden als Waypoints angelegt, welche einen Index haben.

    Nur das Problem ist das er immer nach dem Index die Route berechnet und nicht unter den Optionen eingestellt MinimizeTime or MinimizeDistance.

    Gibt es eine Möglichkeit die TotalDistance zu minimieren?

    Vielen Dank schon mal im Voraus.

    LG

    Samstag, 20. Oktober 2012 18:47

Antworten

  • Leider funktioniert das nur, wenn 3 Waypoints vorhanden sind. Sobald es 4 Waypoints gibt, kann der Algorithmus nicht logisch entscheiden, welchen Zwischenpunkt er jetzt anpeilen soll.

    e.g.

     Geocode(txtStart.Text, 0);

            Geocode(txtVia1.Text, 1);

            Geocode(txtVia2.Text, 1);

            Geocode(txtEnd.Text, 2);

    In meinem Silverlightprogramm soll der User in der Lage sein, so viele Zwischenpunkte einzugeben wie er will, sowie einen End und Startpunkt. Und das Programm soll nun die beste Route aussuchen (kürzeste) oder schnellste.

    Hallo Zanz19,

    Erstmals sehe ich in Deinem Code zweimal den Index 1...das geht so nicht.

    Geocode(txtStart.Text, 0);

    Geocode(txtVia1.Text, 1);

    Geocode(txtVia2.Text, 1);

    Geocode(txtEnd.Text, 2);

    Das geht so nicht…man muss immer die Waypoints in der Reihenfolge setzten so wie man die Route machen will und mit den entsprechenden Indexes,  also es hängt ab von Deiner Logik der Anwendung … es funktioniert nur solange die Reihenfolge der Indexzahlen ordnungsgemäß eingegeben wurde so wie Du es schon bemerkt hast.

    In Deinem Beispiel wäre das dann wie folgt:

    Geocode(txtStart.Text, 0);

    Geocode(txtVia1.Text, 1);

    Geocode(txtVia2.Text, 2);

    Geocode(txtEnd.Text, 3);

    …und geocodeResults = new GeocodeService.GeocodeResult[3]; mit

    geocodeResults = new GeocodeService.GeocodeResult[4]; anpassen.

    Du schreibst: „In meinem Silverlightprogramm soll der User in der Lage sein, so viele Zwischenpunkte einzugeben wie er will, sowie einen End und Startpunkt. Und das Programm soll nun die beste Route aussuchen (kürzeste) oder schnellste.“ ..das geht nur wenn man auch eine Ordnung der Zwischenpunkte eingibt.

    Es bleibt Dir nur ein Sortierungsfunktion zu schreiben oder den Benutzern sagen sie sollen die Zwischenpunkte ordentlich eingeben.

    Grüße,

    Robert



    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 23. Oktober 2012 08:59
    Moderator

Alle Antworten

  • Hallo Zanz19,

    Ich habe das getestet unter Visual Studio 2010 und konnte mit folgendem Code noch ein Punkt zwischen Start und End eingeben. Du brauchst auch eine Bing Maps Key.

    MinimizeDistance sowohl MinimizeTime haben funktioniert und gaben korrekte Resultate.

    Im Projekt wurden folgende Verweise benutzt:

    http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc mit den Namen GeocodeService

    http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc mit den Namen RouteService

    private void CalculateRoute(GeocodeService.GeocodeResult[] results)
    {
        // Create the service variable and set the callback method using the CalculateRouteCompleted property.
        RouteService.RouteServiceClient routeService = new RouteService.RouteServiceClient("BasicHttpBinding_IRouteService");
        routeService.CalculateRouteCompleted += new EventHandler<RouteService.CalculateRouteCompletedEventArgs>(routeService_CalculateRouteCompleted);
        // Set the credentials.
        RouteService.RouteRequest routeRequest = new RouteService.RouteRequest();
        routeRequest.Credentials = new SilverlightApplication4.RouteService.Credentials();
        routeRequest.Credentials.ApplicationId = "BING_MAPS_KEY";
        // Return the route points so the route can be drawn.
        routeRequest.Options = new RouteService.RouteOptions();
        routeRequest.Options.RoutePathType = RouteService.RoutePathType.Points;
        //routeRequest.Options.Optimization = RouteService.RouteOptimization.MinimizeDistance;
        routeRequest.Options.Optimization = RouteService.RouteOptimization.MinimizeTime;
        // Set the waypoints of the route to be calculated using the Geocode Service results stored in the geocodeResults variable.
        routeRequest.Waypoints = new System.Collections.ObjectModel.ObservableCollection<RouteService.Waypoint>();
        foreach (GeocodeService.GeocodeResult result in results)
        {
            routeRequest.Waypoints.Add(GeocodeResultToWaypoint(result));
        }
        // Make the CalculateRoute asnychronous request.
        routeService.CalculateRouteAsync(routeRequest);
    }

    private void Geocode(string strAddress, int waypointIndex)
    {
        // Create the service variable and set the callback method using the GeocodeCompleted property.
        GeocodeService.GeocodeServiceClient geocodeService = new GeocodeService.GeocodeServiceClient("BasicHttpBinding_IGeocodeService");
        geocodeService.GeocodeCompleted += new EventHandler<GeocodeService.GeocodeCompletedEventArgs>(geocodeService_GeocodeCompleted);
        // Set the credentials and the geocode query, which could be an address or location.
        GeocodeService.GeocodeRequest geocodeRequest = new GeocodeService.GeocodeRequest();
        geocodeRequest.Credentials = new SilverlightApplication4.GeocodeService.Credentials();
        geocodeRequest.Credentials.ApplicationId = "BING_MAPS_KEY";
        geocodeRequest.Query = strAddress;
        // Make the asynchronous Geocode request, using the ‘waypoint index’ as
        //   the user state to track this request and allow it to be identified when the response is returned.
        geocodeService.GeocodeAsync(geocodeRequest, waypointIndex);
    }

    private void btnCalculateRoute_Click(object sender, RoutedEventArgs e)
        {
            // Initialize the length of the results array. In this sample we have two waypoints.
            geocodeResults = new GeocodeService.GeocodeResult[3];
            // Make the two Geocode requests using the values of the text boxes. Also pass the waypoint indexes
            //   of these two values within the route.
            Geocode(txtStart.Text, 0);
            Geocode(txtVia.Text, 1);
            Geocode(txtEnd.Text, 2);
        }

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 22. Oktober 2012 13:08
    Moderator
  • Hi,

    Danke für die Information, dass funktioniert aber nur solange die Reihenfolge der Indexzahlen ordnungsgemäß eingegeben wurde.

    Leider funktioniert das nur, wenn 3 Waypoints vorhanden sind. Sobald es 4 Waypoints gibt, kann der Algorithmus nicht logisch entscheiden, welchen Zwischenpunkt er jetzt anpeilen soll.

    e.g.

     Geocode(txtStart.Text, 0);

            Geocode(txtVia1.Text, 1);

            Geocode(txtVia2.Text, 1);

            Geocode(txtEnd.Text, 2);

     

    Hier wird immer txtVia1 angepeilt, auch wenn txtVia2 näher zum Anfang ist oder nicht. Für de n Start und Endpunkt kann ich einfach mithilfe einer Funktion die Indexnummer richtig eingeben, jedoch nicht für die Waypoints.

     

    In meinem Silverlightprogramm soll der User in der Lage sein, so viele Zwischenpunkte einzugeben wie er will, sowie einen End und Startpunkt. Und das Programm soll nun die beste Route aussuchen (kürzeste) oder schnellste.

    Montag, 22. Oktober 2012 16:00
  • Leider funktioniert das nur, wenn 3 Waypoints vorhanden sind. Sobald es 4 Waypoints gibt, kann der Algorithmus nicht logisch entscheiden, welchen Zwischenpunkt er jetzt anpeilen soll.

    e.g.

     Geocode(txtStart.Text, 0);

            Geocode(txtVia1.Text, 1);

            Geocode(txtVia2.Text, 1);

            Geocode(txtEnd.Text, 2);

    In meinem Silverlightprogramm soll der User in der Lage sein, so viele Zwischenpunkte einzugeben wie er will, sowie einen End und Startpunkt. Und das Programm soll nun die beste Route aussuchen (kürzeste) oder schnellste.

    Hallo Zanz19,

    Erstmals sehe ich in Deinem Code zweimal den Index 1...das geht so nicht.

    Geocode(txtStart.Text, 0);

    Geocode(txtVia1.Text, 1);

    Geocode(txtVia2.Text, 1);

    Geocode(txtEnd.Text, 2);

    Das geht so nicht…man muss immer die Waypoints in der Reihenfolge setzten so wie man die Route machen will und mit den entsprechenden Indexes,  also es hängt ab von Deiner Logik der Anwendung … es funktioniert nur solange die Reihenfolge der Indexzahlen ordnungsgemäß eingegeben wurde so wie Du es schon bemerkt hast.

    In Deinem Beispiel wäre das dann wie folgt:

    Geocode(txtStart.Text, 0);

    Geocode(txtVia1.Text, 1);

    Geocode(txtVia2.Text, 2);

    Geocode(txtEnd.Text, 3);

    …und geocodeResults = new GeocodeService.GeocodeResult[3]; mit

    geocodeResults = new GeocodeService.GeocodeResult[4]; anpassen.

    Du schreibst: „In meinem Silverlightprogramm soll der User in der Lage sein, so viele Zwischenpunkte einzugeben wie er will, sowie einen End und Startpunkt. Und das Programm soll nun die beste Route aussuchen (kürzeste) oder schnellste.“ ..das geht nur wenn man auch eine Ordnung der Zwischenpunkte eingibt.

    Es bleibt Dir nur ein Sortierungsfunktion zu schreiben oder den Benutzern sagen sie sollen die Zwischenpunkte ordentlich eingeben.

    Grüße,

    Robert



    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 23. Oktober 2012 08:59
    Moderator
  • Hallo Zanz19,

    Hast Du die  Lösung von Robert ausprobiert?

    Viele Grüße,
    Ionut

    Montag, 29. Oktober 2012 15:45
    Moderator
  • Ja Danke funktioniert wunderbar.

    Nur überlege ich gerade wie ich Zeitfaktoren in die Sortierfunktion einbaue.

    lg

    Samstag, 3. November 2012 16:07