Ich habe die neue Technik der REST-Schnittstellen verwendet, um ein neues Geokodierungs-Add-In bereitzustellen. Im Mittelpunkt steht der Aufruf der jeweiligen REST-Schnittstelle von MapQuest , ein Unternehmen, das viele Routingdienste und -anwendungen anbietet.
Einer der Dienste von MapQuest ist das Routing. Für jedes angegebene Adresspaar sendet MapQuest den Breiten- und Längengrad jedes Standorts sowie Verwaltungsinformationen wie Land und Bundesland zurück. Es liefert auch die Positionen aller Wegpunkte zwischen den beiden Punkten und wo die Richtung geändert werden muss, um von der ersten Adresse zur zweiten zu gelangen. Zusammenfassende Informationen wie die Gesamtentfernung und die geschätzte Reisezeit werden ebenfalls bereitgestellt. Wenn die Funktion mit nur zwei Adressen aufgerufen wird, gibt sie die Route und / oder die Entfernung zwischen ihnen zurück. Wenn Sie eine Liste mit Adressen angeben, werden die Routen für jedes Paar aufeinanderfolgender Listenelemente berechnet. Es werden dann Verbindungen zwischen Element 1 und Element 2, zwischen Element 2 und Element 3 usw. hergestellt. Eine Liste von n Standorten erzeugt n-1 Routen.
Da Datentabellen die übliche Art sind, Informationen in zu sammeln JMP Die Analyse beginnt damit, dass der Benutzer den Spalten der Datentabelle über einen Benutzerdialog Rollen zuweist. Das Geocoding 2020 Add-In funktioniert genauso. Nachdem der Benutzer den Dialog abgeschlossen hat, sammelt das Programm die relevanten Daten aus der Datentabelle, übersetzt sie in die von der REST-API benötigte Struktur und sendet sie dann an MapQuest. Die grobe Struktur des Programms lautet also: 1) Vervollständigen des Benutzerdialogs, 2) Sammeln von Daten, 3) Vorbereiten von Daten für die Schnittstelle, 4) Senden einer Schnittstellenanforderung, 5) Interpretieren der Ergebnisse, 6) Schreiben von JMP-Datentabellen. Der dritte Schritt, die Datenaufbereitung, wird als Funktion definiert und ist verfügbar als MapQuest_route.jsl im JSL-Kochbuch. Sie können es in Ihre eigene Geo-Anwendung einbetten oder damit Ideen zum Strukturieren von Daten für REST-Aufrufe erhalten.
Basisfunktionalität
Sie oder ein Benutzer Ihres Programms benötigen eine vlid API-Schlüssel von MapQuest.
JMP-Daten werden in Form von Datentabellenspalten geliefert, während REST-Schnittstellen höchstwahrscheinlich JSON-Strukturen verwenden. Daher muss es Funktionen geben, die zwischen beiden Formaten übersetzt werden können. Die JSL verfügt auch über Strukturen für die Datenerfassung, entweder Listen oder assoziative Arrays. Der Zweck dieser Funktion besteht darin, alle nicht nativen JSL-Befehle zu kapseln. Die erforderlichen Daten werden mit den typischen JSL-Variablen in Zeichen-, Zahlen- oder Listenformaten bereitgestellt. Die vom Aufruf zurückgegebenen Daten werden auch als JSL-Listen geliefert. Das Einbetten dieser Funktion in ein JSL-Skript erfordert daher keine zusätzlichen Kenntnisse über die JSL-Standards hinaus.
Die Schnittstelle
JSL-Funktionen werden mit einer Anweisung wie folgt aufgerufen:
Ergebnis = Funktion ();
Wenn die Funktion Parameter benötigt oder akzeptiert, werden diese in den Klammern aufgeführt. Diese Funktion, GC_route, kann mit leeren Klammern oder mit einer vollständigen Liste von Parametern aufgerufen werden. Wenn Sie es mit leeren Klammern aufrufen, wird ein Parameterdefinitionsfenster mit einer Gliederung für die Eingabe und Ausgabe aufgerufen, wie in den folgenden Abschnitten gezeigt:

Parameter in einem Funktionsaufruf sind immer Positionsparameter. Wenn die Funktion mit Parametern aufgerufen wird, müssen ALLE obligatorischen Parameter angegeben werden, sie können jedoch leer sein.
In meinem Blogbeitrag über mein Geokodierungs-Add-In Ich habe einige der lokalen Sehenswürdigkeiten in meiner Heimatstadt als Beispiele für die Verwendung des Add-Ins verwendet. Nehmen wir zwei davon, um zu sehen, wie diese Schnittstelle funktioniert:

|
Alte Freiheit 24a, 42103 Wuppertal, Deutschland
|
Die Wuppertaler Schwebebahn, eine 13 km lange Hängebahn, die älteste elektrische Hochbahn mit hängenden Wagen der Welt, wurde 1901 eingeweiht.
|

