J'ai utilisé la nouvelle technique des interfaces REST pour fournir un nouveau complément de géocodage. Au cœur se trouve l'appel à l'interface REST respective de MapQuest , une entreprise proposant de nombreux services et applications de routage.
L'un des services de MapQuest est le routage. Pour chaque paire d'adresses fournie, MapQuest renvoie la latitude et la longitude de chaque emplacement, ainsi que des informations administratives telles que le pays et l'état. Il fournit également les emplacements de tous les points de cheminement entre les deux points et où changer de direction pour voyager de la première adresse à la seconde. Des informations récapitulatives telles que la distance totale et la durée estimée du trajet sont également fournies. Si la fonction est appelée avec seulement deux adresses, elle renvoie l'itinéraire et / ou la distance qui les sépare. Si vous fournissez une liste d'adresses, les itinéraires seront calculés pour chaque paire d'éléments de liste consécutifs. Des connexions seront alors établies entre l'élément 1 et l'élément 2, entre l'élément 2 et l'élément 3 et ainsi de suite. Une liste de n emplacements produira n-1 routes.
Les tableaux de données étant le moyen habituel de collecter des informations JMP , l'analyse commence lorsque l'utilisateur attribue des rôles aux colonnes de la table de données via une boîte de dialogue utilisateur. le Complément Geocoding 2020 fonctionne de la même manière. Une fois que l'utilisateur a terminé la boîte de dialogue, le programme collecte les données pertinentes de la table de données, les traduit dans la structure requise par l'API REST, puis les envoie à MapQuest. Ainsi, la structure approximative du programme est: 1) compléter la boîte de dialogue utilisateur, 2) collecter des données, 3) préparer les données pour l'interface, 4) envoyer une requête d'interface, 5) interpréter les résultats, 6) écrire des tables de données JMP. La troisième étape, la préparation des données, est définie comme une fonction et est disponible comme MapQuest_route.jsl dans le livre de recettes JSL. Vous pouvez l'intégrer dans votre propre application géographique ou l'utiliser pour obtenir des idées sur la manière de structurer les données pour les appels REST.
Fonctionnalité de base
Vous ou tout utilisateur de votre programme avez besoin d'un vlid Clé API de MapQuest.
Les données JMP se présentent sous forme de colonnes de table de données, tandis que les interfaces REST utilisent très probablement des structures JSON. En conséquence, il doit y avoir une fonctionnalité qui se traduit entre les deux formats. Le JSL a également des structures pour la collecte de données, que ce soit des listes ou des tableaux associatifs. Le but de cette fonction est d'encapsuler toutes les commandes JSL non natives. Les données nécessaires sont fournies avec les variables JSL typiques au format caractère, numérique ou liste. Les données renvoyées par l'appel sont également fournies sous forme de listes JSL. Ainsi, l'intégration de cette fonction dans un script JSL ne nécessite aucune connaissance supplémentaire au-delà des normes JSL.
L'interface
Les fonctions JSL sont appelées avec une instruction comme:
résultat = fonction ();
Si la fonction a besoin ou accepte des paramètres, ils sont répertoriés entre parenthèses. Cette fonction, GC_route, peut être appelée avec des crochets vides ou avec une liste complète de paramètres. L'appeler avec des crochets vides appelle une fenêtre de définition de paramètre avec un contour pour l'entrée et la sortie, comme indiqué dans les sections suivantes:

Les paramètres d'un appel de fonction sont toujours des paramètres de position. Lorsque la fonction est appelée avec des paramètres, TOUS les paramètres obligatoires doivent être fournis, mais ils peuvent être vides.
Dans mon article de blog sur mon complément de géocodage , J'ai utilisé quelques-uns des sites touristiques locaux autour de ma ville natale comme exemples d'utilisation de l'add-in. Prenons deux d'entre eux pour voir comment cette interface fonctionne:

|
Alte Freiheit 24a, 42103 Wuppertal, Allemagne
|
Wuppertaler Schwebebahn, un chemin de fer suspendu de 13 km de long, le plus ancien chemin de fer électrique avec wagons suspendus au monde, inauguré en 1901.
|

|
Schloßplatz 2, 42659 Solingen, Allemagne
|
Schloss Burg, un château reconstruit, originaire du 12 e siècle.
|
Tout d'abord, vous avez besoin d'une clé d'accès de MapQuest, supposons qu'il s'agit de 1234ABCD. Supposons également que:
- Chaque adresse n'est qu'une chaîne de texte.
- Vous avez fourni une paire de chaînes d'adresse; aucune table de données n'est impliquée.
- Vous souhaitez voyager en voiture.
- Vous n'êtes intéressé que par les distances et les temps de trajet.
- Vous voulez les distances en miles.
Une façon d'utiliser cette interface est de prendre les chaînes d'adresse telles quelles. Dans ce cas, l'indicateur de format (Position 2) doit être 1 ou plus grand. Ensuite, l'appel de fonction ressemble à ceci:
routes = GC_route ("1234ABCD", "", 1, "fastest", "m", {"Alte Freiheit 24a, 42103 Wuppertal, Deutschland",<BR /> "Schloßplatz 2, 42659 Solingen, Deutschland"}, {}, {}, {}, {}, {}, {});
Si les adresses ne sont pas dans une chaîne, mais dans des éléments séparés, l'indicateur de format doit être 0 (zéro), ce qui signifie que votre appel ressemblera à:
routes = GC_route ("1234ABCD", "", 0, "fastest", "m", {}, {"Deutschland", "Deutschland"}, {},
{"Wuppertal", "Solingen"}, {42103, 42659}, {"Alte Freiheit 24a", "Schloßplatz 2"}, {})
Bien sûr, vous n'avez pas besoin de mettre les valeurs en tant que paramètres; vous pouvez également fournir une variable, par exemple, une variable de liste avec la liste des noms de pays.

