---
title: "Prepárese para lo inesperado: Altova MissionKit resuelve un misterio relacionado con formatos de números"
date: "2013-01-10"
tags: 
  - "data-mapping"
  - "mapforce"
  - "missionkit"
  - "xmlspy"
description: Descubra cómo Altova MissionKit, en particular MapForce y XMLSpy, ayuda a diagnosticar y resolver problemas de mapeo de datos, incluyendo el manejo de la notación científica en las coordenadas GPS.
---
Status: #blog

Tags:  #data-mapping #mapforce #missionkit #xmlspy

Categories: [Altova](/blog/es/category/altova.md) 
# Prepárese para lo inesperado: Altova MissionKit resuelve un misterio relacionado con formatos de números

Cada vez que se reciben datos de una fuente externa, existe la posibilidad de que no lleguen en el formato esperado. Esto puede requerir adaptaciones especiales para que una solución de mapeo y transformación de datos, que se utiliza en situaciones reales, sea robusta y fiable, incluso en casos poco frecuentes.

Procesamos literalmente decenas de archivos .gpx, cada uno conteniendo cientos de coordenadas, utilizando la herramienta de mapeo MapForce de la que hablamos en la entrada del blog titulada "[Servicio web como tabla de consulta para refinar datos de GPS](https://www.altova.com/blog/2012/06/web-service-as-look-up-table-to-refine.html)". Un día, al procesar un nuevo archivo, nos encontramos con el siguiente error, que provocó que el mapeo fallara:

