Usé la nueva técnica de interfaces REST para proporcionar un nuevo complemento de codificación geográfica. En su núcleo está la llamada a la interfaz REST respectiva de MapQuest , una empresa que ofrece gran cantidad de aplicaciones y servicios de enrutamiento.
Uno de los servicios de MapQuest es el enrutamiento. Por cada par de direcciones proporcionadas, MapQuest envía la latitud y la longitud de cada ubicación, así como información administrativa como el país y el estado. También proporciona las ubicaciones de todos los waypoints entre los dos puntos y dónde cambiar de dirección para viajar desde la primera dirección a la segunda. También se proporciona información resumida, como la distancia total y el tiempo de viaje estimado. Si la función se llama con solo dos direcciones, devuelve la ruta y / o la distancia entre ellas. Si proporciona una lista de direcciones, las rutas se calcularán para cada par de elementos de lista consecutivos. Entonces se darán las conexiones entre el elemento 1 y el elemento 2, entre el elemento 2 y el elemento 3 y así sucesivamente. Una lista de n ubicaciones producirá n-1 rutas.
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. los Complemento de codificación geográfica 2020 funciona de la misma manera. Una vez que el usuario ha completado el cuadro de 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 la solicitud de interfaz, 5) interpretar los resultados, 6) escribir la (s) tabla (s) de datos JMP. El tercer paso, la preparación de datos, se define como una función y está disponible como MapQuest_route.jsl en el JSL Cookbook. Puede incrustarlo en su propia aplicación geográfica o utilizarlo para obtener ideas sobre cómo estructurar los datos para las llamadas REST.
Funcionalidad básica
Usted o cualquier usuario de su programa necesita un vlid Clave API de MapQuest.
Los datos de JMP vienen en forma de columnas de tabla 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 la recopilación de datos, ya sea 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, incrustar 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 = función ();
Si la función necesita o acepta parámetros, se enumeran entre corchetes. Esta función, GC_route, 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 para entrada y salida, como se muestra en las siguientes secciones:

Los parámetros en una llamada de función son siempre parámetros posicionales. Cuando se llama a la función con parámetros, es necesario proporcionar TODOS los parámetros obligatorios, pero pueden estar vacíos.
En mi entrada de blog sobre mi complemento de codificación geográfica , Utilicé algunos de los sitios turísticos locales de mi ciudad natal como ejemplos de cómo utilizar el complemento. Tomemos dos de ellos para ver cómo funciona esta interfaz:

