Usé la nueva técnica de las interfaces REST para proporcionar un nuevo complemento de geocodificación. En su núcleo está la llamada a la respectiva interfaz REST de MapQuest , una empresa que proporciona una gran cantidad de aplicaciones y servicios de enrutamiento. Uno de los servicios de MapQuest es la geocodificación. Para cada dirección proporcionada, MapQuest devuelve la latitud y la longitud de la ubicación, así como información administrativa como el país y el estado.
Dado que las tablas de datos son la forma habitual de recopilar información en JMP, el análisis comienza cuando el usuario asigna roles a las columnas de la tabla de datos a través de un diálogo de usuario. El Complemento Geocodificación 2020 funciona de la misma manera. Una vez que el usuario ha completado el diálogo, el programa recopila los datos relevantes de la tabla de datos, los traduce a la estructura que necesita la API REST y luego los envía a MapQuest. Entonces, la estructura aproximada del programa es: 1) completar el diálogo de usuario, 2) recopilar datos, 3) preparar datos para la interfaz, 4) enviar solicitud de interfaz, 5) interpretar resultados, 6) escribir tablas de datos JMP. El tercer paso, preparación de datos, se define como una función y está disponible como MapQuest_geocode.jsl en el libro de cocina JSL. Puede incrustarlo en su propia aplicación geográfica o usarlo para obtener ideas sobre cómo estructurar datos para llamadas REST.
Funcionalidad de línea de base
Usted o cualquier usuario de su programa necesita una Clave API de MapQuest.
Los datos JMP vienen en forma de columnas de tablas de datos, mientras que las interfaces REST probablemente usan estructuras JSON. Como resultado, debe haber una funcionalidad que se traduzca entre ambos formatos. El JSL también tiene estructuras para recopilaciones de datos, ya sean listas o matrices asociativas. El propósito de esta función es encapsular todos los comandos JSL no nativos. Los datos necesarios se proporcionan con las típicas variables JSL en formatos de caracteres, numéricos o de lista. Los datos que se devuelven de la llamada también vienen como listas JSL. Por lo tanto, incorporar esta función en un script JSL no requiere ningún conocimiento adicional más allá de los estándares JSL.
La interfaz
Las funciones JSL se llaman con una declaración como:
resultado = funcion();
Si la función necesita o acepta parámetros, se enumeran entre paréntesis. Esta función, GC_geocode, se puede llamar con corchetes vacíos o con una lista completa de parámetros. Llamarlo con corchetes vacíos invoca una ventana de definición de parámetros con un esquema de entrada y salida, como se muestra en estos dos gráficos:


Los parámetros en una llamada de función son siempre parámetros posicionales. Cuando se llama a la función con parámetros, se deben proporcionar TODOS los parámetros obligatorios, pero pueden estar vacíos.
En mi publicación de blog sobre el complemento Geocodificación 2020 , he usado algunos de los sitios turísticos locales de mi ciudad natal como ejemplos de cómo usar el complemento. Tomemos dos de ellos para ver cómo funciona esta interfaz:

|
Alte Freiheit 24a, 42103 Wuppertal, Alemania
|
Wuppertaler Schwebebahn, un tren colgante de 13 km de longitud, el ferrocarril elevado eléctrico con vagones colgantes más antiguo del mundo, inaugurado en 1901.
|

|
Schloßplatz 2, 42659 Solingen, Alemania
|
Schloss Burg, un castillo reconstruido, originario del 12 el siglo.
|
Primero, necesita una clave de acceso de MapQuest, supongamos que es 1234ABCD. Una forma de usar esta interfaz es tomar las cadenas de direcciones tal como son. En este caso, el indicador de formato (Posición 2) debe ser 1 o mayor. Entonces, la llamada a la función se ve así:
coordinates = GC_geocode ("1234ABCD", 1, {"Alte Freiheit 24a, 42103 Wuppertal, Deutschland",<BR /> "Schloßplatz 2, 42659 Solingen, Deutschland"}, {}, {}, {}, {}, {}, {});
Si las direcciones están en elementos separados en lugar de en una cadena, el indicador de formato debe ser 0 (cero), lo que significa que su llamada se vería así:
coordinates = GC_geocode ("1234ABCD", 0, {}, {"Deutschland", "Deutschland"}, {}, {"Wuppertal", "Solingen"}, {42103, 42659},<BR /> {"Alte Freiheit 24a", "Schloßplatz 2"}, {})
Por supuesto, no necesita ingresar los valores como parámetros; también puede proporcionar una variable, por ejemplo, una variable de lista con la lista de nombres de países.
En cualquier caso el resultado es la misma lista de datos:
{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}
Dado que las direcciones se pueden encontrar y etiquetar, el código de respuesta para cada dirección es "0" (Elemento 4), por lo que hay textos vacíos en el elemento 5, donde de otro modo aparecerían mensajes de error. El resto se puede entender fácilmente, dada la declaración de interfaz anterior.
Detalles técnicos
La funcionalidad básica es simple. Enviamos una dirección a MapQuest y recuperamos la latitud y la longitud. Para esta sencilla tarea, MapQuest ofrece diferentes formatos de entrada y modos de proceso. La información de la dirección se puede proporcionar como una cadena de texto separada por comas, como "Deutschland, Schloßplatz 2, 42659 Solingen", que es la dirección de un famoso castillo cerca de mi ciudad natal. Alternativamente, la dirección se puede dar como elementos individuales: país = "Deutschland", calle = "Schloßplatz 2", ciudad = "Solingen", código postal = "42659".
Supongo que, en la mayoría de los casos, se puede buscar más de una dirección. Por lo tanto, la función espera obtener información de direcciones en forma de listas, ya sea una lista de cadenas con direcciones completas o varias listas con elementos de dirección. MapQuest tiene dos URL diferentes para los dos formatos de dirección. La interfaz de una sola cadena funciona en modo por lotes, es decir, una llamada puede resolver varias direcciones. La interfaz para elementos de dirección separados solo acepta una dirección a la vez. Por motivos de rendimiento, la función combina elementos separados en una sola cadena y ejecuta el modo por lotes cuando es necesario ubicar muchas direcciones (actualmente: > 100).
Cada dirección, independientemente del formato proporcionado, debe proporcionar su país. Y no se verifica si se proporciona la información mínima requerida. Todos los demás elementos son opcionales. Cuanto más precisa describa la dirección, mejor será la calidad del resultado. Si la dirección completa se proporciona como una sola cadena, la secuencia de elementos de dirección dentro de esa cadena no importa.
Si está leyendo las ubicaciones de una tabla de datos y esa tabla de datos tiene filas excluidas, debe proporcionar la lista de filas excluidas (excludedrows = As List( dt << Get Excluded Rows )) como parámetro 12. De lo contrario, es posible que las listas devueltas no estén sincronizadas con su tabla de datos. En la lista de mensajes, estas observaciones están marcadas como "excluidas". Si hay más observaciones "excluidas" que originalmente en la tabla de datos, las observaciones no proporcionaron un mínimo de información de ubicación.
MapQuest es una empresa estadounidense y encontré resultados consistentes para todas las direcciones de EE. UU. que probé. Con direcciones en otras regiones del mundo, ese no siempre fue el caso. La información de ubicación, como estado, distrito o ciudad, a menudo se devuelve en el idioma local, pero a veces los resultados están en inglés.
Espero que este fragmento de código pueda ayudarlo con su proyecto o simplemente brindarle una idea de la aplicación de JSL. Estoy abierto a cualquier pregunta o sugerencia, pero dado que es parte del complemento Geocodificación 2020, solo haré cambios que sean consistentes con el uso previsto en ese complemento.