Ich habe die neue Technik der REST-Schnittstellen verwendet, um ein neues Geokodierungs-Add-In bereitzustellen. Kernstück ist der Aufruf der jeweiligen REST-Schnittstelle von MapQuest , ein Unternehmen, das viele Routing-Dienste und -Anwendungen anbietet. Einer der Dienste von MapQuest ist die Geocodierung. Für jede angegebene Adresse sendet MapQuest den Breiten- und Längengrad des Standorts sowie Verwaltungsinformationen wie Land und Staat zurück.
Da Datentabellen die übliche Methode zum Sammeln von Informationen in JMP sind, beginnt die Analyse damit, dass der Benutzer den Spalten der Datentabelle über einen Benutzerdialog Rollen zuweist. Der 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 ist also: 1) Benutzerdialog vervollständigen, 2) Daten sammeln, 3) Daten für Schnittstelle vorbereiten, 4) Schnittstellenanfrage senden, 5) Ergebnisse interpretieren, 6) JMP-Datentabelle(n) schreiben. Der dritte Schritt, die Datenaufbereitung, ist als Funktion definiert und steht als zur Verfügung MapQuest_geocode.jsl im JSL-Kochbuch. Sie können es in Ihre eigene Geo-Anwendung einbetten oder verwenden, um Ideen zur Strukturierung von Daten für REST-Aufrufe zu erhalten.
Basisfunktionalität
Sie oder jeder Benutzer Ihres Programms benötigt eine gültige API-Schlüssel von MapQuest.
JMP-Daten liegen in Form von Datentabellenspalten vor, während REST-Schnittstellen höchstwahrscheinlich JSON-Strukturen verwenden. Daher muss es eine Funktionalität geben, die zwischen beiden Formaten übersetzt. Die JSL hat auch Strukturen für Datensammlungen, entweder Listen oder assoziative Arrays. Der Zweck dieser Funktion besteht darin, alle nicht nativen JSL-Befehle zu kapseln. Die notwendigen Daten werden mit den typischen JSL-Variablen im Zeichen-, Zahlen- oder Listenformat bereitgestellt. Die Daten, die vom Aufruf zurückgegeben werden, kommen ebenfalls als JSL-Listen. Das Einbetten dieser Funktion in ein JSL-Skript erfordert also keine zusätzlichen Kenntnisse über die JSL-Standards hinaus.
Die Schnittstelle
JSL-Funktionen werden mit einer Anweisung wie der folgenden aufgerufen:
Ergebnis = Funktion ();
Wenn die Funktion Parameter benötigt oder akzeptiert, sind sie in Klammern aufgeführt. Diese Funktion, GC_geocode, kann mit leeren Klammern oder mit einer vollständigen Parameterliste aufgerufen werden. Der Aufruf mit leeren Klammern ruft ein Parameterdefinitionsfenster mit einem Umriss für Eingabe und Ausgabe auf, wie in diesen beiden Diagrammen gezeigt:


Parameter in einem Funktionsaufruf sind immer Positionsparameter. Wenn die Funktion mit Parametern aufgerufen wird, müssen ALLE obligatorischen Parameter angegeben werden, sie dürfen jedoch leer sein.
In meinem Blogbeitrag über das Geocoding 2020-Add-In , habe ich 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
|
Wuppertaler Schwebebahn, eine 13 km lange Schwebebahn, die älteste elektrische Hochbahn mit Hängewagen der Welt, eingeweiht 1901.
|