Dans tous les cas, le résultat est la même liste de données:
{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}, [=>], }
Les deux emplacements sont trouvés et la distance et le temps de trajet sont calculés. Par conséquent, le paramètre cinq est une liste avec une chaîne vide. À la fin, il y a le symbole d'un tableau associatif vide ([=>]). Il est vide car le paramètre 13, l'indicateur de détail, a été mis à zéro. Sinon, les informations de routage pourraient être trouvées dans ce tableau.
Un changement mineur dans la liste des paramètres de l'appel entraîne un changement significatif dans la sortie. C'est le changement du paramètre 13, le drapeau «détail». S'il est défini sur 1, la sortie est étendue par un tableau contenant toutes les informations de routage:
{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}], }
Par souci de simplicité, cet exemple utilise un itinéraire entre deux lieux proches l'un de l'autre. L'itinéraire est composé de huit points de cheminement entre le point de départ et le point d'arrivée. Ils sont énumérés dans la dernière liste du tableau associatif avec la clé «gc # wpidx». Certaines informations ne sont disponibles que pour les positions de début et de fin, c'est pourquoi certaines listes comportent autant de valeurs manquantes. Chaque liste a le même nombre d'éléments afin que le tableau entier puisse facilement être transformé en une table de données.
Détails techniques
La fonction prend une paire d'adresses ou une liste d'adresses en entrée. MapQuest renvoie l'emplacement et la géoinformation sur les points finaux de chaque trajet, les coordonnées de chaque emplacement, les directions pour chaque point entre eux et l'endroit où un changement de direction doit avoir lieu. Pour cette tâche simple, MapQuest propose différents formats d'entrée. Les informations d'adresse peuvent être fournies sous la forme d'une chaîne de texte avec des parties séparées par des virgules, comme «Deutschland, Schloßplatz 2, 42659 Solingen», qui est l'adresse d'un célèbre château près de ma ville natale. L'adresse peut également être indiquée sous forme d'éléments uniques: country = «Deutschland», Street = «Schloßplatz 2», city = «Solingen», code postal = «42659».
Je suppose que, dans la plupart des cas, plusieurs adresses seront recherchées. Ainsi, la fonction s'attend à obtenir des informations d'adresse sous forme de listes, soit une liste de chaînes avec des adresses complètes, soit plusieurs listes avec des éléments d'adresse. Chaque adresse, quel que soit son format, doit indiquer son pays. Et il n'y a aucun contrôle si les informations minimales requises sont fournies. Tous les autres éléments sont facultatifs.
Si un routage détaillé est demandé, un tableau avec de nombreuses listes est renvoyé. Le premier élément de chaque liste appartient au premier emplacement, les éléments suivants à l'itinéraire, puis à nouveau un élément pour le deuxième emplacement et ainsi de suite. Afin de faire la distinction entre les emplacements qui ont été saisis dans la demande et les points de routage qui sont revenus, le type de coordonnées gc # nomme les emplacements d'origine «Point of Interest» et les points entre les «Waypoints». La liste gc # leg rassemble tous les points menant à une destination. Le premier emplacement n'appartient pas à une jambe (ma définition). Pour l'itinéraire vers et y compris la première destination, c'est une; pour l'itinéraire vers la deuxième destination, il y en a deux, et ainsi de suite.
Si une variable JSL avec une référence à une table de données est fournie pour le paramètre 2 et qu'un routage détaillé est demandé, alors on suppose que la liste d'emplacements est identique à la liste d'emplacements dans la table de données. Tout le contenu de la table de données référencée sera copié et inséré dans le tableau avec le routage détaillé. Ces informations ne peuvent être liées qu'aux points d'intérêt, car toutes les listes ont des valeurs manquantes pour les points de cheminement.
Si une route ne peut être trouvée, un message d'erreur est donné à la position qui correspond au point d'origine de cette étape. Les itinéraires suivants seront calculés, si possible.
Si vous fournissez un lien vers une table de données et que cette table de données contient des lignes exclues, vous devez fournir une liste de lignes exclues (
excludedrows = As List( dt << Get Excluded Rows )
); comme paramètre 12. Sinon, les listes seront désynchronisées. Dans la liste des messages, ces observations sont marquées comme «exclues». S'il y a plus d'observations «exclues» qu'à l'origine dans le tableau de données, ces observations n'ont pas fourni un minimum d'informations de localisation.
J'espère que ce morceau de code pourra vous aider dans votre projet ou simplement vous donner un aperçu de l'application de JSL. Je suis ouvert à toutes les questions ou suggestions, mais comme il fait partie du complément Geocoding 2020, je ne ferai que des modifications cohérentes avec son utilisation prévue dans ce complément.