搜索
bottom↓
回复: 31

开源:根据GPS坐标生成Html文件直接显示轨迹的代码

  [复制链接]

出0入147汤圆

发表于 2012-9-18 14:33:13 | 显示全部楼层 |阅读模式
本帖最后由 dreampet 于 2012-9-18 14:32 编辑

文件系统用的是Fatfs,存储介质为SD卡,以下代码跟硬件无关,可直接使用
生成的Html文件效果如下所示


代码实现是根据Google Map提供的API实现,我建立了一个最简模板,如下所示,在这个模板中,我们只需要修改、填充这一部分即可 new google.maps.LatLng(xx.xxxxxx,xxx.xxxxxx);
  1. <html>
  2. <head runat="server">
  3. <title>TraceLog</title>
  4. <meta name="viewport"content="initial-scale=1.0,user-scalable=no"/>
  5. <script type="text/javascript"src="http://maps.google.com/maps/api/js?sensor=true"></script>
  6. <script type="text/javascript">
  7. function initialize()
  8. {
  9. var myLatlng = new google.maps.LatLng(xx.xxxxxx,xxx.xxxxxx);
  10. var mapOptions= {
  11. zoom:14,
  12. center:myLatlng,
  13. mapTypeId:google.maps.MapTypeId.ROADMAP
  14. };
  15. var map = new google.maps.Map(document.getElementById("map_canvas"),mapOptions);
  16. var trackPath = new google.maps.Polyline(
  17. {path:trackPoints,
  18. strokeColor:"#FF0000",
  19. strokeOpacity:1.0,
  20. strokeWeight:2}
  21. );
  22. trackPath.setMap(map);
  23. }
  24. //坐标数组
  25. var trackPoints = [
  26. new google.maps.LatLng(xx.xxxxxx,xxx.xxxxxx),
  27. new google.maps.LatLng(xx.xxxxxx,xxx.xxxxxx)
  28. ];
  29. </script>
  30. </head>
  31. <body onload="initialize()">
  32. <form id="form1" runat="server">
  33. <div id="map_canvas" style="width: 800px; height: 600px; position: relative; "></div>
  34. </form>
  35. </body>
  36. </html>
