La geocodificación existe desde hace algún tiempo. Pero ahora, este servicio se ofrece a través de interfaces REST que brindan más flexibilidad y precisión. Creé un complemento que utiliza el servicio de Mapquest para buscar códigos geográficos para direcciones y calcular distancias, tiempos de viaje o rutas completas entre pares de ubicaciones. Esta es la descripción de su funcionalidad y uso.
Siempre me han fascinado los mapas. Antes de que los mapas digitales estuvieran disponibles, compraba mapas para cada vacación, generalmente en diferentes escalas y con mucho mayor detalle del que realmente necesitaba. Por lo tanto, no debería sorprenderme que también me fascine JMP Funciones gráficas que permiten representar datos en mapas.
¿Qué es la geocodificación?
Una de las aplicaciones interesantes es la geocodificación, o la capacidad de localizar puntos en mapas. Generalmente tienes un punto de interés y su dirección. Para encontrar su posición y trazarla en un mapa, también necesitas las coordenadas geográficas. Como se podría esperar, Wikipedia ofrece más detalles sobre la geocodificación.
¿Por qué un nuevo complemento de codificación geográfica?
En los últimos años, la técnica de comunicación por ordenador conocida como DESCANSAR se ha vuelto más utilizado. En un discurso de apertura de 2019, John Sall habló sobre el “ Características secretas de JMP . “Una de estas joyas ocultas en JMP está realmente enterrada bastante profundamente: la capacidad de acceder a las API REST (interfaces de programación avanzada) a través de comandos JSL. Dado que los datos de comunicación por computadora a menudo se intercambian utilizando el " JSON ”estructura de datos, los desarrolladores de JMP crearon comandos JSL que transfieren datos entre estructuras de datos JSL y datos JSON con facilidad. Esta técnica se ha vuelto cada vez más importante. De hecho, la Universidad Johns Hopkins y el Instituto Robert Koch ofrecen API REST para sus grupos de datos para obtener información relacionada con COVID-19; Los clientes de JMP los utilizan para acceder a datos de SAP para la gestión de calidad; y uso uno para geocodificación. Esta interfaz amplía las posibilidades de intercambio de información, ya que proporciona más que las geocoordenadas de puntos de interés. También permite a los usuarios obtener información sobre distancias, tiempos de viaje e incluso rutas. Este artículo trata sobre el uso de la complemento que cargué en el intercambio de archivos. Los antecedentes técnicos se brindarán en una publicación separada, como se resume en el último párrafo.
¿Cuales son las funciones?
Necesita una tabla de datos con información de dirección por observación. Las direcciones se pueden utilizar para agregar tres niveles diferentes de información geográfica, donde cada nivel contiene la información del anterior.
- Geocoordenadas
Para cada observación, se agrega la latitud y longitud de su ubicación. Además, obtendrás la jerarquía de unidades administrativas, país, estado, distrito, código postal, ciudad, calle y una evaluación de qué tan cerca se ha impactado esa dirección, según la información disponible en la base de datos.
- Distancia y tiempo de viaje
Para cada par de filas consecutivas en su tabla de datos (por ejemplo, fila 1 –> fila 2 / fila 2 –> fila 3 /….), la distancia entre las direcciones y el tiempo de viaje requerido se agregarán a la segunda fila. Las conexiones se enumeran en una columna adicional. El tiempo de viaje se calcula en función del medio de transporte elegido por el usuario: coche, bicicleta o caminando.
- Enrutamiento
Se crea una tabla adicional que contiene toda la información anterior, así como los códigos geográficos de todos los puntos que describen la ruta entre dos filas consecutivas.
Presuposiciones
Hay varios sitios de Internet que ofrecen servicios de mapas y rutas. La revista ofrece una buena visión general. Web programable . decidí usar Búsqueda de mapas . La empresa ofrece una variedad de servicios pagos pero también una API gratuita. Si desea utilizarlo, primero debe registrarse y obtener una clave API gratuita. Por supuesto, también necesita el complemento Geocoding 2020. Se instalará solo en el menú Complementos en el submenú "Formas de mapa".
En la primera llamada, se le informará que puede obtener la clave necesaria de MapQuest y se le proporcionará un campo para pegar la clave.

