随笔- 214  评论- 12  文章- 0 

GPS数据转换为OneNet需要的数据

GPS的数据格式是DDMM.MMMMMM

获取到的GPS帧数据比如是:$GNRMC,112317.000,A,3438.1633,N,11224.4992,E,0.19,186.95,240916,,,A*7D
说明
经度112°24.4992′
纬度34°38.1633′

OneNet支持的GPS数据经测试是DD.DDDDD,因此需要转换

经度为 112+24.4992/60 = 112.40832
纬度为 34+38.1633/60 = 34.636055

上传到GPS的数据流为

{"datastreams":[{"id":"location","datapoints":[{"value":{"lon":112.40832,"lat":34.636055}}]}]}

OneNet的GPS坐标是经过百度地图纠偏过的,所以这部分转换交给平台,直接上传上面的数据即可

用Arduino测试下转换计算过程:

char lon_str[] = "11224.4992";
char lat_str[] = "3438.1633";


double longitudeToOnenetFormat()
{
  double lon_temp = 0;
  long lon_Onenet = 0;
  int dd_int = 0;
  long mm_int = 0;
  double lon_Onenet_double = 0;

  lon_temp = atof(lon_str);
  lon_Onenet =lon_temp*100000;  //转换为整数

  dd_int = lon_Onenet/10000000; //取出dd

  mm_int = lon_Onenet%10000000;  //取出MM部分


  lon_Onenet_double = dd_int + (double)mm_int/60/100000;//换算为Onenet格式
  return  lon_Onenet_double;
}

double latitudeToOnenetFormat()
{
  double lat_temp = 0;
  long lat_Onenet = 0;
  int dd_int = 0;
  long mm_int = 0;

  double lat_Onenet_double = 0;

  lat_temp = atof(lat_str);
  lat_Onenet =lat_temp*100000;  //转换为整数

  dd_int = lat_Onenet/10000000; //取出dd

  mm_int = lat_Onenet%10000000;  //取出MM部分

  lat_Onenet_double = dd_int + (double)mm_int/60/100000;//换算为Onenet格式
  return  lat_Onenet_double;
}

void setup() {
  // put your setup code here, to run once:

  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  Serial.println(longitudeToOnenetFormat(),5);
  Serial.println(latitudeToOnenetFormat(),5);
}

void loop(){

}

串口计算后输出内容

用到double类型,略微有偏差,这个偏差经过计算大概在地图上能差别1米内

112.40832
34.63605
posted on 2016-09-24 20:46  神秘藏宝室  阅读(2595)  评论(0编辑  收藏

 >>>转载请注明出处<<<