---
title: "Oczekuj nieoczekiwanego – Altova MissionKit rozwiązuje zagadkę formatów liczbowych"
date: "2013-01-10"
tags: 
  - "data-mapping"
  - "mapforce"
  - "missionkit"
  - "xmlspy"
description: Odkryj, w jaki sposób pakiet Altova MissionKit, a w szczególności narzędzia MapForce i XMLSpy, pomaga w diagnozowaniu i rozwiązywaniu problemów związanych z mapowaniem danych, w tym w obsłudze notacji naukowej w przypadku współrzędnych GPS.
---
Status: #blog

Tags:  #data-mapping #mapforce #missionkit #xmlspy

Categories: [Altova](/blog/pl/category/altova.md) 
# Oczekuj nieoczekiwanego – Altova MissionKit rozwiązuje zagadkę formatów liczbowych

Za każdym razem, gdy otrzymujesz dane z zewnętrznego źródła, istnieje ryzyko, że nie dotrą one w oczekiwanej formie. Może to wymagać specjalnych rozwiązań, aby zapewnić niezawodność i stabilność systemu mapowania i transformacji danych w rzeczywistych warunkach, zwłaszcza w sytuacjach rzadkich i mało prawdopodobnych.

Przetwarzaliśmy dosłownie dziesiątki plików .gpx, z których każdy zawierał setki współrzędnych, wykorzystując narzędzie MapForce, o którym pisaliśmy w artykule na blogu [Usługa internetowa jako baza danych do precyzji danych GPS](https://www.altova.com/blog/2012/06/web-service-as-look-up-table-to-refine.html). Pewnego dnia uruchomiliśmy nowy plik i napotkaliśmy poniższy błąd, który spowodował niepowodzenie procesu mapowania:

![Komunikat o błędzie podczas mapowania danych usług internetowych](https://lh6.ggpht.com/-8eeq0Sre-5o/UO2IztvOjdI/AAAAAAAAA6k/LhnY21vwyK8/clip_image001%25255B3%25255D.png?imgmax=800 "Error message during mapping of Web services data")

Korzystając z zestawu narzędzi [Altova MissionKit](https://www.altova.com/pl/missionkit.html), który łączy funkcje programów [MapForce](https://www.altova.com/pl/mapforce.html) i [XMLSpy](https://www.altova.com/pl/xmlspy.html), szybko zdiagnozowaliśmy problem i opracowaliśmy rozwiązanie, które możemy również wykorzystać w przyszłych projektach mapowania danych.

<!--more-->

Początkowo podejrzewaliśmy problem z danymi wejściowymi, więc otworzyliśmy plik w programie XMLSpy, gdzie przeszedł on testy poprawności składni i [walidacji XML](https://www.altova.com/pl/xmlspy/xml-validator.html). Na szczęście, każdy punkt danych posiada unikalny znacznik czasu, więc przeszukaliśmy plik w poszukiwaniu godziny 23:06:22, oznaczającej ostatni zestaw współrzędnych GPS, który został pomyślnie przetworzony. Ten znacznik czasu wystąpił raz, w linii 1772 pliku wejściowego.

W danych źródłowych, które pojawiły się bezpośrednio po tym fragmencie, nie było nic, co wskazywałoby na oczywisty błąd. Po prostu zakomentowaliśmy kolejny punkt danych i zapisaliśmy plik, aby ponownie przetworzyć mapowanie

![Komentowanie fragmentu pliku XML](https://lh3.ggpht.com/-UeqIOKWBDp8/UO2I0JP9HII/AAAAAAAAA6s/3GC5RMqRXAA/clip_image002%25255B3%25255D.png?imgmax=800 "Commenting out a portion of an XML file")

Tym razem proces mapowania przebiegł pomyślnie:

![Okno "Wiadomości" w programie Altova MapForce](https://lh5.ggpht.com/-K0ySupBx4ZM/UO2I1KQnttI/AAAAAAAAA60/BpfcM6B9RY0/clip_image003%25255B3%25255D.png?imgmax=800 "Altova MapForce Messages window")

Teraz zaczęliśmy mieć wątpliwości co do danych zwracanych przez usługę internetową. Mimo że tę usługę prowadzi Narodowy Program Geoprzestrzenny Amerykańskiego Urzędu Geologicznego, możliwe, że baza danych, na której ona opiera się, zawierała nieprawidłowe dane.

Wprowadziliśmy prosty plik .csv do konfiguracji mapowania jako alternatywne wyjście i przyporzadkowaliśmy wyniki wysokościowe dla każdego zestawu współrzędnych źródłowych, aby przeanalizować wynik działania usługi internetowej.

![Wykorzystanie prostego pliku tekstowego do zbierania danych z usługi internetowej](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")

W jednym z wierszy pliku diagnostycznego "diagnostic.csv" znajdowała się ta sama wartość, która została podana w poprzednim komunikacie o błędzie:

![Przykładowy wynik działania usługi internetowej](https://lh3.ggpht.com/-_8RAIySmcXg/UO2I2ssrbNI/AAAAAAAAA7E/qtT4BbsKONo/clip_image005%25255B3%25255D.png?imgmax=800 "Sample output from the Web service")

To jest notacja naukowa! Usługa internetowa zwróciła liczbę sformatowaną w [notacji naukowej](http://en.wikipedia.org/wiki/Scientific_notation)! Funkcja zaokrąglania precyzji w naszym narzędziu mapowania danych, które przetwarza wynik usługi internetowej, wymaga wprowadzenia danych w formacie dziesiętnym.

**Konwersja typów danych**

Jedną z możliwych strategii jest napisanie funkcji, która rozpoznaje wynik usługi internetowej jako notację naukową i wyraźnie oblicza wartość numeryczną. Komunikat o błędzie MapForce, brzmiący „Konwersja na **dziesiętną** nie powiodła się dla wartości ‘-1.24202767892712E-06’”, sugeruje prostsze rozwiązanie.

To dobry moment, aby zastanowić się nad typami danych. Komponent usługi internetowej w naszej mapie wyraźnie wskazuje, że zwraca tekst. MapForce automatycznie wykonuje konwersje typów ze stringu na liczbę dziesiętną, gdy mapowanie łączy string jako dane wejściowe do wzoru matematycznego. W większości przypadków to zwalnia programistów z konieczności ręcznego określania konwersji typów, ponieważ dane przesyłane są między różnymi formatami. W naszej mapie, MapForce pomyślnie wykonał konwersję z stringu na liczbę dziesiętną 178 razy, zanim napotkał wartość wyrażoną w notacji naukowej.

Notacja naukowa jest zwykle używana dla liczb, które są zbyt duże lub zbyt małe, aby można je było wygodnie zapisać w postaci dziesiętnej. W programie MapForce, typ danych "decimal" nie określa rozmiaru ani wartości liczby. Zamiast tego, identyfikuje on typ "decimal" w XML, czyli sekwencję znaków składającą się z cyfr, z kropką jako separatorem dziesiętnym.

W formacie XML – oraz w programie MapForce – typ danych "double" obsługuje notację naukową. Możemy jawnie przekształcić dane w notacji naukowej na typ "double", a następnie zaokrąglić wynik.

To rozwiązanie jest łatwe do przetestowania za pomocą prostego odwzorowania, wykorzystującego pliki tekstowe zarówno jako dane wejściowe, jak i wyjściowe. Wprowadziliśmy prostą zmienną przed funkcją zaokrąglania i ustawiliśmy jej typ danych jako "double". W naszym pierwszym teście wykorzystaliśmy dane pobrane z serwisu internetowego USGS jako dane wejściowe, aby przetworzyć te same dane bez konieczności wielokrotnego wykonywania zapytań do serwisu internetowego. To odwzorowanie pozwala nam również łatwo tworzyć dodatkowe przypadki testowe z nowymi danymi wejściowymi.

![Przypisywanie typu danych zmiennej w programie 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")

Proces mapowania przebiegł pomyślnie, w wyniku czego uzyskano następujący wynik:

![Przykładowy wynik działania zmodyfikowanego mapowania danych](https://lh4.ggpht.com/-4jeljPRsVcU/UO2I3iKQtZI/AAAAAAAAA7U/sH3Wn2YS05I/clip_image007%25255B3%25255D.png?imgmax=800 "Example output from the mdified data mapping")

**Utwórz funkcję użytkownika**

[Funkcje użytkownika](https://www.altova.com/pl/mapforce/visual-function-builder.html) w MapForce są definiowane w jednym pliku mapowania i mogą być dodawane do biblioteki funkcji, aby być wykorzystywane w innych plikach mapowania, nawet przez wielu użytkowników. Funkcje użytkownika również pozwalają na enkapsulację skomplikowanych operacji i ułatwiają śledzenie przepływu danych w dużych projektach mapowania.

Zmodernizowaliśmy już prosty wywołanie usługi internetowej, wybierając bazę danych dla wschodniej lub zachodniej części Stanów Zjednoczonych w zależności od długości geograficznej. Teraz, dodanie jawnego określenia typów danych do wyniku sprawia, że wywoływanie funkcji `getElevation` staje się jeszcze bardziej skomplikowane. Postanowiliśmy zdefiniować wszystko w funkcji użytkownika.

![Funkcja użytkownika w MapForce, służąca do enkapsulacji złożonej operacji](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")

**Wykorzystanie funkcji użytkownika**

W poniższym fragmencie kodu dodaliśmy nową funkcję o nazwie getElevationUS.

![MapForce: Rozszerzone mapowanie danych dzięki funkcji użytkownika](https://lh5.ggpht.com/-1WM_YloAs9Q/UO2I5OcvIQI/AAAAAAAAA7k/0rKkFhfhmKY/clip_image009%25255B3%25255D.png?imgmax=800 "MapForce data mapping enhanced with a User Function") 

W tym momencie warto przypomnieć, dlaczego początkowo zaokrąglaliśmy wartość wysokości zwróconą przez usługę internetową. Usługa internetowa zwraca wartość w metrach, a dwa miejsca po przecinku – czyli każdy centymetr – to mniej niż pół cala.

Moglibyśmy zintegrować operację zaokrąglania jako część funkcji `getElevationUS`, ale funkcja będzie bardziej przydatna w przyszłych operacjach mapowania danych, jeśli nie będzie zaokrąglać surowych danych wysokościowych.

Wynik poprawionej konwersji jest przedstawiony poniżej, przy użyciu tego samego pliku .gpx, który spowodował początkowy problem. Przeszukaliśmy plik wynikowy w poszukiwaniu godziny 23:06:22, czyli znacznika czasu, który wykorzystaliśmy do znalezienia ostatnich poprawnych współrzędnych przed wystąpieniem błędu. Punkt, który spowodował błąd, zaczyna się na linii 902 i jest następujący:

![Przykładowe dane pochodzące z mapowania danych w programie MapForce](https://lh5.ggpht.com/-k6NYBvSghlA/UO2I52w8KQI/AAAAAAAAA7s/0-s7KfpJdpE/clip_image010%25255B3%25255D.png?imgmax=800 "Sample data from a MapForce data mapping")

Początkowo byliśmy rozczarowani, ponieważ okazało się, że cały ten wysiłek doprowadził jedynie do ustalenia wysokości, która zaokrąglona wynosiła zero. Następnie zlokalizowaliśmy te podejrzane współrzędne na mapie Google:

![Określanie położenia punktu za pomocą współrzędnych geograficznych (szerokości i długości)](https://lh6.ggpht.com/-0v5cW6dbhms/UO2I6ssKn6I/AAAAAAAAA7w/6Kq-1XDWz5Q/clip_image011%25255B3%25255D.png?imgmax=800 "Locating a point by latitude and longitude")

Część trasy prowadziła mostem nad zatoką pływową. Nawet jeśli funkcja `getElevationUS` nie zostanie ponownie wykorzystana w przyszłych projektach mapowania danych, jest bardzo prawdopodobne, że inne pliki .gpx, dotyczące innych wycieczek, będą prowadzić przez inne zatoki pływowe, gdzie mogą generować jeszcze więcej bardzo małych wartości wysokości.

**Jeśli chcieliby Państwo korzystać z tych narzędzi, proszę** [**Altova MissionKit**](https://www.altova.com/pl/missionkit/software-development-tools.html) **aby tworzyć własne funkcje, które będą służyły do mapowania danych** [Kliknij tutaj, aby pobrać bezpłatną wersję próbną](https://www.altova.com/pl/download-trial/)**.**
