前に言ってた通り、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>
<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>
<value>true</value>
</Data>
が二つほど入っているのが気にかかるところではありますが、
ちゃんと動くのでスルーという方向で。
ここでヒントを出しますと、これはGooglemapで表示させると1本の直線です。
お察しの通り
<coordinates>
135.314151,35.215426,0.000000 135.235266,35.367473,0.000000
</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形式のフォーマット(ここでいう<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);
}
#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);
}
重大なミスを発見したので次回、修正します。
googlemapが経度,緯度なのに対してNMEAが緯度,経度だったのが問題。
誰かNMEAのサンプルデータをくれるとすごくうれしいんだけどgooglemapが経度,緯度なのに対してNMEAが緯度,経度だったのが問題。
なかなか持ってる人っていないよねー。
早く完成させて車載したいなぁ。
じゃあ終わり。
0 件のコメント:
コメントを投稿