|
Schloßplatz 2, 42659 Solingen, Deutschland
|
Schloss Burg, ein rekonstruiertes Schloss aus dem 12. Jahrhundert th Jahrhundert.
|
Zunächst benötigen Sie einen Zugriffsschlüssel von MapQuest. Nehmen wir an, es handelt sich um 1234ABCD. Nehmen Sie außerdem an, dass:
- Jede Adresse ist nur eine Textzeichenfolge.
- Sie haben ein Paar Adresszeichenfolgen angegeben. Es ist keine Datentabelle beteiligt.
- Sie möchten mit dem Auto anreisen.
- Sie interessieren sich nur für Entfernungen und Reisezeiten.
- Sie wollen die Entfernungen in Meilen.
Eine Möglichkeit, diese Schnittstelle zu verwenden, besteht darin, die Adresszeichenfolgen unverändert zu lassen. In diesem Fall muss die Formatanzeige (Position 2) 1 oder größer sein. Dann sieht der Funktionsaufruf folgendermaßen aus:
routes = GC_route ("1234ABCD", "", 1, "fastest", "m", {"Alte Freiheit 24a, 42103 Wuppertal, Deutschland",<BR /> "Schloßplatz 2, 42659 Solingen, Deutschland"}, {}, {}, {}, {}, {}, {});
Wenn sich die Adressen nicht in einer Zeichenfolge, sondern in separaten Elementen befinden, muss der Formatindikator 0 (Null) sein. Dies bedeutet, dass Ihr Anruf folgendermaßen aussehen würde:
routes = GC_route ("1234ABCD", "", 0, "fastest", "m", {}, {"Deutschland", "Deutschland"}, {},
{"Wuppertal", "Solingen"}, {42103, 42659}, {"Alte Freiheit 24a", "Schloßplatz 2"}, {})
Natürlich müssen Sie die Werte nicht als Parameter eingeben. Sie können auch eine Variable angeben, z. B. eine Listenvariable mit der Liste der Ländernamen.

