---
title: "Prepare-se para o inesperado – o Altova MissionKit resolve um mistério relacionado a formatos de números"
date: "2013-01-10"
tags: 
  - "data-mapping"
  - "mapforce"
  - "missionkit"
  - "xmlspy"
description: Descubra como o Altova MissionKit, especialmente o MapForce e o XMLSpy, ajudam a diagnosticar e resolver problemas de mapeamento de dados, incluindo a gestão de notação científica em coordenadas GPS.
---
Status: #blog

Tags:  #data-mapping #mapforce #missionkit #xmlspy

Categories: [Altova](/blog/pt/category/altova.md) 
# Prepare-se para o inesperado – o Altova MissionKit resolve um mistério relacionado a formatos de números

Sempre que recebe dados de uma fonte externa, existe a possibilidade de que estes não cheguem no formato que espera. Isto pode exigir adaptações especiais para que uma solução de mapeamento e transformação de dados, que é rara e improvável, seja robusta e fiável no mundo real.

Processámos literalmente dezenas de ficheiros .gpx, cada um contendo centenas de coordenadas, através da ferramenta de mapeamento MapForce, da qual falamos no artigo do blogue "[Serviço Web como Tabela de Consulta para Refinar Dados GPS](https://www.altova.com/blog/2012/06/web-service-as-look-up-table-to-refine.html)". Um dia, ao processar um novo ficheiro, detetámos o erro abaixo, que impediu o mapeamento de funcionar corretamente:

