none
Rückgabewerte von Routenberechnungen in VB WinForm

    Frage

  • Hallo,

    mit folgenden Codezeilen kann ich im Webbrowser Steuerelement eine Bing-Route anzeigen:

            Dim str As String = "http://bing.com/maps/default.aspx?rtp=adr." + TextBox1.Text + "~adr." + TextBox2.Text + "&rtop=0~1~0"
            WebBrowser1.Navigate(str)

    Gibt es eine Möglichkeit, z.B. die Kilometer der berechneten Route zu ermitteln, um diesen Wert  in ein Textfeld auf einer Form schreiben zu können?

    Thomas


    • Bearbeitet datech-hh Freitag, 19. August 2016 12:44
    Freitag, 19. August 2016 12:44

Antworten

  • Also ich denke, ich werde jetzt doch ein paar Worte zu dem "relativ schwer" schreiben:

    Die Auswertung einer Webseite halte ich für generell problematisch. Hintergrund dafür ist, dass sich so eine Webseite ohne Ankündigung jederzeit änder kann. Damit ist es also jederzeit möglich, dass die Funktionalität einer solchen Lösung plötzlich nicht mehr gegeben ist.

    Daher sehe ich die Verwendung der offiziellen APIs als besser an. Diese werden in der Regel nicht einfach so verändert. Es kann irgendwann eine neue API kommen und dann wird (meist mit Ankündigung) der alte Service irgendwann einmal eingestellt. Das gibt einem aber Zeit, zu reagieren.

    Wenn Du aber die Webseite auslesen willst, dann ist dies natürlich jederzeit möglich. Dazu kannst Du z.B. jederzeit auf die Eigenschaft Document vom WebBrowser Control zugreifen. Dazu schaust Du Dir einfach einmal die Webseite im Browser an und analysierst dann das Angezeigte. (Ich mache dies sehr gerne mit Google Chrome aber generell geht das wohl mit jedem Browser).

    Wenn man die von Dir aufgerufene Seite anschaut, dann gibt es zwei Dinge, die mir direkt aufgefallen sind:

    a) Asynchrones Laden der Daten. Da es keine fixe Seite ist, die einmal übertragen ist, macht es etwas schwerer, den richtigen Zeitpunkt zu finden, wann die Daten denn vorliegen. Aber das ist natürlich nicht ganz so wild und lässt sich auf verschiedene Weise lösen.

    b) Die Struktur ist recht gut. Microsoft hat bei den Daten ein Attribut data-tag eingefügt. Damit lässt sich sehr schön alles auslesen.

    Ich habe - da es Dir um die Strecken ging - jetzt erst einmal die Strecken ausgelesen. In meinem Test habe ich einfach einen Button eingefügt, der die Kilometer einmal ausliest:

        Private Sub ButtonClick(sender As Object, e As EventArgs) Handles Button1.Click
    
            For Each element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("td")
                If element.GetAttribute("data-tag") = "descriptionDistance" Then
                    MsgBox(element.InnerText)
                End If
            Next
    
        End Sub

    Was also gemacht wird, ist relativ einfach: Da die Daten in einem td element enthalten sind, hole ich mir alle td Elemente um dann zu schauen, ob das "data-tag" Attribut eben genau dieses "descriptionDistance" ist. Das Element enthält genau die km Angabe, so dass ich diese jetzt hier einfach einmal ausgebe.

    Für sowas braucht man also erst einmal kein Javascript sondern es kann direkt das Html Dokument verwendet werden.

    Aber als generelle Lösung würde ich evtl. doch eher auf die API setzen. Aber dies ist natürlich nur meine Sicht und natürlich ist ein solches Vorgehen generell denkbar und funktioniert auch ganz gut.

    Mit den besten Grüßen,

    Konrad

    Edit: "Google" war ein Schreibfehler - Musste natürlich Microsoft heißen.
    • Als Antwort markiert datech-hh Samstag, 20. August 2016 15:06
    • Bearbeitet Konrad Neitzel Samstag, 20. August 2016 15:24
    Samstag, 20. August 2016 13:12