|
Schloßplatz 2, 42659 Solingen, Deutschland
|
Schloss Burg, eine rekonstruierte Burg, aus dem 12 th Jahrhundert.
|
Zuerst benötigen Sie einen Zugriffsschlüssel von MapQuest, nehmen wir an, es ist 1234ABCD. Eine Möglichkeit, diese Schnittstelle zu verwenden, besteht darin, die Adresszeichenfolgen so zu nehmen, wie sie sind. In diesem Fall muss der Formatindikator (Position 2) 1 oder größer sein. Dann sieht der Funktionsaufruf so aus:
coordinates = GC_geocode ("1234ABCD", 1, {"Alte Freiheit 24a, 42103 Wuppertal, Deutschland",<BR /> "Schloßplatz 2, 42659 Solingen, Deutschland"}, {}, {}, {}, {}, {}, {});
Wenn sich die Adressen in separaten Elementen statt in einer Zeichenfolge befinden, muss der Formatindikator 0 (Null) sein, was bedeutet, dass Ihr Aufruf wie folgt aussehen würde:
coordinates = GC_geocode ("1234ABCD", 0, {}, {"Deutschland", "Deutschland"}, {}, {"Wuppertal", "Solingen"}, {42103, 42659},<BR /> {"Alte Freiheit 24a", "Schloßplatz 2"}, {})
Natürlich müssen Sie die Werte nicht als Parameter eingeben; Sie können auch eine Variable angeben, zB eine Listenvariable mit der Liste der Ländernamen.
Das Ergebnis ist in jedem Fall dieselbe Liste von Daten:
{200, "HTTP/1.1 200 OK", "", {0, 0}, {"", ""}, {51.25603, 51.13768}, {7.14865, 7.15245}, {"exact", "exact"}, {"DE", "DE"},<BR /> {"Nordrhein-Westfalen", "Nordrhein-Westfalen"}, {"", ""}, {"42103", "42659"}, {"Wuppertal", "Solingen"},<BR /> {"Alte Freiheit 24A", "Schloßplatz 2"}, 0}
Da die Adressen gefunden und getaggt werden konnten, ist der Antwortcode für jede Adresse „0“ (Element 4), weshalb in Element 5 leere Texte stehen, wo sonst Fehlermeldungen erscheinen würden. Der Rest ist anhand der obigen Schnittstellendeklaration leicht verständlich.
Technische Details
Die Grundfunktionalität ist einfach. Wir senden eine Adresse an MapQuest und erhalten Längen- und Breitengrad zurück. Für diese einfache Aufgabe bietet MapQuest verschiedene Eingabeformate und Verarbeitungsmodi. Die Adressinformationen können als eine Textzeichenfolge mit kommagetrennten Teilen bereitgestellt werden, wie „Deutschland, Schloßplatz 2, 42659 Solingen“, was die Adresse eines berühmten Schlosses in der Nähe meiner Heimatstadt ist. Alternativ kann die Adresse auch als einzelne Elemente angegeben werden: Land = „Deutschland“, Straße = „Schloßplatz 2“, Ort = „Solingen“, Postleitzahl = „42659“.
Ich gehe davon aus, dass in den meisten Fällen mehr als eine Adresse nachgeschlagen werden kann. Die Funktion erwartet also, Adressinformationen als Listen zu erhalten, entweder eine Liste von Zeichenfolgen mit vollständigen Adressen oder mehrere Listen mit Adresselementen. MapQuest hat zwei unterschiedliche URLs für die beiden Adressformate. Die Single-String-Schnittstelle arbeitet im Batch-Modus, dh ein Aufruf kann mehrere Adressen auflösen. Die Schnittstelle für separate Adresselemente akzeptiert jeweils nur eine Adresse. Aus Performance-Gründen fasst die Funktion einzelne Elemente zu einem String zusammen und führt den Batch-Modus aus, wenn viele Adressen gefunden werden müssen (aktuell: > 100).
Jede Adresse, unabhängig vom bereitgestellten Format, muss ihr Land angeben. Und es wird nicht geprüft, ob die erforderlichen Mindestinformationen gegeben sind. Alle anderen Elemente sind optional. Je genauer Sie die Adresse beschreiben, desto besser ist die Qualität des Ergebnisses. Wenn die gesamte Adresse als einzelne Zeichenfolge bereitgestellt wird, spielt die Reihenfolge der Adresselemente innerhalb dieser Zeichenfolge keine Rolle.
Wenn Sie die Positionen aus einer Datentabelle lesen und diese Datentabelle ausgeschlossene Zeilen enthält, müssen Sie die Liste der ausgeschlossenen Zeilen (excludedrows = As List( dt << Get Excluded Rows )) als Parameter 12 bereitstellen. Andernfalls sind die zurückgegebenen Listen möglicherweise nicht mit Ihrer Datentabelle synchronisiert. In der Meldungsliste werden diese Beobachtungen als „ausgeschlossen“ gekennzeichnet. Wenn es mehr „ausgeschlossene“ Beobachtungen als ursprünglich in der Datentabelle gibt, lieferten die Beobachtungen nicht ein Minimum an Standortinformationen.
MapQuest ist ein amerikanisches Unternehmen, und ich fand konsistente Ergebnisse für alle von mir getesteten US-Adressen. Bei Adressen in anderen Regionen der Welt war das nicht immer der Fall. Standortinformationen wie Bundesland, Bezirk oder Stadt werden oft in der Landessprache zurückgegeben, manchmal sind die Ergebnisse jedoch auf Englisch.
Ich hoffe, dieses Stück 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.