复制代码
根据以上模板构建4个数组,如下所示
  1. static const int8_t LogTemplet0[]={"<html><head runat="server"><title>TraceLog</title><meta name="viewport"content="initial-scale=1.0,user-scalable=no"/><script type="text/javascript"src="http://maps.google.com/maps/api/js?sensor=true"></script><script type="text/javascript">"};
  2. static const int8_t LogTemplet1[]={"function initialize(){var myLatlng=new google.maps.LatLng(xx.xxxxxx,xxx.xxxxxx);var mapOptions={zoom:14,center:myLatlng,mapTypeId:google.maps.MapTypeId.ROADMAP};var map=new google.maps.Map(document.getElementById("map_canvas"),mapOptions);var trackPath=new google.maps.Polyline({path:trackPoints,strokeColor:"#FF0000",strokeOpacity:1.0,strokeWeight:2});trackPath.setMap(map);}"};
  3. static const int8_t LogTemplet2[]={"var trackPoints = ["};
  4. static const int8_t LogTemplet3[]={"];</script></head><body onload="initialize()"><form id="form1" runat="server"><div id="map_canvas" style="width: 800px; height: 600px; position: relative;"></div></form></body></html>"};
复制代码
初始化函数如下所示,这个函数在SD卡初始化成功后 会尝试建立一个名称为Trace_xxx.html的记录文件,xxx的取值范围是000至999,文件建立成功后 即按上面的格式建立html文件模块
  1. uint8_t DataLog_Init(void)
  2. {
  3.         FRESULT res;
  4.         int16_t i;
  5.         uint32_t Len;
  6.         int8_t TmpStr[16];
  7.         res = FR_NO_FILE;
  8.         DataLog_Status = 0;
  9.         CopyStr("Trace_",TmpStr,15);
  10.         if (SD_Init() != SD_Unknown)
  11.         {
  12.                 printf("\r\nSDCard Init Success\r\n");
  13.                 f_mount(0,&fs);
  14.                 for (i=0;i<999;i++)
  15.                 {
  16.                         Int32ToDecStr(i,&TmpStr[6],3);
  17.                         StrCat(TmpStr,".html");
  18.                         res = f_open(&logfile,TmpStr,FA_CREATE_NEW|FA_WRITE);
  19.                         if (res == FR_OK)
  20.                                 break;
  21.                 }
  22.         }
  23.        
  24.         if (res == FR_OK)
  25.         {
  26.                 res = f_write(&logfile,(int8_t*)LogTemplet0,sizeof(LogTemplet0)-1,&Len);
  27.                 res |= f_write(&logfile,(int8_t*)LogTemplet1,sizeof(LogTemplet1)-1,&Len);
  28.                 res |= f_write(&logfile,(int8_t*)LogTemplet2,sizeof(LogTemplet2)-1,&Len);
  29.                 res |= f_write(&logfile,"\r\n",2,&Len);
  30.                 res |= f_write(&logfile,(int8_t*)LogTemplet3,sizeof(LogTemplet3)-1,&Len);
  31.                 if (res == FR_OK)
  32.                 {
  33.                         printf("No. %d LogFile Created!\r\n",i);
  34.                         f_sync(&logfile);       
  35.                         DataLog_Status = 1;
  36.                         DataLog_NewLog = 1;
  37.                         return 1;
  38.                 }
  39.                 else
  40.                 {
  41.                         f_close(&logfile);
  42.                         f_mount(0,NULL);
  43.                         DataLog_Status = 0;
  44.                 }
  45.         }
  46.         return 0;
  47. }
复制代码
构建坐标数组元素的代码如下所示,这个函数将xx.xxxxxx,xxx.xxxxxx 格式的坐标转化成 new google.maps.LatLng(xx.xxxxxx,xxx.xxxxxx) 格式
  1. uint8_t DataLog_BuildRecord(int8_t *pLatLng)
  2. {
  3.         uint8_t        TmpStr[128];
  4.         sprintf(TmpStr,"new google.maps.LatLng(%s)",pLatLng);
  5.         return DataLog_WriteRecord(TmpStr);
  6. }
复制代码
将坐标元素插入到模板中的代码如下所示,当第一次插入元素时,需进行特殊处理,填充起点坐标,每次填充完毕后,调用f_sync将缓存同步至SD卡,确保数据记录完整
  1. uint8_t DataLog_WriteRecord(uint8_t *pRec)
  2. {
  3.         int16_t res,RecLen,Len;
  4.         if (!DataLog_Status)
  5.                 return 0;       
  6.         if (DataLog_NewLog == 1)
  7.         {
  8.                 f_lseek(&logfile,275);
  9.                 f_write(&logfile,pRec,44,(UINT*)&Len);
  10.                 f_lseek(&logfile,(&logfile)->fsize - sizeof(LogTemplet3) + 1);
  11.                 DataLog_NewLog = 0;
  12.         }
  13.         else
  14.         {
  15.                 f_lseek(&logfile,(&logfile)->fsize - sizeof(LogTemplet3) + 1);
  16.                 f_write(&logfile,",\r\n",3,(UINT*)&Len);
  17.         }
  18.         f_write(&logfile,pRec,44,(UINT*)&RecLen);
  19.         f_write(&logfile,(int8_t*)LogTemplet3,sizeof(LogTemplet3)-1,(UINT*)&Len);       

  20.         if (44 != RecLen)
  21.         {
  22.                 printf("\r\nLog Failure!\r\n");
  23.                 f_close(&logfile);
  24.                 DataLog_Status = 0;
  25.                 return 0;
  26.         }
  27.         else
  28.         {
  29.                 f_sync(&logfile);                                                                        //同步文件至SD卡
  30.                 printf("\r\nLog Success!\r\nLog Size:%d\r\n",f_size(&logfile));
  31.                 return 1;
  32.         }
  33. }
复制代码
生成的Html文件如下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-9-18 14:37:36 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2012-9-18 14:44:15 | 显示全部楼层
不错!
有没有应用实例啊?

出0入0汤圆

发表于 2012-9-18 14:44:31 | 显示全部楼层
Mark
果断的Mark

出0入0汤圆

发表于 2012-9-18 14:46:46 | 显示全部楼层
不错,学习

出0入147汤圆

 楼主| 发表于 2012-9-18 14:49:45 | 显示全部楼层
fsclub 发表于 2012-9-18 14:44
不错!
有没有应用实例啊?

这段代码是从手头上的项目里摘出来了
目前暂时没有时间专门针对这个功能做Demo

出0入0汤圆

发表于 2012-9-19 22:49:21 | 显示全部楼层
这个真不错。

出0入0汤圆

发表于 2012-9-19 23:11:28 | 显示全部楼层
mark  google map 根据地理坐标在地图上定位,good

出0入0汤圆

发表于 2012-9-20 08:05:28 | 显示全部楼层
非常强悍

出0入0汤圆

发表于 2012-9-20 09:01:09 | 显示全部楼层
哇哈哈  前两天还想看看google map API呢   最近做了直接生成KML文件的代码   这下省事啦                                                                     

出0入0汤圆

发表于 2012-9-20 09:07:36 | 显示全部楼层
mark一下,说不定以后有用

出0入0汤圆

发表于 2012-9-20 09:29:40 | 显示全部楼层
不错,进来学习啦

出0入4汤圆

发表于 2012-9-20 14:26:42 | 显示全部楼层
收藏备用

出0入0汤圆

发表于 2012-9-27 22:36:37 | 显示全部楼层
我真不明白html中的哪个函数能接受GPS定位数据而显示的,楼主能否说一说呢

出0入0汤圆

发表于 2012-9-27 22:43:37 | 显示全部楼层
GPS数据每次都要转换再送到html?html如何能动态捕捉第三方软件传来的GPS坐标并实时显示呢?也许我的这个想法是有错误的,诚请各位批评指正,我不懂网页

出0入0汤圆

发表于 2012-9-28 08:35:09 | 显示全部楼层
不知楼主用的模块遇到的火星坐标问题了没?如何解决的?我看的解决办法是买一个偏移数据库。。。一个数据库还不便宜...

出0入0汤圆

发表于 2012-10-2 22:55:42 | 显示全部楼层
果断马克,这个必须要学习

出0入0汤圆

发表于 2013-1-25 06:49:37 来自手机 | 显示全部楼层
mark  了!!!!!

出0入147汤圆

 楼主| 发表于 2013-2-17 13:08:28 | 显示全部楼层
yurinacn 发表于 2012-9-28 08:35
不知楼主用的模块遇到的火星坐标问题了没?如何解决的?我看的解决办法是买一个偏移数据库。。。一个数据库 ...

用数据库是精度要求比较高的办法,我的办法是在主要城市取点计算偏移值,然后修正。这样的话只要几百个点就够了。

出0入0汤圆

发表于 2013-2-17 13:21:16 | 显示全部楼层
很好  很强大!!!

出0入147汤圆

 楼主| 发表于 2015-1-13 14:22:10 | 显示全部楼层
yyt1372 发表于 2012-9-27 22:43
GPS数据每次都要转换再送到html?html如何能动态捕捉第三方软件传来的GPS坐标并实时显示呢?也许我的这个想 ...

这个实现的是轨迹记录,坐标存储在SD卡后,一次性画出整个轨迹,不是实时显示的。

出0入0汤圆

发表于 2015-1-16 10:52:08 | 显示全部楼层
使用LZ的程序,生成的HTML文件一直打不开啊,浏览器要怎么设置?

出0入0汤圆

发表于 2015-1-16 10:53:07 | 显示全部楼层
一直显示正在连接,就是出刷不出地图

出0入147汤圆

 楼主| 发表于 2015-1-23 21:56:42 | 显示全部楼层
大米饭 发表于 2015-1-16 10:53
一直显示正在连接,就是出刷不出地图

现在Google被屏蔽了,需要番墙才能用。

出0入147汤圆

 楼主| 发表于 2015-1-23 22:01:59 | 显示全部楼层
大米饭 发表于 2015-1-16 10:53
一直显示正在连接,就是出刷不出地图

或者把文件里面的maps.google.com替换成ditu.google.cn即可。

出0入0汤圆

发表于 2015-1-28 22:22:43 | 显示全部楼层
dreampet 发表于 2015-1-23 22:01
或者把文件里面的maps.google.com替换成ditu.google.cn即可。

又来请教楼主
使用楼主的代码可以成功建立HTML文件,轨迹绘制出来感觉再地图上显示不对,在深圳的轨迹地图上却显示是在珠海,差的好远
GPS读取出来的坐标要怎么处理?

出0入0汤圆

发表于 2015-1-29 00:28:54 | 显示全部楼层
好多东西,收藏

出0入0汤圆

发表于 2015-1-29 10:07:07 | 显示全部楼层
菜发现这个号东西

出0入147汤圆

 楼主| 发表于 2015-1-29 10:14:24 | 显示全部楼层
大米饭 发表于 2015-1-28 22:22
又来请教楼主
使用楼主的代码可以成功建立HTML文件,轨迹绘制出来感觉再地图上显示不对,在深圳的轨迹地 ...

GPS的NEMA协议中,经纬度格式是这种:
ddd.mm.mmm,度 . 分 . 分的十进制小数部分(3位)例如 31º10.335'
Google用的的这种:
ddd.ddddd, 度 . 度的十进制小数部分(5位)例如:31.12035º

虽然国内的地图跟GPS坐标有偏差,但一般也就500-1000米左右,你这个估计是转换时算错了。

出0入0汤圆

发表于 2015-1-29 20:44:48 | 显示全部楼层
不错,MARK

出0入24汤圆

发表于 2015-3-31 17:14:34 | 显示全部楼层
Mark!
z学习一下,多谢

出0入0汤圆

发表于 2015-3-31 17:23:55 | 显示全部楼层
这个真心不错,代码也是有模有样的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-3 20:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表