![Mensagem de erro durante o mapeamento dos dados dos serviços 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")

Ao recorrer ao [Altova MissionKit](https://www.altova.com/pt/missionkit.html) para combinar as funcionalidades do [MapForce](https://www.altova.com/pt/mapforce.html) e do [XMLSpy](https://www.altova.com/pt/xmlspy.html), conseguimos diagnosticar rapidamente o problema e desenvolver uma solução que também podemos reutilizar em futuros projetos de mapeamento.

<!--more-->

Inicialmente, suspeitamos de um problema com os dados de entrada, por isso, abrimos o ficheiro no XMLSpy, onde ele passou os testes de estrutura correta e.. [Validação de XML](https://www.altova.com/pt/xmlspy/xml-validator.html) testes. Felizmente, cada ponto de dados tem um carimbo de data e hora único, por isso, procurámos por "23:06:22", que corresponde ao último conjunto de coordenadas GPS que foram processadas com sucesso. Esse carimbo de data e hora apareceu uma vez na linha 1772 do ficheiro de entrada.

Não havia nada de obviamente errado nos dados originais que se seguiram. Simplesmente comentámos o próximo ponto de dados e guardámos o ficheiro para repor o processo de mapeamento:

![Comentar uma parte de um ficheiro XML](https://lh3.ggpht.com/-UeqIOKWBDp8/UO2I0JP9HII/AAAAAAAAA6s/3GC5RMqRXAA/clip_image002%25255B3%25255D.png?imgmax=800 "Commenting out a portion of an XML file")

Desta vez, o processo de mapeamento foi concluído com sucesso:

![Janela de Mensagens do Altova MapForce](https://lh5.ggpht.com/-K0ySupBx4ZM/UO2I1KQnttI/AAAAAAAAA60/BpfcM6B9RY0/clip_image003%25255B3%25255D.png?imgmax=800 "Altova MapForce Messages window")

Agora, desconfiávamos dos dados fornecidos pelo serviço web. Embora o Serviço Geológico dos Estados Unidos, através do seu Programa Nacional de Geoinformação, seja o responsável pelo serviço web, talvez a base de dados subjacente contivesse informações incorretas.

Inserimos um ficheiro .csv simples no mapeamento como uma saída alternativa e mapeámos os resultados de elevação para cada conjunto de coordenadas de origem, de forma a analisar a saída do serviço web.

![Utilizar um ficheiro de texto simples para recolher dados de um serviço 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")

Uma linha no ficheiro de saída "diagnostic.csv" continha o mesmo valor, entre aspas, que foi mencionado na mensagem de erro anterior:

![Exemplo de saída do serviço web](https://lh3.ggpht.com/-_8RAIySmcXg/UO2I2ssrbNI/AAAAAAAAA7E/qtT4BbsKONo/clip_image005%25255B3%25255D.png?imgmax=800 "Sample output from the Web service")

É notação científica! O serviço web devolveu um número formatado em [notação científica](http://en.wikipedia.org/wiki/Scientific_notation)! A função de precisão decimal no nosso mapeamento de dados, que processa o resultado do serviço web, requer uma entrada decimal.

**Conversão de tipos de dados**

Uma possível estratégia seria escrever uma função que reconheça o resultado do serviço web como notação científica e calcule explicitamente o valor numérico. A mensagem de erro do MapForce, "Conversão para '**decimal** falhou para '-1.24202767892712E-06'", sugere uma solução mais simples.

Este é um bom momento para refletir sobre os tipos de dados. O componente de serviço web na nossa configuração indica claramente que retorna uma cadeia de texto. O MapForce realiza automaticamente conversões de tipo de cadeia de texto para número decimal quando uma configuração conecta uma cadeia de texto como entrada para uma fórmula matemática. Na maioria dos casos, isto liberta os programadores da necessidade de pensar em conversões de tipo explícitas, à medida que os dados se movem entre diferentes formatos. Na nossa configuração, o MapForce realizou com sucesso a conversão de tipo de uma cadeia de texto para um número decimal 178 vezes, antes de encontrar a entrada em notação científica.

A notação científica é normalmente utilizada para números que são demasiado grandes ou demasiado pequenos para serem registados de forma conveniente em formato decimal. No MapForce, o tipo de dados decimal não especifica o tamanho ou o valor do número. Em vez disso, identifica o tipo decimal XML, que é uma sequência de caracteres numéricos com um ponto como separador decimal.

Em XML – e no MapForce – o tipo de dados "double" suporta a notação científica. Podemos converter explicitamente dados em notação científica para o tipo de dados "double" e, em seguida, arredondar o resultado.

Esta solução é fácil de testar através de uma configuração simples, utilizando ficheiros de texto tanto para a entrada como para a saída. Introduzimos uma variável simples antes da função de arredondamento e definimos o seu tipo de dados como "double". Para o nosso primeiro teste, utilizamos os dados obtidos do serviço web da USGS como entrada, permitindo-nos processar os mesmos dados sem ter de efetuar repetidamente as chamadas ao serviço web. Esta configuração também nos permite criar facilmente mais casos de teste com novos dados de entrada.

![Atribuir o tipo de dados de uma variável no 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")

O processo de mapeamento foi concluído com sucesso, gerando o seguinte resultado:

![Exemplo de saída resultante do mapeamento de dados modificado](https://lh4.ggpht.com/-4jeljPRsVcU/UO2I3iKQtZI/AAAAAAAAA7U/sH3Wn2YS05I/clip_image007%25255B3%25255D.png?imgmax=800 "Example output from the mdified data mapping")

**Criar uma função para o utilizador**

[Funções do utilizador](https://www.altova.com/pt/mapforce/visual-function-builder.html) no MapForce são definidas num único ficheiro de mapeamento e podem ser adicionadas à Biblioteca de Funções para serem utilizadas em outros ficheiros de mapeamento, mesmo por vários utilizadores. As funções do utilizador também encapsulam operações complexas e ajudam a tornar o fluxo de dados geral de um projeto de mapeamento complexo muito mais rastreável.

Já tínhamos modificado a chamada simples do serviço web, escolhendo o banco de dados para a costa leste ou oeste dos Estados Unidos com base na longitude. Agora, adicionar tipagem explícita ao resultado torna a chamada da função "getElevation" ainda mais complexa. Optámos por definir tudo numa função definida pelo utilizador.

![Uma função de utilizador no MapForce para encapsular uma operação complexa](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")

**Aplicar a função do utilizador**

No diagrama abaixo, inserimos a nova função getElevationUS.

![O software MapForce, para mapeamento de dados, foi aprimorado com uma função personalizada](https://lh5.ggpht.com/-1WM_YloAs9Q/UO2I5OcvIQI/AAAAAAAAA7k/0rKkFhfhmKY/clip_image009%25255B3%25255D.png?imgmax=800 "MapForce data mapping enhanced with a User Function") 

Neste momento, é importante relembrar por que motivo arredondamos a altitude retornada pelo serviço web. O serviço web retorna um valor em metros, e duas casas decimais – ou seja, cada centímetro – representam menos de meio centímetro.

Poderíamos ter incluído a operação de arredondamento como parte da função `getElevationUS`, mas a função será mais útil em futuras mapeações de dados se não arredondar os dados de altitude originais.

A saída do mapeamento atualizado é apresentada abaixo, utilizando o mesmo ficheiro .gpx que causou o problema inicial. Procurámos no ficheiro de saída a marca de tempo 23:06:22, que utilizamos para encontrar as últimas coordenadas corretas antes do erro. O ponto a partir da linha 902 é aquele que falhou.

![Amostra de dados proveniente de um mapeamento de dados no 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, ficámos desiludidos por todo este esforço ter resultado apenas num valor que se aproximava de zero. Depois, mapeámos as coordenadas suspeitas num mapa do Google:

![Localizar um ponto através da latitude e longitude](https://lh6.ggpht.com/-0v5cW6dbhms/UO2I6ssKn6I/AAAAAAAAA7w/6Kq-1XDWz5Q/clip_image011%25255B3%25255D.png?imgmax=800 "Locating a point by latitude and longitude")

Uma parte do percurso seguiu uma ponte sobre uma zona costeira sujeita a marés. Mesmo que nunca voltemos a usar a função "getElevationUS" em futuros mapeamentos de dados, é muito provável que outros ficheiros .gpx, referentes a outras viagens, passem por outras zonas costeiras sujeitas a marés, onde poderão gerar valores de altitude muito pequenos.

**Se desejar utilizar as ferramentas em** [**Altova MissionKit**](https://www.altova.com/pt/missionkit/software-development-tools.html) **para criar funções personalizadas para as suas próprias associações de dados** [Clique aqui para descarregar uma versão de avaliação gratuita](https://www.altova.com/pt/download-trial/)**.**