In jedem Fall ist das Ergebnis dieselbe Datenliste:
{200, "HTTP/1.1 200 OK", "", {}, {""}, {51.256414, 51.137675}, {7.148503, 7.152488}, {"close", "exact"},{"DE", "DE"},<BR />{"North Rhine-Westphalia", "North Rhine-Westphalia"}, {"Wuppertal", "Solingen"}, {"42103", "42659"},<BR /> {"Elberfeld", "Unterburg"}, {"Alte Freiheit", "Schloßplatz 2"}, {., 16.002}, {., 1600}, {}, {}, {0, 1}, [=>], }
Beide Orte werden gefunden und die Entfernung und Reisezeit berechnet. Daher ist Parameter fünf eine Liste mit einer leeren Zeichenfolge. Am Ende steht das Symbol für ein leeres assoziatives Array ([=>]). Es ist leer, weil Parameter 13, das Detailflag, auf Null gesetzt wurde. Andernfalls könnten die Routing-Informationen in diesem Array gefunden werden.
Eine geringfügige Änderung in der Parameterliste des Aufrufs führt zu einer signifikanten Änderung der Ausgabe. Das ist die Änderung von Parameter 13, dem "Detail" -Flag. Wenn es auf 1 gesetzt ist, wird die Ausgabe um ein Array erweitert, das alle Routing-Informationen enthält:
{200, "HTTP/1.1 200 OK", "", {}, {""}, {51.20971, 51.21327}, {7.07255, 7.08376},{"exact", "exact"}, {"DE", "DE"},<BR /> {"Nordrhein-Westfalen", "Nordrhein-Westfalen"}, {"", ""}, {"42653", "42653"}, {"Solingen", "Solingen"},<BR /> {"Klosterhof 4", "Lützowstraße 347"}, {., 1.0767}, {., 965}, {}, {}, {0, 1},<BR /> ["gc#city" => {"Solingen", ., ., ., ., ., ., ., ., "Solingen"},
"gc#coordtype" => {"Point of Interest", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "lPoint of Interest"},
"gc#ctrycd" => {"DE", ., ., ., ., ., ., ., ., "DE"},
"gc#dist" => {., 0.0064, 0.0499, 0.1481, 0.0853, 0.2366, 0.2993, 0.2478, 0.0032, 1.0767},<BR />"gc#district" => {"", ., ., ., ., ., ., ., ., ""},
"gc#lat" => {51.20971, 51.2099, 51.209949, 51.210171, 51.209187, 51.209667, 51.210789, 51.212135,51.213226, 51.21327},
"gc#leg" => {0, 1, 1, 1, 1, 1, 1, 1, 1},
"gc#long" => {7.07255, 7.072152, 7.072176, 7.072798, 7.074032, 7.074655, 7.077532, 7.081177, 7.084009, 7.08376},
"gc#msg" => {"", ., ., ., ., ., ., ., .},
"gc#postalc" => {"42653", ., ., ., ., ., ., ., ., "42653"},
"gc#ql" => {"exact", ., ., ., ., ., ., ., ., "exact"},
"gc#resp" => {0, ., ., ., ., ., ., ., .},
"gc#state" => {"Nordrhein-Westfalen", ., ., ., ., ., ., ., ., "Nordrhein-Westfalen"},<BR />"gc#street" => {"Klosterhof 4", "Klosterhof", ., "Gerberstraße", ., "Gräfrather Heide", .,<BR /> "Gräfrather Heide", "Lützowstraße", "Lützowstraße 347"},
"gc#time" => {., "00:00:05", "00:00:45", "00:02:13", "00:01:17", "00:03:32", "00:04:28", "00:03:42", "00:00:03", "00:16:05"},
"gc#wpidx" => {0, 1, 2, 3, 4, 5, 6, 7, 8, 0}], }
In diesem Beispiel wird der Einfachheit halber eine Route zwischen zwei nahe beieinander liegenden Orten verwendet. Die Route besteht aus acht Wegpunkten zwischen Start- und Endpunkt. Sie werden in der letzten Liste des assoziativen Arrays mit dem Schlüssel „gc # wpidx“ aufgelistet. Einige Informationen sind nur für die Start- und Endpositionen verfügbar, weshalb in einigen Listen so viele Werte fehlen. Jede Liste enthält die gleiche Anzahl von Elementen, sodass das gesamte Array problemlos in eine Datentabelle umgewandelt werden kann.
Technische Details
Die Funktion verwendet ein Adresspaar oder eine Adressliste als Eingabe. MapQuest sendet Standort und Geoinformation über die Endpunkte jeder Reise, die Koordinaten jedes Standorts, die Richtungen für jeden Punkt zwischen ihnen und den Ort, an dem eine Richtungsänderung stattfinden muss, zurück. Für diese einfache Aufgabe bietet MapQuest verschiedene Eingabeformate an. Die Adressinformationen können als eine Textzeichenfolge mit durch Kommas getrennten Teilen geliefert werden, z. B. „Deutschland, Schloßplatz 2, 42659 Solingen“, die Adresse eines berühmten Schlosses in der Nähe meiner Heimatstadt. Alternativ kann die Adresse als einzelnes Element angegeben werden: Land = "Deutschland", Straße = "Schloßplatz 2", Stadt = "Solingen", Postleitzahl = "42659".
Ich gehe davon aus, dass in den meisten Fällen mehr als eine Adresse nachgeschlagen wird. Die Funktion erwartet daher, dass Adressinformationen als Listen abgerufen werden, entweder als Liste von Zeichenfolgen mit vollständigen Adressen oder als mehrere Listen mit Adresselementen. Jede Adresse muss unabhängig von ihrem Format ihr Land angeben. Und es wird nicht geprüft, ob die erforderlichen Mindestinformationen angegeben sind. Alle anderen Elemente sind optional.
Wenn ein detailliertes Routing angefordert wird, wird ein Array mit vielen Listen zurückgegeben. Das erste Element jeder Liste gehört zum ersten Ort, nachfolgende Elemente zur Route, dann wieder ein Element zum zweiten Ort und so weiter. Um zwischen den Orten, die in die Anforderung eingegeben wurden, und den Routing-Punkten, die zurückgekehrt sind, zu unterscheiden, nennt der Koordinatentyp gc # die ursprünglichen Orte "Point of Interest" und die Punkte zwischen "Waypoints". Die gc # leg-Liste fügt alle Punkte zusammen, die zu einem Ziel führen. Der erste Ort gehört nicht zu einem Bein (meine Definition). Für die Route zum und einschließlich des ersten Ziels ist es eins; Für die Route zum zweiten Ziel sind es zwei und so weiter.
Wenn für Parameter 2 eine JSL-Variable mit einem Verweis auf eine Datentabelle bereitgestellt wird und ein detailliertes Routing angefordert wird, wird angenommen, dass die Liste der Standorte mit der Liste der Standorte in der Datentabelle identisch ist. Der gesamte Inhalt der referenzierten Datentabelle wird kopiert und mit dem detaillierten Routing in das Array eingefügt. Diese Informationen können nur mit den Sonderzielen verknüpft werden, da in allen Listen Werte für die Wegpunkte fehlen.
Wenn eine Route nicht gefunden werden kann, wird an der Position, die dem Ursprungspunkt für diese Etappe entspricht, eine Fehlermeldung angezeigt. Nachfolgende Routen werden nach Möglichkeit berechnet.
Wenn Sie einen Link zu einer Datentabelle bereitstellen und diese Datentabelle ausgeschlossene Zeilen enthält, müssen Sie eine Liste ausgeschlossener Zeilen angeben (
excludedrows = As List( dt << Get Excluded Rows )
); als Parameter 12. Andernfalls werden die Listen nicht mehr synchronisiert. In der Nachrichtenliste sind diese Beobachtungen als "ausgeschlossen" markiert. Wenn mehr „ausgeschlossene“ Beobachtungen als ursprünglich in der Datentabelle enthalten sind, lieferten diese Beobachtungen kein Minimum an Standortinformationen.
Ich hoffe, dieser Code kann Ihnen bei Ihrem Projekt helfen oder nur einen Einblick in die Anwendung von JSL geben. Ich bin offen für Fragen oder Vorschläge, aber da es Teil des Geocoding 2020-Add-Ins ist, werde ich nur Änderungen vornehmen, die mit der beabsichtigten Verwendung in diesem Add-In übereinstimmen.