Alle Antworten

  • Hallo,

    bei der Nutzung eines WebBrowser controls ist es relativ schwer, diese Daten zu ermitteln. Aber Du kannst auf Bing ja auch mittels der APIs zugreifen. Damit solltest Du die Daten eher bekommen.

    Die APIs sind hier beschrieben:

    https://www.microsoft.com/maps/choose-your-bing-maps-API.aspx

    Für Dich dürfte der Bing Maps REST Service interessant sein denke ich mal. Der hat auch eine Route API.

    Mit den besten Grüßen,

    Konrad Neitzel

    Freitag, 19. August 2016 15:37
  • Hi Thomas,
    mit einem kleinen JavaScript geht das recht einfach. Die Dokumentation dazu ist auch gut.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen! Leben retten!
    Wir essen Opa.
    Wir essen, Opa.

    Freitag, 19. August 2016 18:22
  • Als erweiterung zu Peter:

    Du kannst den Inhalt im "Browser" bequem durch JavaScript auslesen.

    Dazu kannst du dein eigenes JavaScript einfügen, und das Ergebnis (als String oder Objekt) zurück liefern.

    Die korrekte Methode dazu heißt: WebBrowser.InvokeScript()


    © 2016 Thomas Roskop
    Germany //  Deutschland

    Freitag, 19. August 2016 18:44
  • Also ich denke, ich werde jetzt doch ein paar Worte zu dem "relativ schwer" schreiben:

    Die Auswertung einer Webseite halte ich für generell problematisch. Hintergrund dafür ist, dass sich so eine Webseite ohne Ankündigung jederzeit änder kann. Damit ist es also jederzeit möglich, dass die Funktionalität einer solchen Lösung plötzlich nicht mehr gegeben ist.

    Daher sehe ich die Verwendung der offiziellen APIs als besser an. Diese werden in der Regel nicht einfach so verändert. Es kann irgendwann eine neue API kommen und dann wird (meist mit Ankündigung) der alte Service irgendwann einmal eingestellt. Das gibt einem aber Zeit, zu reagieren.

    Wenn Du aber die Webseite auslesen willst, dann ist dies natürlich jederzeit möglich. Dazu kannst Du z.B. jederzeit auf die Eigenschaft Document vom WebBrowser Control zugreifen. Dazu schaust Du Dir einfach einmal die Webseite im Browser an und analysierst dann das Angezeigte. (Ich mache dies sehr gerne mit Google Chrome aber generell geht das wohl mit jedem Browser).

    Wenn man die von Dir aufgerufene Seite anschaut, dann gibt es zwei Dinge, die mir direkt aufgefallen sind:

    a) Asynchrones Laden der Daten. Da es keine fixe Seite ist, die einmal übertragen ist, macht es etwas schwerer, den richtigen Zeitpunkt zu finden, wann die Daten denn vorliegen. Aber das ist natürlich nicht ganz so wild und lässt sich auf verschiedene Weise lösen.

    b) Die Struktur ist recht gut. Microsoft hat bei den Daten ein Attribut data-tag eingefügt. Damit lässt sich sehr schön alles auslesen.

    Ich habe - da es Dir um die Strecken ging - jetzt erst einmal die Strecken ausgelesen. In meinem Test habe ich einfach einen Button eingefügt, der die Kilometer einmal ausliest:

        Private Sub ButtonClick(sender As Object, e As EventArgs) Handles Button1.Click
    
            For Each element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("td")
                If element.GetAttribute("data-tag") = "descriptionDistance" Then
                    MsgBox(element.InnerText)
                End If
            Next
    
        End Sub

    Was also gemacht wird, ist relativ einfach: Da die Daten in einem td element enthalten sind, hole ich mir alle td Elemente um dann zu schauen, ob das "data-tag" Attribut eben genau dieses "descriptionDistance" ist. Das Element enthält genau die km Angabe, so dass ich diese jetzt hier einfach einmal ausgebe.

    Für sowas braucht man also erst einmal kein Javascript sondern es kann direkt das Html Dokument verwendet werden.

    Aber als generelle Lösung würde ich evtl. doch eher auf die API setzen. Aber dies ist natürlich nur meine Sicht und natürlich ist ein solches Vorgehen generell denkbar und funktioniert auch ganz gut.

    Mit den besten Grüßen,

    Konrad

    Edit: "Google" war ein Schreibfehler - Musste natürlich Microsoft heißen.
    • Als Antwort markiert datech-hh Samstag, 20. August 2016 15:06
    • Bearbeitet Konrad Neitzel Samstag, 20. August 2016 15:24
    Samstag, 20. August 2016 13:12
  • Perfekt, vielen Dank

    Thomas

    Samstag, 20. August 2016 15:06
  • Eine Sache wundert mich gerade.

    Ich zitiere die Fragestellung:

    > "mit folgenden Codezeilen kann ich im Webbrowser Steuerelement eine Bing-Route anzeigen:"

    und die markierte Antwort:

    > "b) Die Struktur ist recht gut. Google hat bei den Daten ein attribut data-tag eingefügt. Damit läßt sich sehr schön alles auslesen."

    Hab ich was verpasst? Ich meine, Bing ist ja nicht von Google sondern von Microsoft...


    © 2016 Thomas Roskop
    Germany //  Deutschland

    Samstag, 20. August 2016 15:17
  • Vielen Dank für diesen Hinweis!

    Das war ein reiner Verschreiber. Das musste natürlich Microsoft heißen. Wieso ich da beim Schreiben auf Google gekommen bin, weiß ich nicht. Evtl. weil ich selbst meist Google Maps verwende, wenn ich irgendwas nachschaue.

    Aber ich habe da natürlich komplett alles mit Bing von Microsoft gemacht und Alles in meinen beiden Antworten bezog sich komplett auf Microsoft / Bing und nichts auf Google. Ich werde diesen Fehler noch heraus editieren.

    Mit den besten Grüßen,

    Konrad

    Samstag, 20. August 2016 15:23
  • Konrad meint sicher Bing. Mit Google Maps habe ich das nicht hinbekommen, da das Webbrowsercontrol mit Google Maps irgendein Problem hat. Am Liebesten hätte ich eine alternative Lösung, die die km berechnet ohne die Karte bzw. den Browser zu öffnen. Man kann sich die Route dann ja anzeigen lassen, wenn man möchte - aber mir geht es im Moment tatsächlich nur um die Kilometer. Also: Man hat ein Datagrid und befüllt zwei Felder (Start, Ziel) und nach Verlassen werden dann die Kilometer ermittelt. Soll so eine Art Fahrtenbuch sein. Vielleicht gibt es da ja noch einen Ansatz.

    Gruß

    Thomas

    Samstag, 20. August 2016 15:26
  • Wenn es dir darum geht, würde ich die oben genannte Idee aufgreifen und einfach eine API nutzen.

    Aus kostengründen kannst du dir mal die "Openstreetmaps API" anschauen.


    © 2016 Thomas Roskop
    Germany //  Deutschland

    Samstag, 20. August 2016 15:40
  • Hallo Thomas,

    hast Du einmal versucht, die API zu nutzen, die ich verlinkt habe? Damit sollte genau das gehen, was Du möchtest.

    Ist gar nicht so schwer. Du kannst der Dokumentation relativ einfach folgen. Was Du nutzen möchtest ist der REST Service. Um diesen nutzen zu können, brauchst Du zuerst einen Bing Maps Key (https://msdn.microsoft.com/en-us/library/ff428642.aspx) Den Linsk folgen und dann unter My Account -> My Keys einen neuen Key anlegen. Bei der URL habe ich einfach einmal http://myapp.neitzel.local angegeben, denn ich habe da ja keine Homepage oder so ...)

    Dann kann es auch schon direkt los gehen - einfach einmal Using the REST Eervice with .NET ansehen - da findest Du dann auch den Link zu den Typen des REST Services und ein paar Funktionen um eben die API aufzurufen und so.

    Viele Grüße,

    Konrad

    Samstag, 20. August 2016 16:15