---
title: "予期せぬ事態にも対応 – Altova MissionKitが、数値フォーマットに関する謎を解決します"
date: "2013-01-10"
tags: 
  - "data-mapping"
  - "mapforce"
  - "missionkit"
  - "xmlspy"
description: Altova MissionKit、特にMapForceとXMLSpyが、データマッピングの問題の診断と解決にどのように役立つかを発見してください。例えば、GPS座標における科学表記の処理などについても解説します。
---
Status: #blog

Tags:  #data-mapping #mapforce #missionkit #xmlspy

Categories: [Altova](/blog/ja/category/altova.md) 
# 予期せぬ事態にも対応 – Altova MissionKitが、数値フォーマットに関する謎を解決します

外部からのデータを受け取るたびに、そのデータが期待される形式で到達しない可能性があります。そのため、まれではありますが、現実世界のデータ処理において、堅牢で信頼性の高いソリューションを構築するためには、特別な対応が必要となる場合があります。

私たちは、ブログ記事「[Webサービスをルックアップテーブルとして活用し、GPSデータを精緻化する](https://www.altova.com/blog/2012/06/web-service-as-look-up-table-to-refine.html)」で紹介したMapForceのマッピング機能を使って、文字通り数十個の.gpxファイルを処理しました。これらのファイルは、それぞれ数百個の座標データを含んでいました。しかし、ある日、新しいファイルを処理した際に、以下のエラーが発生し、マッピングが失敗しました

![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")

（文章が途中で終わっているため、文脈が不明確ですが、最も可能性の高い解釈に基づいて翻訳します。） [Altova MissionKit](https://www.altova.com/ja/missionkit.html) ～の機能を組み合わせる [MapForce](https://www.altova.com/ja/mapforce.html) そして [XMLSpy](https://www.altova.com/ja/xmlspy.html), 私たちは迅速に問題点を特定し、解決策を開発しました。この解決策は、将来の地図作成プロジェクトでも再利用できます。

<!--more-->

まず、入力データに問題があるのではないかと疑い、そのファイルをXMLSpyで開いて確認したところ、XMLの構文が正しく記述されていることがわかりました [XMLの検証](https://www.altova.com/ja/xmlspy/xml-validator.html) テスト中に問題が発生しましたが、幸いなことに、各データポイントには固有のタイムスタンプが付与されているため、最後に正常に処理されたGPS座標に対応する23:06:22というタイムスタンプを検索しました。そのタイムスタンプは、入力ファイルの1772行目に1回現れました。

直後に続くデータを確認しましたが、明らかに誤っている箇所は見当たりませんでした。そこで、次のデータポイントを一時的にコメントアウトし、ファイルを保存して、マッピング処理を再実行しました

![XMLファイルの特定の部分をコメントアウトする](https://lh3.ggpht.com/-UeqIOKWBDp8/UO2I0JP9HII/AAAAAAAAA6s/3GC5RMqRXAA/clip_image002%25255B3%25255D.png?imgmax=800 "Commenting out a portion of an XML file")

今回、マッピングは正常に完了しました

![Altova MapForce のメッセージウィンドウ](https://lh5.ggpht.com/-K0ySupBx4ZM/UO2I1KQnttI/AAAAAAAAA60/BpfcM6B9RY0/clip_image003%25255B3%25255D.png?imgmax=800 "Altova MapForce Messages window")

今、私たちはウェブサービスから返されるデータに疑念を抱いていました。アメリカ地質調査所の国立地理空間プログラムがこのウェブサービスを運営しているにもかかわらず、もしかすると、その基盤となっているデータベースに誤ったデータが含まれているのかもしれません。

私たちは、代替の出力としてシンプルな.csvファイルをマッピングに追加し、各ソース座標セットの標高結果をマッピングすることで、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")

出力ファイル "diagnostic.csv" のある行に、以前のエラーメッセージに表示されていたのと同じ値が含まれていました

![ウェブサービスからの出力例](https://lh3.ggpht.com/-_8RAIySmcXg/UO2I2ssrbNI/AAAAAAAAA7E/qtT4BbsKONo/clip_image005%25255B3%25255D.png?imgmax=800 "Sample output from the Web service")

これは科学表記です！ウェブサービスから返された数値が、[科学表記](http://en.wikipedia.org/wiki/Scientific_notation)で表示されています。当社のデータマッピング機能で、ウェブサービスの結果を処理する際の丸め精度機能は、小数点を含む数値を入力として必要とします。

**データ型の変換**

一つの方法として、Webサービスの処理結果を科学表記として認識し、数値値を明示的に計算する関数を作成することが考えられます。しかし、MapForceのエラーメッセージ「'-1.24202767892712E-06'への**10進数**への変換に失敗しました」は、より簡単な解決策が存在することを示唆しています。

今こそ、データ型について考える良い機会です。私たちのマッピングにおけるWebサービスコンポーネントは、テキスト文字列を返すことを明確に示しています。MapForceは、文字列を数値データとして数学的な式に接続する場合、自動的に文字列から10進数への型変換を行います。多くの場合、これにより、データが異なる形式間で移動する際に、開発者が明示的な型変換について考える必要がなくなります。今回のマッピングでは、MapForceは、科学表記のデータに遭遇するまで、文字列から10進数への型変換を178回正常に実行しました。

科学表記は、通常、小数点形式で便利に記録することが難しいほど大きい、または小さい数値に対して使用されます。MapForceにおいて、小数点型データ型は、数値の大きさや値を特定するものではありません。代わりに、XMLの小数点型、つまり小数点としてピリオドを使用する数字の文字列を識別します。

XMLやMapForceにおいて、double型データ型は科学表記をサポートしています。科学表記のデータをdouble型に明示的に変換し、その後、結果を丸めることができます。

このソリューションは、テキストファイルを入力と出力の両方に使用するシンプルなマッピングで簡単にテストできます。まず、丸め処理を行う関数に、単純な変数を挿入し、そのデータ型をdouble型に設定しました。最初のテストでは、USGSのWebサービスから取得したデータを入力として使用し、同じデータをWebサービスへのアクセスを冗長に行うことなく処理しました。このマッピングを使用することで、新しい入力データを用いたテストケースを容易に作成できます。

![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")

マッピング処理が正常に完了し、以下の結果が得られました

![修正されたデータマッピングからの出力例](https://lh4.ggpht.com/-4jeljPRsVcU/UO2I3iKQtZI/AAAAAAAAA7U/sH3Wn2YS05I/clip_image007%25255B3%25255D.png?imgmax=800 "Example output from the mdified data mapping")

**ユーザー関数を作成する**

[ユーザー機能](https://www.altova.com/ja/mapforce/visual-function-builder.html) MapForceでは、変換ルールは1つのマッピングファイルに定義され、関数ライブラリに追加することで、他のマッピングファイルでも利用できます。さらに、複数のユーザーが共有することも可能です。ユーザー定義関数は、複雑な処理をまとめることができ、大規模なマッピング設計全体のデータフローをより追跡しやすくするのに役立ちます。

私たちはすでに、経度に基づいてアメリカ大陸の東部または西部地域に対応するデータベースを選択することで、シンプルなWebサービス呼び出しを修正していました。しかし、結果に明示的なデータ型を指定すると、`getElevation`の呼び出しがさらに複雑になります。そこで、すべての処理をユーザー定義の関数にまとめることにしました。

![MapForceにおけるユーザー関数は、複雑な処理をまとめるために使用されます](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")

**ユーザー関数を適用する**

以下のコード例では、新しい `getElevationUS` 関数を組み込んでいます。

![MapForceのデータマッピング機能が、ユーザー関数によってさらに強化されました](https://lh5.ggpht.com/-1WM_YloAs9Q/UO2I5OcvIQI/AAAAAAAAA7k/0rKkFhfhmKY/clip_image009%25255B3%25255D.png?imgmax=800 "MapForce data mapping enhanced with a User Function") 

ここで、最初にウェブサービスから返される標高値を四捨五入した理由を改めて確認しておきましょう。ウェブサービスはメートル単位で値を返し、小数点以下2桁、つまり1センチメートルは、半インチよりも小さい値です。

「getElevationUS」関数の中に、四捨五入の処理を含めることも可能でしたが、将来的なデータ処理において、この関数がより汎用的に使えるようにするため、生データである標高値をそのまま返すようにしました。

以下に、修正されたマッピングの結果を示します。これは、最初に問題を引き起こした.gpxファイルと同じ入力ファイルを使用しています。出力ファイル内で、エラーが発生する前に最後に正常に記録された座標を見つけるために使用したタイムスタンプである23:06:22を検索しました。902行目から始まる以下のポイントが、エラーの原因となったものです。

![MapForceのデータマッピングにおけるサンプルデータ](https://lh5.ggpht.com/-k6NYBvSghlA/UO2I52w8KQI/AAAAAAAAA7s/0-s7KfpJdpE/clip_image010%25255B3%25255D.png?imgmax=800 "Sample data from a MapForce data mapping")

当初、私達はこれほどの努力が、結局は0に収束するわずかな高度差にしかならないことに落胆しました。その後、疑わしい座標をGoogleマップ上に表示してみたところ：

![緯度と経度を使って地点を特定する](https://lh6.ggpht.com/-0v5cW6dbhms/UO2I6ssKn6I/AAAAAAAAA7w/6Kq-1XDWz5Q/clip_image011%25255B3%25255D.png?imgmax=800 "Locating a point by latitude and longitude")

ルートの一部は、干潟にかかる橋を渡る区間でした。今後、データマッピングで`getElevationUS`関数を再利用しないとしても、他の旅行の.gpxファイルには、他の干潟を渡る区間が含まれている可能性があり、それらの区間でさらに微小な標高値が生成されるかもしれません。

**もし、このツールをご利用になりたい場合は、以下の手順をお試しください** [**Altova MissionKit**](https://www.altova.com/ja/missionkit/software-development-tools.html) **独自のデータマッピングを行うための、ユーザーが定義できる関数を作成できます** [**こちらをクリックして、無料トライアル版をダウンロードしてください。**](https://www.altova.com/ja/download-trial/)**.**
