2011年3月5日土曜日

GPSロガー2

今回は前回の続き。

前に言ってた通り、kmlのフォーマットをはじめに。
kmlはどうやらGooglemapやGoogleEarthの形式らしくて位置情報を持っています。

ベースはたぶんXML(自分は書けませんが…)です。
XMLベースなので(ということにしておいて)、テキストエディタで開けます。

前回書いた、
「一度DLしたファイルをブラウザで開いてそのリンクからもう一度DLする方法」

で落としてきたファイルをWin標準のメモ帳で開いてみると…。


<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
  <name>無題</name>
  <description><![CDATA[test]]></description>
  <Style id="style1">
    <LineStyle>
      <color>73FF0000</color>
      <width>5</width>
    </LineStyle>
  </Style>
  <Placemark>
    <name>line</name>
    <Snippet></Snippet>
    <description><![CDATA[]]></description>
    <styleUrl>#style1</styleUrl>
    <ExtendedData>
      <Data name="_SnapToRoads">
        <value>true</value>
      </Data>
      <Data name="_SnapToRoads">
        <value>true</value>
      </Data>
    </ExtendedData>
    <LineString>
      <tessellate>1</tessellate>
      <coordinates>
        135.314151,35.215426,0.000000 135.235266,35.367473,0.000000
      </coordinates>
    </LineString>
  </Placemark>
</Document>
</kml>


<Data name ="_SnapToRoads">
 <value>true</value>
</Data>


が二つほど入っているのが気にかかるところではありますが、
ちゃんと動くのでスルーという方向で。


ここでヒントを出しますと、これはGooglemapで表示させると1本の直線です。
お察しの通り

<coordinates>
135.314151,35.215426,0.000000 135.235266,35.367473,0.000000
</coordinates>

がその直線部分になります。
たしか京都付近だったかなー?

その付近なので、座標は日本の[135,35]付近になりますね。
これは東経135度、北緯35度ということです。

今のところ北半球東半分(というか日本)でしか使う予定がないので、
南半球西半分では数値がどのような値になるかは解りません。
(たぶんマイナス表記になると思うんだけどなぁ。)


まだハード(GPS本体)を入手していないので、
先にNMEAデータからKMLデータに変換するプログラムを書いていきます。
扱うのは単にテキストファイルで、ネットに接続する予定でもないので
普通に知っているC言語でやっていきたいと思います。


機械の人間でフローチャート書くのに慣れていないので、脳内構想です。

テキストファイル(読み出しと書き出し2つ)を開く

KML形式のフォーマット(ここでいう<coordinates>以外の部分)を書き出す。
(ここはたぶん不変なので)

読み出しファイルから$GPGGAの行を探す

その行の位置データだけを取得して書き出したファイルに追加する

終わり


すごく簡単に書くとこんな感じです。
KMLフォーマット抜きにするとこんな感じになりました。


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main (void){
FILE *fr,*fw;
errno_t error;

if((error = fopen_s(&fr,"gpsdata.txt","r")) != 0){
printf("gpsdata File Open Error!");
return -1;
}
if((error = fopen_s(&fw,"mapdata.kml","w")) != 0){
printf("mapdata File Open Error!");
return -1;
}

int count;
double num;
char c[100];
char endflag[10] ="";
char *token,*nexttoken;

while(1){
count =0;
fscanf_s(fr,"%s",c,100);//fscanfのセキュリティ版
token = strtok_s(c,",",&nexttoken);//文字列を指定した文字で区切る(string.h)

/*終了フラグ*/
if(strcmp(token,endflag) == 0){
break;//2回連続で同じ行を読み込んだら終了する
/*最後の行までいくと最後の行を連続で読み続ける*/
}
strcpy_s(endflag,10,token);

/*変換*/
if(strcmp(token,"$GPGGA") == 0){
while(token != NULL){
if (count == 2 || count == 4){//GPGGA行の2と4要素だけが必要なので
num = atof(token);//文字列をdoubleに(stdlib.h)
num = num/100;//googleの位置フォーマットに合わせる
fprintf(fw,"%f ",num);
}
token = strtok_s(NULL,",",&nexttoken);//2度目以降はNULL文字
count++;
}
}
}
fclose(fr);
fclose(fw);
}


これであとは先頭行に適当に書きつければOK(だと思う)。
重大なミスを発見したので次回、修正します。
googlemapが経度,緯度なのに対してNMEAが緯度,経度だったのが問題。
誰かNMEAのサンプルデータをくれるとすごくうれしいんだけど
なかなか持ってる人っていないよねー。


早く完成させて車載したいなぁ。
じゃあ終わり。

0 件のコメント:

コメントを投稿