J'ai utilisé la nouvelle technique des interfaces REST pour fournir un nouveau complément de géocodage. À la base se trouve l'appel à l'interface REST respective de MapQuest , une société fournissant de nombreux services et applications de routage. L'un des services de MapQuest est le géocodage. Pour chaque adresse fournie, MapQuest renvoie la latitude et la longitude de l'emplacement, ainsi que des informations administratives telles que le pays et l'état.
Étant donné que les tableaux de données sont le moyen habituel de collecter des informations dans JMP, l'analyse commence par l'attribution par l'utilisateur de rôles aux colonnes du tableau de données via une boîte de dialogue utilisateur. Le Complément de géocodage 2020 fonctionne de la même manière. Une fois que l'utilisateur a terminé le dialogue, le programme collecte les données pertinentes à partir 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) terminer le dialogue utilisateur, 2) collecter les données, 3) préparer les données pour l'interface, 4) envoyer la demande d'interface, 5) interpréter les résultats, 6) écrire la ou les tables de données JMP. La troisième étape, la préparation des données, est définie comme une fonction et est disponible en tant que MapQuest_geocode.jsl dans le livre de cuisine JSL. Vous pouvez l'intégrer dans votre propre application géographique ou l'utiliser pour avoir des idées sur la façon de structurer les données pour les appels REST.
Fonctionnalité de base
Vous, ou tout utilisateur de votre programme, avez besoin d'un Clé API de MapQuest.
Les données JMP se présentent sous la forme de colonnes de table de données, tandis que les interfaces REST utilisent très probablement des structures JSON. Par conséquent, il doit y avoir une fonctionnalité qui se traduit entre les deux formats. La JSL a également des structures pour les collections de données, 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 telle que :
résultat = fonction();
Si la fonction a besoin ou accepte des paramètres, ils sont répertoriés entre parenthèses. Cette fonction, GC_geocode, peut être appelée avec des parenthèses vides ou avec une liste complète de paramètres. L'appeler avec des parenthèses vides appelle une fenêtre de définition de paramètre avec un contour pour l'entrée et la sortie, comme indiqué dans ces deux graphiques :


Les paramètres d'un appel de fonction sont toujours des paramètres positionnels. 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 le complément Geocoding 2020 , j'ai utilisé quelques-uns des sites touristiques locaux autour de ma ville natale comme exemples d'utilisation du complément. Prenons-en deux 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 surélevé avec des voitures suspendues au monde, inauguré en 1901.
|

|
Schloßplatz 2, 42659 Solingen, Deutschland
|
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'agisse de 1234ABCD. Une façon d'utiliser cette interface consiste à prendre les chaînes d'adresse telles qu'elles sont. Dans ce cas, l'indicateur de format (position 2) doit être supérieur ou égal à 1. Ensuite, l'appel de fonction ressemble à ceci :
coordinates = GC_geocode ("1234ABCD", 1, {"Alte Freiheit 24a, 42103 Wuppertal, Deutschland",<BR /> "Schloßplatz 2, 42659 Solingen, Deutschland"}, {}, {}, {}, {}, {}, {});
Si les adresses sont dans des éléments séparés plutôt que dans une seule chaîne, l'indicateur de format doit être 0 (zéro), ce qui signifie que votre appel ressemblera à :
coordinates = GC_geocode ("1234ABCD", 0, {}, {"Deutschland", "Deutschland"}, {}, {"Wuppertal", "Solingen"}, {42103, 42659},<BR /> {"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", "", {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}
Étant donné que les adresses ont pu être trouvées et étiquetées, le code de réponse pour chaque adresse est "0" (élément 4), c'est pourquoi il y a des textes vides dans l'élément 5, où les messages d'erreur apparaîtraient autrement. Le reste peut être facilement compris, étant donné la déclaration d'interface ci-dessus.
Détails techniques
La fonctionnalité de base est simple. Nous envoyons une adresse à MapQuest et récupérons la latitude et la longitude. Pour cette tâche simple, MapQuest propose différents formats d'entrée et modes de traitement. 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 château célèbre près de ma ville natale. Alternativement, l'adresse peut être donnée sous forme d'éléments uniques : pays = « Deutschland », rue = « Schloßplatz 2 », ville = « Solingen », code postal = « 42659 ».
Je suppose que, dans la plupart des cas, plus d'une adresse peut être recherchée. 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. MapQuest a deux URL différentes pour les deux formats d'adresse. L'interface à chaîne unique fonctionne en mode batch, c'est-à-dire qu'un appel peut résoudre plusieurs adresses. L'interface pour les éléments d'adresse séparés n'accepte qu'une seule adresse à la fois. Pour des raisons de performances, la fonction combine des éléments séparés en une seule chaîne et exécute le mode batch lorsque de nombreuses adresses doivent être localisées (actuellement : > 100).
Chaque adresse, quel que soit le format fourni, doit fournir son pays. Et il n'y a pas de vérification si les informations minimales requises sont fournies. Tous les autres éléments sont facultatifs. Plus vous décrivez précisément l'adresse, meilleure est la qualité du résultat. Si l'adresse entière est fournie sous la forme d'une chaîne unique, la séquence des éléments d'adresse dans cette chaîne n'a pas d'importance.
Si vous lisez les emplacements à partir d'une table de données et que cette table de données comporte des lignes exclues, vous devez fournir la liste des lignes exclues (excludedrows = As List( dt << Get Excluded Rows )) comme paramètre 12. Sinon, les listes renvoyées risquent de ne pas être synchronisées avec votre table de donné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, les observations n'ont pas fourni un minimum d'informations sur l'emplacement.
MapQuest est une société américaine, et j'ai trouvé des résultats cohérents pour toutes les adresses américaines que j'ai testées. Avec des adresses dans d'autres régions du monde, ce n'était pas toujours le cas. Les informations de localisation telles que l'état, le district ou la ville sont souvent renvoyées dans la langue locale, mais parfois les résultats sont en anglais.
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 à toute question ou suggestion, mais comme il fait partie du complément Geocoding 2020, je n'apporterai que des modifications cohérentes avec son utilisation prévue dans ce complément.