El recordatorio del diálogo está deshabilitado. Una vez pegada la clave, se prueba para determinar si es una clave de MapQuest adecuada; la clave debe verificarse antes de poder continuar. Si proporcionó una clave válida, se guarda en el directorio del usuario en la carpeta AppData/Roaming/SAS/JMP. Si este directorio no existe, se creará.
Para que todos los comandos del complemento funcionen, debe configurar el idioma JMP en inglés. y seleccione la opción “Usar lenguaje JMP…”. Lamentablemente, eso no se puede hacer a través de JSL. Debe realizar estas selecciones utilizando su equivalencia de idioma en Archivo -> Preferencias -> Específico de Windows. El complemento verificará que la configuración de idioma sea correcta y le avisará si ese no es el caso.
Vamos
El menú consta de dos partes. La primera parte es el área roja superior, que está construida como casi todos los cuadros de diálogo de la plataforma JMP; contiene la lista de columnas, la parte de roles y el panel de acciones. En el área de roles hay dos partes, resaltadas por marcos azules. En su tabla de datos, la información de la dirección se puede almacenar en uno de dos formatos: ya sea como una columna que contiene la dirección completa como una cadena de texto, o como columnas separadas, donde cada columna contiene una parte de la dirección como país, ciudad, calle. Puede proporcionar cualquiera de estos formatos, pero son mutuamente excluyentes. En ambos casos, su dirección debe contener el país . Se puede dar como nombre o como código ISO, como prefieras.
La segunda parte es el marco rojo inferior que muestra qué opciones están disponibles. Están organizados en grupos de botones de opción (la captura de pantalla a continuación muestra los valores predeterminados). Todas las opciones agregan un grupo de columnas adicionales a su tabla de datos; la combinación de “Rutas” y “Rutas detalladas” crea un conjunto de datos adicional con una copia de sus datos. Estos puntos se identifican como "Puntos de interés". Además, existen "Waypoints", los puntos que necesitan giros a lo largo de su ruta.

Un ejemplo
Para probar cómo funciona todo, recopilé información de direcciones de Internet. Crecí en Solingen, un pequeño pueblo en la parte occidental de Alemania. Era muy conocido durante la época medieval por producir espadas y cubiertos de alta calidad, razón por la cual aquí encontrarás el Museo Alemán de la Cuchillería. Al lado del museo hay una iglesia barroca pequeña pero muy impresionante. También hay otros lugares famosos cerca:

|
Museo Alemán Klingen
|
Museo Alemán de la Cuchillería
|

|
Iglesia del Gräfrather Kloster
|
Iglesia del monasterio barroco
|

|
El neandertal
|
La región donde se descubrieron por primera vez los restos de una rama de nuestros antepasados
|

|
El Wuppertaler Schwebebahn
|
Un ferrocarril colgante de 13 kilómetros de longitud, el ferrocarril elevado eléctrico con vagones colgantes más antiguo del mundo, inaugurado en 1901
|

|
El puente Müngstner
|
El puente ferroviario más alto de Alemania, construido en 1897
|

|
Castillo Burg
|
Un castillo reconstruido, originario del siglo XII. th siglo
|
Después de buscar las direcciones en Internet, copié las cadenas en una tabla de datos JMP. Ninguna de las direcciones incluía el nombre de un país, por lo que antepuse "Deutschland" a todas las cadenas. Las cuerdas ahora se ven así
Alemania, Talstraße 300, 40822 Mettmann
|
Alemania, Alte Freiheit 24a, 42103 Wuppertal
|
Alemania, Klosterhof 4, 42653 Solingen
|
Alemania, Klosterhof 3, 42653 Solingen
|
Alemania, Müngstener Brückenweg, 42659 Solingen
|
Alemania, Schloßplatz 2, 42659 Solingen
|
Elegí el nombre del país alemán “Deutschland” a propósito. En el cuadro de diálogo, asigne esta columna a la función "Dirección única" y listo.

