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 5 Jahren
    • Gemeldet - anzeigen

    Ich habe den Code nochmal überarbeitet (man lernt ja nie aus) :)

    let response := http("GET", "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + 'Anfang-Adresse' + "&destinations=" + 'Ziel-Adresse' + "&mode=" + if Verkehrsmittel = 1 then
    "bicycling"
    else
    if Verkehrsmittel = 2 then
    "driving"
    else
    if Verkehrsmittel = 3 then
    "walking"
    else
    if Verkehrsmittel = 4 then "transit" end
    end
    end
    end + "&key=HIER KEY EINFÜGEN");
    let row := first(response.result).rows;
    let element := first(row).elements;
    let dauer := first(element).duration;
    let km := first(element).distance;
    dauer.text

    So beachtet er auch die Verkehrsmittel.
    So kann man einfach ausgeben, ob man die Dauer oder Kilometer haben möchte.
    Will man den reinen Zahlenwert, dann muss man statt "dauer.text" --> "dauer.value" eingeben.

    • Matthias_S
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Der Zeitwert von Google ist allerdings in Sekunden und nicht Millisekunden.

    Für Stunden schreibst du also

    number(dauer.value) / 60 / 60

    • Alexander_Prochnow
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Matthias,

    dankeschön für deine Hilfe. Habe es hinbekommen!!!!!

    let response := http("GET", "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + 'Anfang-Adresse' + "&destinations=" + 'Ziel-Adresse' + "&mode=" + if Verkehrsmittel = 1 then
    "bicycling"
    else
    if Verkehrsmittel = 2 then
    "driving"
    else
    if Verkehrsmittel = 3 then
    "walking"
    else
    if Verkehrsmittel = 4 then "transit" end
    end
    end
    end + "mein key");
    let row := first(response.result).rows;
    let element := first(row).elements;
    let dauer := first(element).duration;
    let km := first(element).distance;
    number(dauer.value) / 60 (Zahlenfeld Anzeige in Minuten)

    • Alfred
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Tolle Möglichkeit, Matthias. Vielen Dank. Ich möchte mit deiner DB in Zukunft meine Reisekostenabrechnung machen und versuche deshalb schon eine ganze Weile erfolglos, aus dem angezeigten km-Wert eine Zahl zu machen (Ich möchte den km-Wert mit einer km-Pauschale multiplizieren um die Fahrtkosten zu ermitteln.) Leider ist mir diese Umwandlung (Text - Zahl) in diesem Fall noch nicht gelungen - kann mir jemand helfen? Herzlichen Dank für eure Mühe.

    • Matthias_S
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Alfred, wenn du die Formel oben nimmst und dann die letzte Zeile änderst in

    number(km.value) / 1000 * Kilometerpauschale

    dann bekommst du als Ergebnis die Fahrtkosten.

    • Matthias_S
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Habe die Datenbank in der Dropbox aktualisiert.

    • Alfred
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Vielen Dank. Du hast mir sehr geholfen.

    Viele Grüße

    Alfred

    • Michael_Martin
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Zusammen,

    mich würde interessieren ob das gleiche auch mit Apple Karten funktioniert. Habe schon im Web gesucht, aber nichts aussagekräftiges gefunden. Lässt sich echt immer nur die Karten App auf dem Mac öffnen?

    • Morris_Hanson
    • vor 5 Jahren
    • Gemeldet - anzeigen

    whow. cool. gibts auch eine möglichkeit für diese Berechnung ohne Goolge API KEY? wäre ja noch praktischer..

    Vielleicht gibt es noch eine Beispiel Datenbank mit der aktuell besten Methode...?

    • Team Lead Customer Service
    • joerg
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Soweit ich weiß, ist das ohne den Google API Key nicht möglich.

    Gruß, Jörg

    • Alexander_Prochnow
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Einen schönen guten Morgen,

    da meine Programierkentnisse nicht so fortgeschritten sind, tauchen mal wieder Fragen auf, die ich in stundenlangen Versuchen nicht hinbekomme, ohne eure Hilfe.

    Meine Vorhaben sieht folgend aus. Ich möchte die Fahrzeit zu einem Uhrzeitfeld je nach Anfang oder Ende hinzu bzw abziehen. Beispiel: Startzeit 7:00 Fahrzeit 35min sollte im Uhrzeitfeld 6:25 ergeben bzw bei Endzeit ensprechen dazugerechnet werden.

    • Michael_Martin
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Alexander,

    erstelle einen Button und ein Zeitdauerfeld. Im Button gibst Du folgenden Zusatzcode ein:

    let Wert_Stunden := index(text(extractx('Google Auswertung', "\d+ (Stunden)")), "Stunden");
    let Wert_Minuten := index(text(extractx('Google Auswertung', "\d+ (Minuten)")), "Minuten");
    let Stunden_kurz := substr(text(extractx('Google Auswertung', "\d+ (Stunden)")), 0, Wert_Stunden - 1);
    let Minuten_kurz := substr(text(extractx('Google Auswertung', "\d+ (Minuten)")), 0, Wert_Minuten - 1);
    let NumMinuten := number(Minuten_kurz) * 60000;
    let NumStunden := number(Stunden_kurz) * 3600000;
    let Dauer := NumMinuten + NumStunden;
    Fahrtende := Start + Dauer

    Fahrtende ist ein Berechnungsfeld

     

    Gruß Michael

    • Michael_Martin
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Sehe gerade, die ersten beiden Codezeilen brauchst Du nicht verwenden.

    • Ninox-Professional
    • planoxpro
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Oder so (als Trigger "Nach Änderung" in den Feldern Termin und Fahrzeit, wobei letzteres ein Feld vom Typ Zeitdauer ist):

    if Fahrzeit then
        let Startzeit := time(start(Termin)) - Fahrzeit;
        let Endzeit := time(endof(Termin)) + Fahrzeit;
        let Terminstart := datetime(date(start(Termin)), Startzeit);
        let Terminende := datetime(date(endof(Termin)), Endzeit);
        Termin := appointment(Terminstart, Terminende)
    end

    Ich würde aber vielleicht ein zusätzliches Terminfeld namens "Termineintrag" oder so anlegen, damit u. a. die Information erhalten bleibt, wann genau man da zu erscheinen hat. In diesem Fall müsste es bei der Wert-Zuweisung in der letzten Zeile statt 'Termin' halt 'Termineintrag' heißen.

    • Pyromixer.1
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Sehr coole Sache! :-)

    Das muss ich mir auch noch irgendwie und irgendwann mit einbauen.

     

    Leider sind Theorie und deutsche Straßenverhältnisse leider nicht kompatibel. Ich schaffe seltenst die Zeit die Google Maps angibt. Die Amis scheinen unsere Autobahnen und Stauverhältnisse nicht so gut zu kennen :-) Aber die Sache an sich ist sehr cool.

     

    Damit müsste doch ein Routenplaner möglich sein?! Also man gibt z.B. 4-6 Adressen ein und Ninox berechnet die idealste Reihenfolge?!

    • Alexander_Prochnow
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Einen schönen Guten Morgen,

    Dankeschön für die Hilfe. Habe versucht mal beide Vorschläge einzubauen, was schon mal wieder etwas gedauert hat. Hierbei sind dann mal wieder diverse Fehlermeldungen und Ergebnisse herausgekommen. Schlussendlich habe ich es dann doch hinbekommen. 

    Ich wollte jetzt hier einige Bilder einfügen, jedoch werden diese nicht richtig dargestellt. Am Bild wäre es besser zu erklären, was ich mir so denke.

    Eine primäre Frage die aufgetaucht ist, kann ich das Zeitdauerfeld per Trigger mit dem Wert aus der Googleabfrage füllen? Habe das versucht, jedoch ohne Erfolg. Hier fehlen mir schlicht die Kentnisse.

    Mein Formular sieht folgen aus. Ich lege einen neuen Datensatz(Service) an. Lege Verknüpfung mit Kunde und eventuell Auftragsadresse für die Berechnung der Fahrzeit und der Kilometer an. Anschließend Termin(Datum) Start(Uhrzeit) Ende(Uhrzeit) übergabe per Trigger in Ortstermin(Terminfeld). Weiter sollte jetzt ein zweites Terminfeld mit den berechneten Fahrzeiten gefüllt werden. Hier sollte noch das von Pyromixer angesprochene Thema der teilweise nicht realistischen Fahrzeiten beachtet werden und vielleicht noch eine Zeitspanne x als Sicherheit dazugerechnet werden. 

    Also folgender Gedankengang Wert aus Googleabfrage zuzüglich Sicherheitszeit als Übergabe in das Zeitdauerfeld. Im Zeitdauerfeld ist dann folgender Code nach Änderung drin.

    'Abfahrt Zeit' := Startzeit - Zeitdauer;
    'Ankunft Zeit' := Endzeit + Zeitdauer;
    Termindauer := appointment(datetime('Termin Datum', 'Abfahrt Zeit'), datetime('Termin Datum', 'Ankunft Zeit'))

    Vielen lieben Dank für eure Hilfe

    • Michael_Martin
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Alexander,

    kannst Du deine Datenbank (oder eine Kopie davon) online stellen. Ich kann dann mal darüber schauen und Dir helfen.

    • Alexander_Prochnow
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Michael,

    hier mein Datenbank. 

    https://www.dropbox.com/s/qowffkxr0ojmi6t/Service.ninox?dl=0

     

    Mit bestem Dank

    • Michael_Martin
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Bildschirmfoto 2019-03-07 um 07.31.22

    Hallo Alexander,

    habe Dir einen zusätzlichen Karteireiter gemacht. Darin sind alle Auswertungen. Implementieren kannst Du denke ich selber. Habe soweit alles umgesetzt.

    Deine geänderte Datenbank ist hier zum Download:

    https://www.dropbox.com/s/5wqphqijeu2v3lq/Service.ninox?dl=0

     

    Gruß Michael

    PS: Sollte was sein, kannst mich gerne anschreiben.

    • Inhaber
    • Hansluebken
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo zusammen, 

    wenn ich das richtig sehe, funktioniert die Abfrage der Entfernung nur in der App (MAC, IPAD oder IPHONE). In der Webversion funktioniert das nach wie vor nicht. Ist das korrekt?

    • Birger_H
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Das ist derzeit richtig, ja.

    Birger

    • Maurice
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo,

    habe geraden diesen für mich sehr interessanten Thread gefunden. Ideal für eine automatisierte Abrechnung von Fahrkosten.

    Ein paar Fragen:

    Ich bin nicht im Webinar2018 Team, kann also keine Anleitung finden (bin im Webinar 2019 Team). Wo muss ich den Google API-KEY hinterlegen? Ich sehe %key=meinKey. Aber wo ist meinKey hinterlegt?

    Ich habe jetzt noch keinen Key beantragt, aber sehe ich es richtig, dass ich 200 $ monatliches Guthaben habe und damit der Dienst an sich für mich kostenlos ist (ich gehe mal von ca. 20-30 Einträgen pro Monat aus)?

    Grüße

    Maurice

    • Dirk_Patzer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Das Team 2018 und 2019 ist das selbe. Der Name wurde Anfang des Jahres auf 2019 geändert. Der Key war für mich kostenlos und ich benutze ihn bei allen Google-Abfragen zur Entfernung.

    • Jens_Peters
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo.

    Bezüglich Routenplanung bin ich auf RouteXL gestoßen. https://www.routexl.com/?lang=de

    Bisher habe ich im Ninox mehrere Standorte in einem mehrzeiligen Feld untereinander gesammelt (Straße, PLZ Ort), per Hand in die Zwischenablage kopiert und per Hand in das Eingabefeld von RouteXl eingefügt. RouteXl berechnet dann die optimale Route.

    RouteXL kann auch API und sicher auch mit Ninox kommunizieren. Leider fehlen mir bisher die Kenntnisse zu API und die Zeit, mich damit zu beschäftigen. Deshalb meine doch etwas altbackene und umständliche händische Methode.

    Da müsste doch auch mehr möglich sein, deshalb werfe ich mal die Info in die Runde...

    Bei RouteXL steht...

    RouteXL-API

    Die RouteXL-API bietet programmgesteuerten Zugriff zur Optimierung von Routen mit mehreren Haltestellen. Laden Sie Standorte hoch, erhalten Sie Distanztabellen und die optimierte Reihenfolge der Haltestellen. In der Routenoptimierung werden Zeitfenster unterstützt. Antworten sind in JSON.

    VG Jens

    • Maurice
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo,

    habe die Reise-DB für mich mal weiter entwickelt (istnoch nicht veröffentlichungsreif), aber zwei Dinge festgestellt:

    1) wenn ich die Uhrzeit wie im THread erwähnt mit "departureTime:" + 'Datum Abfahrt'  übergebe, dann berechnet er bei mir nicht mehr korrekt die Zeiten, wenn ich das Verkehrsmittel wechsle z. B. von Kfz auf Fahrrad. Nehme ich diesen Teil aus dem Berechnungsfeld raus, kann ich wieder problemlos wechseln.

    2) Die DB aus dem Webinar 2019, in die ein Navigationsanfrage mit Kartenausschnitt integriert ist, war wirklich hilfreich. Die dynamische KArte bei der Navigationsgarte funktioniert auf dem iPad nicht. Ich komme in eine DAuerschleife (Ninox hängt sich auf, kann ich nur durch "Abschießen" auf dem iPad beenden).

    Gibt es für beide Probleme eine Lösung?

    Grüße

    Maurice

Content aside

  • vor 2 JahrenZuletzt aktiv
  • 84Antworten
  • 23385Ansichten