Le géocodage existe depuis un certain temps. Mais désormais, ce service est proposé via des interfaces REST qui offrent plus de flexibilité et de précision. J'ai créé un complément qui utilise le service de Mapquest pour trouver des géocodes pour les adresses et calculer les distances, les temps de trajet ou les itinéraires complets entre des paires d'emplacements. Ceci est la description de sa fonctionnalité et de son utilisation.
J'ai toujours été fasciné par les cartes. Avant que les cartes numériques ne soient disponibles, j'achetais des cartes pour chaque vacances, généralement à différentes échelles et avec beaucoup plus de détails que ce dont j'avais réellement besoin. Il n’est donc pas surprenant que je sois également fasciné par JMP Les fonctionnalités graphiques de qui permettent de représenter les données sur des cartes.
Qu’est-ce que le géocodage ?
L'une des applications intéressantes est le géocodage, ou la possibilité de localiser des points sur des cartes. Généralement, vous avez un point d'intérêt et son adresse. Pour trouver sa position et la tracer sur une carte, vous avez également besoin des géocoordonnées. Comme on peut s'y attendre, Wikipédia offre plus de détails sur le géocodage.
Pourquoi un nouveau complément de géocodage ?
Ces dernières années, la technique de communication informatique connue sous le nom de REPOS est devenu plus largement utilisé. Dans un discours prononcé en 2019, John Sall a évoqué « Fonctionnalités secrètes de JMP . « L'un de ces joyaux cachés de JMP est vraiment enfoui assez profondément : la possibilité d'accéder aux API REST (interfaces de programmation avancées) via des commandes JSL. Étant donné que les données de communication informatique sont souvent échangées via le « JSON " structure de données, les développeurs JMP ont créé des commandes JSL qui transfèrent facilement les données entre les structures de données JSL et les données JSON. Cette technique est devenue de plus en plus importante. En fait, l'Université Johns Hopkins et l'Institut Robert Koch proposent des API REST pour leurs pools de données pour les informations liées au COVID-19 ; Les clients JMP les utilisent pour accéder aux données SAP à des fins de gestion de la qualité ; et j'en utilise un pour le géocodage. Cette interface étend les possibilités d'échange d'informations, puisqu'elle fournit plus que les géocoordonnées des points d'intérêt. Il permet également aux utilisateurs d'obtenir des informations sur les distances, les temps de trajet et même l'itinéraire. Cet article concerne l'utilisation du ajouter à que j'ai chargé dans l'échange de fichiers. Le contexte technique sera donné dans un article séparé, comme résumé dans le dernier paragraphe.
Quelles sont les fonctions ?
Vous avez besoin d'un tableau de données avec des informations d'adresse par observation. Les adresses peuvent être utilisées pour ajouter trois niveaux différents d'informations géographiques, chaque niveau contenant les informations du précédent.
- Géocoordonnées
Pour chaque observation, la latitude et la longitude de son emplacement sont ajoutées. De plus, vous obtiendrez la hiérarchie des unités administratives, pays, état, district, code postal, ville, rue et une évaluation de la proximité avec laquelle cette adresse a été atteinte, en fonction des informations disponibles dans la base de données.
- Distance et temps de trajet
Pour chaque paire de lignes consécutives de votre tableau de données (par exemple, ligne 1 -> ligne 2 / ligne 2 -> ligne 3 /….), la distance entre les adresses et le temps de trajet requis seront ajoutés à la deuxième ligne. Les connexions sont énumérées dans une colonne supplémentaire. Le temps de trajet est calculé en fonction du choix de transport de l'utilisateur : voiture, vélo ou marche.
- Routage
Un tableau supplémentaire est créé qui contient toutes les informations ci-dessus, ainsi que les géocodes de tous les points qui décrivent l'itinéraire entre deux lignes consécutives.
Présupposés
Il existe plusieurs sites Internet proposant des services de cartographie et de routage. Un bon aperçu est donné par la revue ProgrammableWeb . J'ai décidé d'utiliser MapQuest . La société propose une variété de services payants mais également une API gratuite. Si vous souhaitez l'utiliser, vous devez d'abord vous inscrire et obtenir une clé API gratuite. Bien entendu, vous avez également besoin du complément Geocoding 2020. Il s'installera dans le menu Add-Ins du sous-menu « Map Shapes ».
Lors du premier appel, vous serez informé que vous pouvez obtenir la clé nécessaire auprès de MapQuest et vous recevrez un champ pour coller la clé.

