Benutzer mit den meisten Antworten
Bing Maps mit SOAP Minimize total distance

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
- Bearbeitet Zanz19 Samstag, 20. Oktober 2012 18:48
- Bearbeitet Robert BreitenhoferModerator Montag, 22. Oktober 2012 12:52 URL als Link
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.
- Als Antwort vorgeschlagen Ionut DumaModerator Montag, 29. Oktober 2012 15:46
- Als Antwort markiert Ionut DumaModerator Montag, 5. November 2012 08:02
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-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
- Bearbeitet Robert BreitenhoferModerator Montag, 22. Oktober 2012 13:13 MinimizeDistance sowohl MinimizeTime haben funktioniert
-
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.
-
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.
- Als Antwort vorgeschlagen Ionut DumaModerator Montag, 29. Oktober 2012 15:46
- Als Antwort markiert Ionut DumaModerator Montag, 5. November 2012 08:02