|
Alte Freiheit 24a, 42103 Wuppertal, Alemania
|
Wuppertaler Schwebebahn, un ferrocarril colgante de 13 km de largo, 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 th siglo.
|
Primero, necesita una clave de acceso de MapQuest, supongamos que es 1234ABCD. Además, suponga que:
- Cada dirección es solo una cadena de texto.
- Ha proporcionado un par de cadenas de direcciones; no hay tabla de datos involucrada.
- Quieres viajar en coche.
- Solo te interesan las distancias y los tiempos de viaje.
- Quieres las distancias en millas.
Una forma de utilizar esta interfaz es tomar las cadenas de direcciones como están. En este caso, el indicador de formato (Posición 2) debe ser 1 o más grande. Entonces, la llamada a la función se ve así:
routes = GC_route ("1234ABCD", "", 1, "fastest", "m", {"Alte Freiheit 24a, 42103 Wuppertal, Deutschland",<BR /> "Schloßplatz 2, 42659 Solingen, Deutschland"}, {}, {}, {}, {}, {}, {});
Si las direcciones no están en una cadena, sino en elementos separados, el indicador de formato debe ser 0 (cero), lo que significa que su llamada se vería así:
routes = GC_route ("1234ABCD", "", 0, "fastest", "m", {}, {"Deutschland", "Deutschland"}, {},
{"Wuppertal", "Solingen"}, {42103, 42659}, {"Alte Freiheit 24a", "Schloßplatz 2"}, {})
Por supuesto, no es necesario introducir 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", "", {}, {""}, {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}, [=>], }
Se encuentran ambas ubicaciones y se calculan la distancia y el tiempo de viaje. Por lo tanto, el parámetro cinco es una lista con una cadena vacía. Al final, está el símbolo de una matriz asociativa vacía ([=>]). Está vacío porque el parámetro 13, el indicador de detalle, se estableció en cero. De lo contrario, la información de enrutamiento podría encontrarse en esta matriz.
Un pequeño cambio en la lista de parámetros de la llamada provoca un cambio significativo en la salida. Ese es el cambio del parámetro 13, la bandera de "detalle". Si se establece en 1, la salida se extiende mediante una matriz que contiene toda la información de enrutamiento:
{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}], }
En aras de la simplicidad, este ejemplo utiliza una ruta entre dos lugares que están cerca uno del otro. La ruta se compone de ocho waypoints entre el punto de inicio y el final. Se enumeran en la última lista del arreglo asociativo con la clave “gc # wpidx”. Parte de la información solo está disponible para las posiciones inicial y final, por lo que algunas listas tienen tantos valores perdidos. Cada lista tiene la misma cantidad de elementos para que toda la matriz se pueda convertir fácilmente en una tabla de datos.
Detalles técnicos
La función toma un par de direcciones o una lista de direcciones como entrada. MapQuest envía la ubicación y la información geográfica sobre los puntos finales de cada viaje, las coordenadas de cada ubicación, las direcciones para cada punto entre ellos y dónde debe tener lugar un cambio de dirección. Para esta sencilla tarea, MapQuest ofrece diferentes formatos de entrada. La información de la dirección se puede proporcionar como una cadena de texto con partes separadas 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 buscará más de una dirección. Entonces, la función espera obtener información de direcciones como listas, ya sea una lista de cadenas con direcciones completas o varias listas con elementos de dirección. Cada dirección, independientemente de su formato, debe proporcionar su país. Y no se comprueba si se proporciona la información mínima requerida. Todos los demás elementos son opcionales.
Si se solicita un enrutamiento detallado, se devuelve una matriz con muchas listas. El primer elemento de cada lista pertenece a la primera ubicación, los elementos subsiguientes a la ruta, luego de nuevo un elemento para la segunda ubicación y así sucesivamente. Para distinguir entre las ubicaciones que se han ingresado a la solicitud y los puntos de ruta que han regresado, el gc # coordtype nombra las ubicaciones originales como "Punto de interés" y los puntos entre "Waypoints". La lista gc # leg une todos los puntos que conducen a un destino. La primera ubicación no pertenece a una pierna (mi definición). Para la ruta hasta el primer destino e incluido, es uno; para la ruta al segundo destino, son dos, y así sucesivamente.
Si se proporciona una variable JSL con una referencia a una tabla de datos para el parámetro 2 y se solicita un enrutamiento detallado, se supone que la lista de ubicaciones es idéntica a la lista de ubicaciones en la tabla de datos. Todo el contenido de la tabla de datos referenciada se copiará e insertará en la matriz con el enrutamiento detallado. Esta información solo se puede vincular a los puntos de interés, ya que todas las listas tienen valores perdidos para los waypoints.
Si no se puede encontrar una ruta, se muestra un mensaje de error en la posición que corresponde al punto de origen de ese tramo. Se calcularán las rutas posteriores, si es posible.
Si proporciona un enlace a una tabla de datos y esa tabla de datos tiene filas excluidas, debe proporcionar una lista de filas excluidas (
excludedrows = As List( dt << Get Excluded Rows )
); como parámetro 12. De lo contrario, las listas no estarán sincronizadas. 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, estas observaciones no proporcionaron un mínimo de información de ubicación.
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 como es parte del complemento Geocoding 2020, solo haré cambios que sean consistentes con el uso previsto en ese complemento.