![Mensaje de error durante la asignación de datos de servicios web](https://lh6.ggpht.com/-8eeq0Sre-5o/UO2IztvOjdI/AAAAAAAAA6k/LhnY21vwyK8/clip_image001%25255B3%25255D.png?imgmax=800 "Error message during mapping of Web services data")

Utilizando las herramientas de [Altova MissionKit](https://www.altova.com/es/missionkit.html) para combinar las funcionalidades de [MapForce](https://www.altova.com/es/mapforce.html) y [XMLSpy](https://www.altova.com/es/xmlspy.html), pudimos diagnosticar rápidamente el problema y desarrollar una solución que también podemos reutilizar en futuros proyectos de mapeo.

<!--more-->

Inicialmente, sospechamos que el problema estaba en los datos de entrada, por lo que abrimos el archivo en XMLSpy, donde superó las pruebas de estructura correcta y de [validación XML](https://www.altova.com/es/xmlspy/xml-validator.html). Afortunadamente, cada punto de datos tiene una marca de tiempo única, por lo que buscamos la marca de tiempo 23:06:22, que correspondía al último conjunto de coordenadas GPS que se procesaron correctamente. Esa marca de tiempo apareció una vez en la línea 1772 del archivo de entrada.

No se observó nada evidentemente incorrecto en los datos originales que seguían. Simplemente comentamos la siguiente entrada de datos y guardamos el archivo para volver a procesar la configuración

![Comentar una sección de un archivo XML](https://lh3.ggpht.com/-UeqIOKWBDp8/UO2I0JP9HII/AAAAAAAAA6s/3GC5RMqRXAA/clip_image002%25255B3%25255D.png?imgmax=800 "Commenting out a portion of an XML file")

Esta vez, el proceso de mapeo se completó con éxito:

![Ventana de mensajes de Altova MapForce](https://lh5.ggpht.com/-K0ySupBx4ZM/UO2I1KQnttI/AAAAAAAAA60/BpfcM6B9RY0/clip_image003%25255B3%25255D.png?imgmax=800 "Altova MapForce Messages window")

Ahora desconfiábamos de los datos que devolvía el servicio web. Aunque el Servicio Geológico de los Estados Unidos, a través de su Programa Nacional de Geoinformación, gestiona el servicio web, es posible que la base de datos subyacente contuviera información incorrecta.

Insertamos un archivo .csv sencillo en el sistema de mapeo como una salida alternativa y mapeamos los resultados de la elevación para cada conjunto de coordenadas de origen, con el fin de analizar la salida del servicio web.

![Utilizar un archivo de texto sencillo para capturar datos de un servicio web](https://lh6.ggpht.com/-KAc2wKzVjes/UO2I1myy8oI/AAAAAAAAA68/aSoxAnJ7Zh8/clip_image004%25255B3%25255D.png?imgmax=800 "Using a simple text file to capture data from a Web service")

Una de las líneas del archivo de diagnóstico "diagnostic.csv" contenía el mismo valor que se mencionaba en el mensaje de error anterior:

![Ejemplo de la salida del servicio web](https://lh3.ggpht.com/-_8RAIySmcXg/UO2I2ssrbNI/AAAAAAAAA7E/qtT4BbsKONo/clip_image005%25255B3%25255D.png?imgmax=800 "Sample output from the Web service")

¡Es notación científica! El servicio web devolvió un número formateado en [notación científica](http://en.wikipedia.org/wiki/Scientific_notation). La función de precisión decimal en nuestro sistema de mapeo de datos, que procesa el resultado del servicio web, requiere una entrada en formato decimal.

**Conversión de tipos de datos**

Una posible estrategia sería escribir una función que reconozca el resultado del servicio web como notación científica y calcule explícitamente el valor numérico. El mensaje de error de MapForce, "La conversión a **decimal** falló para '-1.24202767892712E-06'", sugiere una solución más sencilla.

Este es un buen momento para reflexionar sobre los tipos de datos. El componente de servicio web en nuestro mapeo indica claramente que devuelve una cadena de texto. MapForce realiza automáticamente conversiones de tipo de cadena a número decimal cuando un mapeo conecta una cadena como entrada a una fórmula matemática. En la mayoría de los casos, esto libera a los desarrolladores de tener que pensar en conversiones de tipo explícitas a medida que los datos se transfieren entre formatos. En nuestro mapeo, MapForce realizó con éxito la conversión de tipo de una cadena a un número decimal 178 veces antes de encontrar el valor en notación científica.

La notación científica se utiliza normalmente para números que son demasiado grandes o demasiado pequeños para ser representados de forma cómoda en formato decimal. En MapForce, el tipo de dato decimal no especifica el tamaño ni el valor del número. En cambio, identifica el tipo decimal de XML, que es una secuencia de caracteres que representan dígitos y utiliza un punto como separador decimal.

En XML, y también en MapForce, el tipo de dato "double" admite la notación científica. Podemos convertir explícitamente datos en notación científica al tipo de dato "double" y, posteriormente, redondear el resultado.

Esta solución es fácil de probar mediante una configuración sencilla, utilizando archivos de texto tanto para la entrada como para la salida. Insertamos una variable simple antes de la función de ajuste de precisión y asignamos su tipo de dato como "double". Para nuestra primera prueba, utilizamos los datos obtenidos del servicio web de la USGS como entrada, para procesar los mismos datos sin necesidad de realizar repetidamente las llamadas al servicio web. Esta configuración también nos permite crear fácilmente más casos de prueba con nuevos datos de entrada.

![Asignar el tipo de dato de una variable en MapForce](https://lh5.ggpht.com/-hosv1fkHlMw/UO2I2yvIsVI/AAAAAAAAA7M/-jMNaESV_rA/clip_image006%25255B3%25255D.png?imgmax=800 "Assigning the datatype of a variable in MapForce")

El proceso de mapeo se completó con éxito, generando la siguiente salida:

![Ejemplo de la salida obtenida a partir del mapeo de datos modificado](https://lh4.ggpht.com/-4jeljPRsVcU/UO2I3iKQtZI/AAAAAAAAA7U/sH3Wn2YS05I/clip_image007%25255B3%25255D.png?imgmax=800 "Example output from the mdified data mapping")

**Crear una función de usuario**

[Funciones de usuario](https://www.altova.com/es/mapforce/visual-function-builder.html) en MapForce se definen en un único archivo de mapeo y pueden añadirse a la Biblioteca de Funciones para su uso en otros archivos de mapeo, incluso por múltiples usuarios. Las funciones de usuario también encapsulan operaciones complejas y ayudan a que el flujo de datos general de un diseño de mapeo extenso sea mucho más fácil de rastrear.

Ya habíamos modificado la sencilla llamada al servicio web, eligiendo la base de datos para la parte este u oeste de los Estados Unidos continentales en función de la longitud. Ahora, añadir una definición explícita de los tipos de datos al resultado hace que la llamada a "getElevation" sea aún más compleja. Decidimos definir todo dentro de una función de usuario.

![Una función de usuario en MapForce para encapsular una operación compleja](https://lh6.ggpht.com/-EgfsEE1molQ/UO2I4X0fxbI/AAAAAAAAA7c/lgbGUeDDmIU/clip_image008%25255B3%25255D.png?imgmax=800 "A user function in MapForce to encapsulate a complex operation")

**Aplicación de la función del usuario**

En el siguiente diagrama, hemos incorporado la nueva función getElevationUS.

![MapForce, la herramienta de mapeo de datos, ahora cuenta con una función mejorada gracias a la incorporación de una función definida por el usuario](https://lh5.ggpht.com/-1WM_YloAs9Q/UO2I5OcvIQI/AAAAAAAAA7k/0rKkFhfhmKY/clip_image009%25255B3%25255D.png?imgmax=800 "MapForce data mapping enhanced with a User Function") 

En este punto, es importante recordar por qué redondeamos la altitud que devuelve el servicio web. El servicio web devuelve un valor en metros, y dos decimales, es decir, cada centímetro, representa menos de media pulgada.

Podríamos haber incluido la operación de redondeo como parte de la función "getElevationUS", pero la función será más útil en futuras aplicaciones de mapeo de datos si no redondea los datos de elevación originales.

A continuación se muestra el resultado del nuevo proceso de mapeo, utilizando el mismo archivo .gpx que causó el problema inicial. Buscamos en el archivo de salida la marca de tiempo 23:06:22, que utilizamos para encontrar las últimas coordenadas correctas antes del error. El siguiente punto, a partir de la línea 902, es el que generó el fallo.

![Ejemplo de datos obtenidos de un mapeo de datos realizado con MapForce](https://lh5.ggpht.com/-k6NYBvSghlA/UO2I52w8KQI/AAAAAAAAA7s/0-s7KfpJdpE/clip_image010%25255B3%25255D.png?imgmax=800 "Sample data from a MapForce data mapping")

Inicialmente, nos decepcionó que todo este esfuerzo se redujera a una elevación que, al redondear, daba 0. Luego, ubicamos las coordenadas sospechosas en un mapa de Google:

![Localizar un punto mediante su latitud y longitud](https://lh6.ggpht.com/-0v5cW6dbhms/UO2I6ssKn6I/AAAAAAAAA7w/6Kq-1XDWz5Q/clip_image011%25255B3%25255D.png?imgmax=800 "Locating a point by latitude and longitude")

Una parte de la ruta seguía un puente que cruzaba una ensenada influenciada por las mareas. Aunque es poco probable que volvamos a utilizar la función getElevationUS en futuros proyectos de mapeo de datos, es muy posible que otros archivos .gpx, correspondientes a otros viajes, crucen otras ensenadas influenciadas por las mareas, donde podrían generar valores de elevación aún más pequeños.

**Si desea utilizar las herramientas en** [**Altova MissionKit**](https://www.altova.com/es/missionkit/software-development-tools.html) **para crear funciones personalizadas que le permitan definir sus propios mapeos de datos** [**Haga clic aquí para descargar una versión de prueba gratuita.**](https://www.altova.com/es/download-trial/)**.**