Como resultado de la ejecución, estas columnas se agregan a su conjunto de datos:
Información geográfica
|
GC#Latitud
|
GC#Longitud
|
GC#Código de país
|
GC#Estado
|
GC#Distrito
|
GC#Código Postal
|
GC#Ciudad
|
GC#Calle
|
GC#Evaluación de Calidad
|
GC#Regresar mensaje
|
Creo que los nombres de las columnas hablan por sí solos. MapQuest proporciona una calificación de calidad estimada para cada visita. Es bastante elaborado, así que resumí esa información en cuatro categorías: Exacta, Cercana, Aproximada y Lejos. Las filas de su tabla de datos obtienen símbolos y colores según esta clasificación. Todas las posiciones se muestran en un mapa y se agrega a la tabla de datos un script que reproduce este mapa. Dependiendo del área sobre la cual se distribuyen sus puntos, el mapa de fondo es Street Map o Simple Earth.
En esa tabla de datos, dividí la cadena de dirección en sus componentes individuales (es fácil si usa Cols à Utilities à Text to Column…) y solicité las coordenadas usando las funciones de “Campos de dirección separados”.

No es necesario completar todos los campos de rol en esta sección. El país es un requisito mínimo. Cuanta más información proporcione, mejor será la tasa de aciertos. Los resultados de ambos métodos para solicitar coordenadas no son completamente idénticos. Las coordenadas mismas pueden desviarse un poco y, para la solicitud detallada, se puede brindar más información (como el distrito). La evaluación de la calidad también puede variar.
Por motivos de rendimiento, los campos de dirección única se concatenan en una cadena y las solicitudes de cadena única se envían a MapQuest si hay más de 200 direcciones en su tabla de datos.
Si elige la combinación de "Ruta" y "Distancias/Solo tiempo", obtendrá la misma información que para la codificación geográfica, más tres columnas adicionales. De vez en cuando, puede recibir mensajes de error:
Punto de interés
|
GC#Regresar mensaje
|
GC#Distancia (km)
|
GC#Tiempo (Bicicleta)
|
GC#Piernas
|
neandertal
|
|
.
|
.
|
0
|
Wuppertaler Schwebebahn
|
No se puede calcular la ruta.
|
19.1287
|
:0:00:52:39
|
1
|
Museo Alemán Klingen
|
No se puede calcular la ruta.
|
0
|
:0:00:00:00
|
2
|
Iglesia del Gräfrather Kloster
|
|
0
|
:0:00:00:00
|
3
|
Puente Müngstner
|
|
9,92
|
:0:00:26:26
|
4
|
Castillo Burg
|
|
5.0163
|
:0:00:13:55
|
5
|
Las filas consecutivas forman un tramo de la ruta total. La fila de destino contiene la información de la pierna. En el ejemplo, el tramo de ida va desde Neandertal hasta Wuppertaler Schwebebahn. La distancia de una ruta en bicicleta es de aproximadamente 19 kilómetros y el tiempo estimado en bicicleta es de 52 minutos.
Por alguna razón, no se pudieron encontrar rutas ciclistas hasta el Deutsches Klingenmuseum o Gräfrather Klosterkirche. Por lo tanto, los tramos dos y tres no tienen información de viaje, mientras que los tramos cuatro y cinco vuelven a proporcionar la información respectiva.
Esta combinación de opciones solicita detalles para una ruta entre dos filas consecutivas en la tabla de datos con distancias dadas en millas:
Su tabla de datos se ampliará con las columnas descritas anteriormente para la codificación geográfica. Para el enrutamiento, se crea una tabla adicional con una copia de cada fila de su tabla de datos; entre estas filas se insertan nuevas líneas, una por cada punto significativo de la ruta. El último segmento de la gira por Solingen se ve así:

