0

Automatische Kilometerberechnung über Google

Für alle, die auf der Suche nach einer automatischen Berechnung der Kilometer sind, hier mein Lösungsansatz:

Start-Adresse (Text-Feld)
Ziel-Adresse (Text-Feld)
Google (Berechnungs-Feld)
Km (Berechnungs-Feld)

Code Google-Feld

text(http("GET", "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + 'Start-Adresse' + "&destinations=" + 'Ziel-Adresse' + "&key=API_KEY"))

Den API-Key von Google kann man sich hier erstellen lassen und bei API_KEY einsetzen.

Code Km-Feld

let at := text(extractx(Google, "(text...)\d*.\d*"));
text(extractx(at, "\d+.\d+"))

Als Übergangslösung bis Ninox mit Arrays arbeiten kann, funktioniert es super.
Sobald man nun in das Start- und Zielfeld eine Adresse eingibt, berechnet er die Kilometer der schnellsten Route.

Man kann das ganze auch noch mit einem Button vervollständigen, der die Route in Google-Maps oder Apple-Maps öffnet.

Für Google: 

openURL("http://maps.google.com/maps?saddr=" + text('Start-Adresse') + "&daddr=" + text('Ziel-Adresse') + "&hl=de")

Für Apple-Karten:

openURL("http://maps.apple.com/maps?daddr=" + text('Straße' + " " + 'Hausnr.' + " " + PLZ + " " + Ort))

84 Antworten

null
    • Matthias_S
    • vor 6 Jahren
    • Gemeldet - anzeigen

    man kann das ganze auch in einem Berechnungsfeld machen:

    let gcode := text(http("GET", "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + 'Anfang-Adresse' + "&destinations=" + 'Ziel-Adresse' + "&key=API_Key"));
    let at := text(extractx(gcode, "(text...)\d*.\d*"));
    text(extractx(at, "\d+.\d+"))

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Matthias,

    vielen Dank, sehr nutzlich. Ich habe in der App (Macbook) und in Cloud (Windows, Chrome) ausprobiert.

    In der App  bekomme ich die Antwort von Google ohne Probleme. Bei Berechnung der Kilometer musste ich zusätzlich text(Google) einfügen. sonst meckerte Ninox.

    in der Cloud funktioniert die Anfrage leider nicht (reques failed. error).

     

    Grüße

    Leo

    • Dirk_Patzer
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Kann man auch die Zeit auslesen und nicht nur die km? So könnte man schnell sehen wie lange man zu einem Kundem fährt. Idealerweise sogar, ob man mit dem Auto, Rad oder zu Fuß geht. 

    • Matthias_S
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ich habe den Code noch etwas modifiziert. Man kann sich einen Schritt sparen:

     

    let gcode := text(http("GET", "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + 'Anfang-Adresse' + "&destinations=" + 'Ziel-Adresse' + "&key=API_KEY"));
    text(extractx(gcode, "\d+.\d+ km"))

     

    So kann man auch die Dauer in einem Berechnungsfeld anzeigen:

     

    let gcode := text(http("GET", "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + 'Anfang-Adresse' + "&destinations=" + 'Ziel-Adresse' + "&key=API_Key"));
    text(extractx(gcode, "\d+ (Stunde.|Minuten)"))

     

    Gruß

    Matthias

    • Matthias_S
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Habe doch noch einen Fehler in der Dauerberechnung entdeckt.
    Hier nun der richtige Code:

     

    let gcode := text(http("GET", "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + 'Anfang-Adresse' + "&destinations=" + 'Ziel-Adresse' + "&mode=bicycling&key=Api_Key"));
    let h := text(extractx(gcode, "[0-9]+.[Stunden|Stunde]+"));
    let min := text(extractx(gcode, "[0-9]+.[Minuten|Minute]+"));
    if h != "" then h + ", " + min else min end

     

    Um die Berechnung mit dem Rad oder zu Fuß durchzuführen, muss man nur in der Google-Api den Modus ändern (Fettgedrucktes).

    Auto = driving oder weglassen
    Rad = bicycling
    zu Fuß = walking
    ÖV = transit (hier könnte man noch die Abfahrtszeit, Ankunftszeit, Art des öffentlichen Verkehrsmittels und die Streckenpräferenz angeben)

     

    Gruß

    Matthias

    • Matthias_S
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hier eine Beispiel-Datenbank mit Kilometerberechnung und Switch-Schalter zur Berechnung der Dauer von Auto, Rad und Zu Fuß. Man muss nur den API_Key in den Formeln einsetzen.

    https://www.dropbox.com/s/fksun7t0t58k9q4/Kilometerberechnung.ninox?dl=0

    Grüße

    Matthias

    • Ninox Premiumpartner
    • Bastian_Vorholt
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hey Matthias danke für dein Input echt super haben heute dein Beispiel in dem Webinar gezeigt. Haben dort schon eine Beispieldatenbank liegen in dem Team Webinar DE 2018 lass dich doch mal in das Team einladen. Schreib eine mail an support@ninoxdb.de

    • Dirk_Patzer
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Klasse Matthias. Aber: Bei mir bleiben die berechneten Felder leer in der DB , die Du bei dropbox bereitgestellt hast, obwohl ich meinen Key eingegeben habe. Lasse ich &key= weg und schreibe direkt den key hin, dann funktioniert zumindest das Feld Kilometer.

    • Ninox Premiumpartner
    • Bastian_Vorholt
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Dirk welchen Key hast du beantragt. Schau mal im Webinar Team dort ist ja auch eine Beispieldatenbank dort hab ich alles erklärt. Du musst nur deinen Key eintragen. Wichtig ist das du ein Matrix Distance Key beantragst für die entfernung. https://developers.google.com/maps/documentation/distance-matrix/get-api-key?hl=de

    Für die anderen beispiele in der Datenbank benötigst du andere Keys.

    • Dirk_Patzer
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hi Bastian. Habe einen Distance-Key verwendet. Ich arbeite gerade mit der DB von Matthias. Dort habe ich überall den Distance-Key verwendet. Bei manchen Adressen funktioniert es gut, bei anderen steht plötzlich auch die PLZ und der Anfangsbuchstabe des Ziels oder des Starts mit im Formelfeld. Siehe Screenshot.Bildschirmfoto 2018-05-17 um 09.44.25

    • Matthias_S
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Habe den Fehler gefunden.

    Tausche die [] gegen () in den regulären Ausdrücken aus.

    Also so:

     

    let d := text(extractx(gcode, "[0-9]+.(Tage|Tag)+"));
    let h := text(extractx(gcode, "[0-9]+.(Stunden|Stunde)+"));
    let min := text(extractx(gcode, "[0-9]+.(Minuten|Minute)+"));

    • Matthias_S
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Habe meine Beispieldatenbank überarbeitet. Müsste jetzt funktionieren.

    • Ninox Premiumpartner
    • Bastian_Vorholt
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ich habe jetzt noch ein Abfahrtsdatum hinzugefügt da die Fahrtzeit sich ja unterscheiden kann bezüglich stau.

    hab ein Ninox Feld Datum Uhrzeit erstellt mit dem Namen Datum Abfahrt. Folgendes muss vor dem &Key= gesetzt werden.

    "departureTime:" + 'Datum Abfahrt' +

    • Dirk_Patzer
    • vor 6 Jahren
    • Gemeldet - anzeigen

    In der Beispieldatenbank, die ich gerade aus der Dropbox geladen habe sind es noch die eckigen Klammern. 

    • Matthias_S
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Sorry. Hatte die Dropbox nicht aktualisiert.

    • Dirk_Patzer
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Spitze. Jetzt funktioniert es einwandfrei!

    • Dirk_Patzer
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Wenn ich per Button Google Maps aufrufe übernimmt er die Startadresse, mit dem Button für Apple Maps geht er vom jetzigen Standort aus. Geht das bei Google auch bzw. kann man bei Apple Maps auch einen anderen Startpunkt auswählen?

    • Matthias_S
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Du kannst die Route in Apple Maps mit folgendem Code abrufen, dann startet er nicht bei dem Standort sondern bei deiner angegebenen Adresse.

    openURL("http://maps.apple.com/maps?daddr=" + 'Ziel-Adresse' + "&saddr=" + 'Anfang-Adresse')

    • Dirk_Patzer
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Okay, man muss aber bei Google und Apple jeweils eine Anfangsadresse eingeben. Aktueller Standort automatisch dürfte nicht funktionieren. Danke! Ich werde das einbauen in meine DB, dann kann ich schnell sehen wie weit ein neuer Patient enfernt wohnt bei Hausbesuchen. Toll!

    • Dominic_Eichstadt
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Habe das nun auch mal ausprobiert, funktioniert aber nur auf dem iPad bei mir und nicht auf dem Windows PC in der WEB-App. Ist das derzeit so?

    • Ninox Premiumpartner
    • Bastian_Vorholt
    • vor 5 Jahren
    • Gemeldet - anzeigen

    du musst die api request abfrage in do as sever schreiben. also

    do as server

    let request := http("GET", "https://maps.googleapis.com/maps/api/distancematrix/....

    end

    • Dominic_Eichstadt
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo, ich habe das nun probiert, bekomme den Code aber nciht komplett zusammen. :- ( 

    Auch das Beispiel 081_google_maps_entfernung hilft mir nicht weiter, denn da funktioniert es auch nicht. Kann sich mal bitte jemand ran setzen und den Code entsprechend anpassen so das es auch in der WEB-App unter Windows funktioniert?

    Würde mciht sehr freuen...

    • Firmeninhaber eines Dienstleistungsunternehmens (SHK)
    • Alexander_Prochnow
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Guten Morgen,

    das ist eine super Geschichte hier und ich bin begeistert wie man bei Ninox alles einfach erstellen kann ohne großartig Kentnisse von Programmierung zu haben. Habe den Code jetzt bei mir in einer Datenbank integriert und es funktioniert auch super gut. Was für mich jetzt noch interessant ist, wie ich die zurückgegeben Werte Zeit und Kilometer als Zahl bekomme um weitere Berechnungen anstellen zu können.

    mit bestem Dank 

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Alexander,

    wenn du number(Zeit) eintippst, bekommst du Zeitwert in Millisekunden. Jetzt kommt es darauf an welche Einheiten du für deine Berechnungen brauchst. Für Stunden:

    number(Zeitdauer)/1000/60/60

     

    Leo

    • Firmeninhaber eines Dienstleistungsunternehmens (SHK)
    • Alexander_Prochnow
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

    danke für die schnelle Antwort. Mir fehlt leider das notwendige Verstehen. Wo gebe ich die Anweisung number ein, damit ich das als Zahlenwert habe? In dem Code habe ich versucht, das zu ändern... dabei kommt aber entweder null oder eben ein Fehlermeldung. 

    let gcode := text(http("GET", "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + 'Anfang-Adresse' + "&destinations=" + 'Ziel-Adresse' + "&key=Habe ich"));
    let d := text(extractx(gcode, "[0-9]+.(Tage|Tag)+"));
    let h := text(extractx(gcode, "[0-9]+.(Stunden|Stunde)+"));
    let min := text(extractx(gcode, "[0-9]+.(Minuten|Minute)+"));
    if d != "" then
    d + " " + h + " " + min
    else
    if h != "" then h + " " + min else min end
    end

    Das ist der Code, den ich in das Feld mit eurer Unterstützung hinterlegt habe. Was ist da, dann hier zu ändern, wenn überhaupt. 

    Gruß Alex