Le rappel de la boîte de dialogue est désactivé. Une fois la clé collée, elle est testée pour déterminer s'il s'agit d'une clé MapQuest appropriée ; la clé doit être vérifiée avant de pouvoir continuer. Si vous avez fourni une clé valide, elle est enregistrée dans le répertoire de l'utilisateur dans le dossier AppData/Roaming/SAS/JMP. Si ce répertoire n'existe pas, il sera créé.
Pour que toutes les commandes du complément fonctionnent, vous devez définir la langue JMP sur l'anglais. et sélectionnez l’option « Utiliser le langage JMP… ». Malheureusement, cela ne peut pas être fait via JSL. Vous devez effectuer ces sélections en utilisant l'équivalence de votre langue dans Fichier -> Préférences -> Spécifique à Windows. Le complément vérifiera que les paramètres de langue sont corrects et vous alertera si ce n'est pas le cas.
Allons-y
Le menu se compose de deux parties. La première partie est la zone rouge supérieure, qui est construite comme presque toutes les boîtes de dialogue de la plateforme JMP ; il contient la liste des colonnes, la partie rôle et le panneau d'action. Dans la zone de rôle, il y a deux parties, soulignées par des cadres bleus. Dans votre table de données, les informations d'adresse peuvent être stockées dans l'un des deux formats suivants : soit sous forme d'une colonne contenant l'adresse complète sous forme de chaîne de texte, soit sous forme de colonnes distinctes, chaque colonne contenant une partie de l'adresse comme le pays, la ville, rue. Vous pouvez fournir l’un ou l’autre de ces formats, mais ils s’excluent mutuellement. Dans les deux cas, votre adresse doit contenir le pays . Il peut être donné sous forme de nom ou de code ISO, selon votre préférence.
La deuxième partie est le cadre rouge inférieur qui montre les options disponibles. Ils sont organisés en groupes de boutons radio (la capture d'écran ci-dessous montre les valeurs par défaut). Toutes les options ajoutent un groupe de colonnes supplémentaires à votre table de données ; la combinaison de « Routage » et « Itinéraires détaillés » crée un ensemble de données supplémentaire avec une copie de vos données. Ces points sont identifiés comme « Points d’intérêt ». De plus, il existe des « Waypoints », les points qui nécessitent des virages le long de votre itinéraire.

Un exemple
Pour tester comment tout cela fonctionne, j'ai rassemblé des informations d'adresse sur Internet. J'ai grandi à Solingen, une petite ville de l'ouest de l'Allemagne. Elle était connue à l'époque médiévale pour la production d'épées et de couverts de haute qualité, c'est pourquoi vous y trouverez le Musée allemand de la coutellerie. À côté du musée se trouve une petite église baroque très impressionnante. Il y a aussi quelques autres lieux célèbres à proximité :

|
Musée allemand du Klingen
|
Musée allemand de la coutellerie
|

|
Gräfrather Klosterkirche
|
Église du monastère baroque
|

|
L'Homme de Néandertal
|
La région où les restes d'une branche de nos ancêtres ont été découverts pour la première fois
|

|
La Wuppertaler Schwebebahn
|
Un chemin de fer suspendu de 13 km de long, le plus ancien chemin de fer électrique à wagons suspendus au monde, inauguré en 1901
|

|
Die Müngstner Brücke
|
Le plus haut pont ferroviaire d'Allemagne, construit en 1897
|

|
Château de Burg
|
Un château reconstruit, datant du 12 ème siècle
|
Après avoir recherché les adresses sur Internet, j'ai copié les chaînes dans une table de données JMP. Aucune des adresses ne comportait de nom de pays, j'ai donc ajouté « Deutschland » à toutes les chaînes. Les chaînes ressemblent maintenant à ceci
Allemagne, Talstraße 300, 40822 Mettmann
|
Allemagne, Alte Freiheit 24a, 42103 Wuppertal
|
Allemagne, Klosterhof 4, 42653 Solingen
|
Allemagne, Klosterhof 3, 42653 Solingen
|
Allemagne, Müngstener Brückenweg, 42659 Solingen
|
Allemagne, Schloßplatz 2, 42659 Solingen
|
J’ai choisi volontairement le nom du pays allemand « Deutschland ». Dans la boîte de dialogue, attribuez cette colonne au rôle « Adresse unique » et c'est parti.

À la suite de l'exécution, ces colonnes sont ajoutées à votre ensemble de données :
Géo-Information
|
GC#Latitude
|
GC#Longitude
|
GC#Code pays
|
GC#État
|
GC#District
|
GC#Code postal
|
GC#Ville
|
GC#Rue
|
GC#Évaluation de la qualité
|
GC#Message de retour
|
Je pense que les noms des colonnes parlent d'eux-mêmes. MapQuest fournit une évaluation de la qualité estimée pour chaque accès. C'est assez élaboré, j'ai donc résumé ces informations en quatre catégories : exacte, proche, approximative, lointaine. Les lignes de votre tableau de données reçoivent des symboles et des couleurs en fonction de cette note. Toutes les positions sont affichées sur une carte et un script qui reproduit cette carte est ajouté au tableau de données. Selon la zone sur laquelle vos points sont répartis, la carte d'arrière-plan est soit Street Map, soit Simple Earth.
Dans cette table de données, j'ai divisé la chaîne d'adresse en ses composants uniques (c'est facile si vous utilisez Cols à Utilities à Text to Column…) et j'ai demandé les coordonnées en utilisant les rôles « Champs d'adresse séparés ».

Il n'est pas nécessaire de remplir tous les champs de rôle dans cette section. Le pays est une exigence minimale. Plus vous fournissez d’informations, meilleur est le taux de réussite. Les résultats des deux méthodes de demande de coordonnées ne sont pas complètement identiques. Les coordonnées elles-mêmes peuvent différer un peu et pour la demande détaillée, plus d'informations (telles que le district) peuvent être fournies. L'évaluation de la qualité peut également varier.
Pour des raisons de performances, les champs d'adresse unique sont concaténés à une seule chaîne et les requêtes de chaîne unique sont envoyées à MapQuest s'il y a plus de 200 adresses dans votre table de données.
Si vous choisissez la combinaison « Routage » et « Distances/Temps uniquement », vous obtiendrez les mêmes informations que pour le géocodage, plus trois colonnes supplémentaires. De temps en temps, vous pouvez recevoir des messages d'erreur :
Point d'intérêt
|
GC#Message de retour
|
GC#Distance (km)
|
GC#Temps (Vélo)
|
GC#Jambes
|
Néandertalien
|
|
.
|
.
|
0
|
Gare ferroviaire de Wuppertal
|
Impossible de calculer l'itinéraire.
|
19.1287
|
:0:00:52:39
|
1
|
Musée allemand du Klingen
|
Impossible de calculer l'itinéraire.
|
0
|
:0:00:00:00
|
2
|
Gräfrather Klosterkirche
|
|
0
|
:0:00:00:00
|
3
|
Pont de Müngstner
|
|
9.92
|
:0:00:26:26
|
4
|
Château de Burg
|
|
5.0163
|
:0:00:13:55
|
5
|
Les lignes consécutives constituent une étape de l'itinéraire total. La ligne cible contient les informations de la jambe. Dans l'exemple, la première étape va de Néandertal à Wuppertaler Schwebebahn. La distance d'un itinéraire cyclable est d'environ 19 kilomètres et la durée estimée du vélo est de 52 minutes.
Pour quelque raison que ce soit, il n'a pas été possible de trouver de pistes cyclables menant au Deutsches Klingenmuseum ou à la Gräfrather Klosterkirche. Par conséquent, les étapes deux et trois ne contiennent aucune information de voyage, tandis que les étapes quatre et cinq fournissent à nouveau les informations respectives.
Cette combinaison d'options demande des détails sur un itinéraire entre deux lignes consécutives dans le tableau de données avec des distances indiquées en miles :
Votre tableau de données sera étendu par les colonnes décrites ci-dessus pour le géocodage. Pour le routage, une table supplémentaire avec une copie de chaque ligne de votre table de données est créée ; entre ces lignes, de nouvelles lignes sont insérées, une par point significatif du parcours. Le dernier segment de la tournée de Solingen ressemble à ceci :

La ligne 49 contient l'avant-dernière adresse de la table de données, là où se termine la jambe 4. L'itinéraire menant de l'endroit précédent à ce point était long de 9,3 miles et a un temps de trajet estimé à 15 minutes en voiture. Il s'agit d'un « point d'intérêt ». La rangée suivante est la fin du premier segment de l'étape 5 après +/- 300 pieds et cinq secondes de temps de conduite. Il s'agit du premier waypoint d'une série de sept, avant d'atteindre le prochain (et dernier) point d'intérêt. Les cartes montrent les résultats et leurs scripts figurent également dans les tableaux.
La table de données fait partie du complément et peut être ouverte à l'aide du bouton « Aide ». Vous pouvez l'utiliser pour commencer à jouer et à regarder les photos des attractions que j'ai incluses.
Et si tu Si jamais je viens dans cette région et visite certains endroits, n'oublie pas de chercher un restaurant qui sert Bergische Kaffeetafel , une très riche combinaison de spécialités locales comprenant du pain, des saucisses, du riz sucré, des gaufres et bien plus encore. Il est bien connu dans toute la région et j'ai choisi celui-ci comme démonstration, vous devriez donc pouvoir le trouver dans de nombreux restaurants.

Au premier passage
MapQuest nécessite que vous disposiez d'une clé API personnelle. Vous l'obtenez de leur site du développeur gratuitement. Le complément demande cette clé et fournit un champ dans lequel la coller.

Le complément stocke la clé dans le répertoire appdata de l'utilisateur pour SAS\JMP. Avant chaque exécution, il essaie de lire la clé et l'utilisera tant qu'elle sera là.
Lignes/routage exclus impossibles

Le complément attribue des symboles, des couleurs et des étiquettes aux lignes, mais il respecte également l'état des lignes « exclues », ce qui a des conséquences spécifiques pour l'application de routage. Si une ligne est exclue ou si le routage vers son adresse n'est pas possible, alors cette ligne est ignorée et un itinéraire vers l'adresse suivante est recherché.
Dans cette situation, les itinéraires entre Neandertal et Wuppertaler Schwebebahn, entre Wuppertaler Schwebebahn et Müngstner Brücke et entre Müngstner Brücke et Schloss Burg seront recherchés.
De même, les emplacements seront ignorés si l'acheminement vers eux n'est pas possible.
Détails techniques
L'observateur attentif aura peut-être remarqué que la boîte de dialogue principale est contenue dans un onglet. Les onglets sont inutiles s’ils sont seuls. Cet onglet reflète l'idée selon laquelle les emplacements des itinéraires peuvent apparaître dans différents formats. S'il devait y avoir des demandes pour des moyens alternatifs de fournir des emplacements pour le routage, cet onglet peut obtenir des frères et sœurs.
J'ai été motivé pour écrire ce complément en raison de mon intérêt combiné pour les cartes en général et la technique de l'API REST. Pour rendre ce dernier plus transparent et peut-être encore plus largement utilisé, j'ai mis trois fichiers dans le livre de recettes JSL. Ils définissent des fonctions qui peuvent être appelées par d'autres programmes. L'un est l'appel REST à MapQuest. Je décris le contenu et une description de l'interface dans un article de blog sur le appel MapQuest brut . Les autres scripts sont des enveloppes pour l'appel REST. Ils prennent les listes JMP comme entrées et créent les structures JSON nécessaires au géocodage ou routage appel. S'il y a de nombreuses adresses à coder, il les regroupe en blocs de 50 pour une meilleure fiabilité et de meilleures performances. Dans mes articles de blog sur le géocodage et le routage sous-programmes, je décris ces morceaux de code plus en détail.
Comme mentionné précédemment, les programmeurs JMP ont fait un excellent travail en fournissant des fonctions JSL qui se traduisent dans les deux sens entre les structures de données JMP et JSON. En termes JSL, des listes et des tableaux associatifs sont impliqués. Ces éléments peuvent être empilés. Vous pouvez avoir un tableau associatif contenant une liste de tableaux associatifs contenant… . Un seul appel MapQuest fournit un riche ensemble de données dont je n'avais besoin que de certains éléments. Parfois, il s'agissait de deux niveaux de profondeur dans la pile ; d'autres fois, plusieurs niveaux de profondeur. J'ai donc trouvé utile d'écrire un petit script qui parcourt cette structure. Et je ne serais pas un JMPer respectable si je ne cherchais pas une visualisation du résultat. J'ai trouvé le chemin parfait dans le diagramme d'Ishikawa. Cette programmation m'a rappelé le pouvoir de la récursion, qui est la meilleure technique pour descendre d'une pile profonde et revenir en toute sécurité. J'ai pensé que cela pourrait également aider ou inspirer d'autres programmeurs. J'ai mis le script dans le livre de recettes et – naturellement – je a écrit un article sur la récursivité et dessiner des structures hiérarchiques.
J'ai utilisé JMP 15 pour le développement, en utilisant un projet JMP. Je ne dirais pas que mon petit projet n'aurait pas pu voir le jour sans Projects, mais Projects a rendu les choses beaucoup plus faciles.