La fila 49 contiene la penúltima dirección de la tabla de datos, que es donde termina el tramo 4. El recorrido que iba desde el lugar anterior hasta este punto tenía una longitud de 15,3 kilómetros y un tiempo estimado de recorrido de 15 minutos en automóvil. Es un "Punto de Interés". La siguiente fila es el final del primer segmento del tramo 5 después de +/- 300 pies y cinco segundos de tiempo de conducción. Es el primer punto de referencia de una serie de siete, antes de llegar al siguiente (y último) punto de interés. Los mapas muestran los resultados y sus guiones también están en las tablas.
La tabla de datos es parte del complemento y se puede abrir usando el botón "Ayuda". Puedes usarlo para empezar a jugar y mirar las fotografías de las atracciones que incluí.
Y si tu Si alguna vez vienes a esta zona y visitas algunos de los lugares, no olvides buscar un restaurante que sirva Bergische Kaffeetafel , una combinación muy rica de especialidades locales que incluyen pan, salchichas, arroz dulce, gofres y más. Es muy conocido en toda la zona y lo elegí como demostración, por lo que deberías poder encontrarlo en muchos restaurantes.

En la primera carrera
MapQuest requiere que tengas una clave API personal. Lo obtienes de su sitio web del desarrollador gratis. El complemento solicita esta clave y proporciona un campo para pegarla.

El complemento almacena la clave en el directorio appdata del usuario para SAS\JMP. Antes de cada ejecución, intenta leer la clave y la usará mientras esté allí.
Filas excluidas/enrutamiento no posible

El complemento asigna símbolos, colores y etiquetas a las filas, pero también respeta el estado de fila "excluida", lo que tiene consecuencias específicas para la aplicación de enrutamiento. Si se excluye una fila o no es posible enrutar a su dirección, entonces esta fila se ignora y se busca una ruta a la siguiente dirección.
En esta situación, se buscarán rutas entre Neandertal y Wuppertaler Schwebebahn, entre Wuppertaler Schwebebahn y Müngstner Brücke y entre Müngstner Brücke y Schloss Burg.
De manera similar, se omitirán las ubicaciones si no es posible dirigirse a ellas.
Detalles técnicos
El observador atento habrá notado que el diálogo principal está contenido en una pestaña. Las pestañas son inútiles si están solas. Esta pestaña refleja la idea de que las ubicaciones de las rutas pueden aparecer en diferentes formatos. Si se solicitan formas alternativas de proporcionar ubicaciones para el enrutamiento, esa pestaña puede tener hermanos.
Me motivé a escribir este complemento como resultado de mi interés combinado en los mapas en general y la técnica API REST. Para que este último sea más transparente y quizás incluso más utilizado, puse tres archivos en el libro de cocina JSL. Están definiendo funciones que pueden ser llamadas por otros programas. Una es la llamada REST a MapQuest. Describo el contenido y una descripción de la interfaz en una publicación de blog sobre llamada cruda de MapQuest . Los otros scripts son sobres para la llamada REST. Toman listas JMP como entradas y construyen las estructuras JSON necesarias para el geocodificación o enrutamiento llamar. Si hay muchas direcciones para codificar, las empaqueta en bloques de 50 para una mayor confiabilidad y rendimiento. En las publicaciones de mi blog sobre el geocodificación y el enrutamiento subrutinas, describo estas piezas de código con mayor detalle.
Como se mencionó anteriormente, los programadores de JMP hicieron un gran trabajo al proporcionar funciones JSL que se traducen en ambas direcciones entre las estructuras de datos JMP y JSON. En términos JSL, hay listas y matrices asociativas involucradas. Estos elementos se pueden apilar. Es posible que tenga una matriz asociativa que contenga una lista de matrices asociativas que contenga…. Una sola llamada a MapQuest entrega un rico conjunto de datos del cual solo necesitaba algunos de los elementos. A veces, estos estaban a dos niveles de profundidad en la pila; otras veces, a muchos niveles de profundidad. Así que me resultó útil escribir un pequeño guión que itera a través de esta estructura. Y no sería un JMPer respetable si no buscara una visualización del resultado. Encontré la manera perfecta en el diagrama de Ishikawa. Programar esto me recordó el poder de la recursividad, que es la mejor técnica para bajar de una pila profunda y regresar de forma segura. Pensé que también podría ayudar o inspirar a otros programadores. Puse el guión en el libro de cocina y, naturalmente, escribió una publicación sobre recursividad y dibujo de estructuras jerárquicas.
Utilicé JMP 15 para el desarrollo, utilizando un proyecto JMP. No diría que mi pequeño proyecto no podría haber tenido lugar sin Projects, pero Projects lo hizo mucho más fácil.