树莓派通过天线+gps获取经纬度并调用高德地图api在地图上标点

news/2024/5/15 4:43:25/文章来源:https://blog.csdn.net/Scut_Ty/article/details/132031687

完整项目为《基于机器视觉的行人和路面缺陷检测及其边缘设备部署

完整功能视频演示地址:本科最后的课设:“车载系统的辅助系统——基于机器视觉的行人和路面缺陷检测”完结撒花*罒▽罒*_哔哩哔哩_bilibili

该博客介绍的功能为:

1:树莓派通过gps+天线读取经纬度坐标(检测出路面缺陷的位置)

2:将经纬度坐标上传至服务器

3:调用高德地图api,读取服务器的经纬度,并在地图上标点。

该博客参考了以下博客和资料:

[1] (74条消息) 树莓派(四):GPS连接并读取_树莓派gps_哦吼吼231的博客-CSDN博客 

[2] (74条消息) NMEA经纬度换算_nmea坐标_牧童宇希的博客-CSDN博客

[3] (71条消息) 【高德地图API】Web地图开发系列(一)_生命是有光的的博客-CSDN博客

[4] (74条消息) 十三、JavaScript ajax请求_js ajax请求_HJHO的博客-CSDN博客

[5] (74条消息) HTML读取json文件(传递给变量)_璇焱如柳的博客-CSDN博客

[6] JS API 安全密钥使用-基础-进阶教程-地图 JS API 2.0 | 高德地图API

一、 树莓派通过gps+天线读取经纬度坐标

    我们将GPS 模块的串口输出用USB-TTL 进行了转换,因此我们直接在USB 口上读取GPS 模块传入的数据即可。

    还需要注意的是GPS 模块读取到的值并非经纬度,而是包含了经纬度信息的字符串。我们的GPS 读入的信息GNRMC_line 的格式为

        ["b'$GNRMC" , '当天UTC 时间','A表示数据有效','纬度','N- 北','精度',  'E- 东', '对地速度,单位为节', '对地真航向,单位为度', '日期(dd  为日,mm 为月,yy 为年)', '', '', "A*75\\r\\n'" ]

比如:

        [“b'$GNRMC”,'132558.000','A','3412.93903','N','11708.08969','E','0.00', '0.00', '081221', '', '', "A*75\\r\\n'" ]

    所以我们需要在数据流中找到以”b\’$GNRMC” 开头的数据,并且在该字符串数组的第五个元素和第七个元素。纬度前2 字符表示度,后面的字符表示分,需要转化为小数形式;经度前3 字符表示度,后面的字符表示分,需要转化为小数形式。

        具体代码如下:(完整功能可以复制的代码会附在整个模块讲解结束的地方,这里只是一部分)

        其中,我们打开串口,存放到ser 中,/dev/ttyUSB0 是端口名,9600 是波特率。while  True 表示一直不断检测,readline 为读取整行。我们读取以GNRMC 开头的字符串数组,然后以“,” 逗号作为分隔符把不同的数据分隔开,最后通过计算得到xxxx 分正确格式的经纬度,最后打印出来。

        如图为测试图片

图:GPS模块经纬度读取测试

二、 将经纬度坐标上传至服务器

        我们在自己的服务器上开了上传、读取和删除的接口。该部分用到上传接口。我们向接口发送了POST 请求,并将经纬度作为JSON 格式的数据发送到了该URL

    其中POST 请求是HTTP 中向服务器提交数据的请求方式。与GET 请求不同,POST 请求将数据作为请求体request body)发 送到服务器,而不是放在URL 的查询参数中。因此,POST 请求通常用于提交一些敏感数据或者比较大的数据,例如表单数据、文件上传等。

    具体代码如下:(requrl='http://124.221.239.172:8080/location'请更换为你自己开的服务器端口,该端口已经关闭不可使用)

        我们创建一个名为`rqs_headers` 的字典,这个字典将被用作请求的头部headers) 参数,告诉服务器发送的数据是JSON 格式的。Requrl 为服务器接口的URL地址。最后我们把经纬度通过json.dumps 命令转化为json 格式通过POST 指令发到服务器。如果服务器收到了,会返回响应结果,完成本次通信协议。

        第一第二节完整代码如下:

import serial
import time
import json
import requests
ser = serial.Serial("/dev/ttyUSB0",9600) #9600是GPS的波特率
while True:line = str(str(ser.readline()))# #打印所有串口数据# print(line)GNRMC_line = line# GNGLL_line = line# GNGLL_line = lineif GNRMC_line.startswith("b\'$GNRMC"):print(GNRMC_line)GNRMC_line = str(GNRMC_line).split(',')  # 将line以“,”为分隔符#GNRMC_line格式为:["b'$GNRMC", '132558.000',    'A',    '3412.93903',  'N',  '11708.08969',  'E',      '0.00',            '0.00',             '081221',                '', '', "A*75\\r\\n'"]#GNRMC_line格式为:["b'$GNRMC", '当天UTC时间', 'A表示数据有效', '纬度',    'N-北', '精度',        'E-东', '对地速度,单位为节', '对地真航向,单位为度', '日期(dd 为日,mm为月,yy为年)', '', '', "A*75\\r\\n'"]print(GNRMC_line)  #查看数据类型# 时间转化省略(需要把UTC转化为北京时间)# Lat ddmm.mmmm 纬度,前2字符表示度,后面的字符表示分,需要转化为小数形式latitude = float(GNRMC_line[3][:2]) + float(GNRMC_line[3][2:])/60# Lon dddmm.mmmm 经度,前3字符表示度,后面的字符表示分,需要转化为小数形式longitude = float(GNRMC_line[5][:3]) + float(GNRMC_line[5][3:])/60print("纬度:  " + GNRMC_line[4] + " " + str(latitude))print("经度:  " + GNRMC_line[6] + " " + str(longitude))# time.sleep(1)rqs_headers={'content-Type':'application/json'}requrl='请更换为你自己的服务器地址'new_data={"longitude":longitude,"latitude":latitude}test_data = json.dumps(new_data)response = requests.post(url=requrl,headers=rqs_headers,data=test_data)

 三、调用高德地图api,读取服务器的经纬度,并在地图上标点

        上面两节是要在树莓派自带的python编译器中运行的python代码。下面是用VScode写的html代码。

        代码如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script type="text/javascript" src="请改成你自己的高德api密钥"></script><style type="text/css">html {height: 100%}body {height: 100%;margin: 0px;padding: 0px}#container {height: 100%}.amap-icon img,.amap-marker-content img{width: 25px;height: 34px;}.marker {position: absolute;top: -20px;right: -118px;color: #fff;padding: 4px 10px;box-shadow: 1px 1px 1px rgba(10, 10, 10, .2);white-space: nowrap;font-size: 12px;font-family: "";background-color: #25A5F7;border-radius: 3px;}</style>
</head><body><div id="container"></div><script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>   <!--  导入jQuery包--><script type="text/javascript">var map = new AMap.Map('container', {zoom: 11, //级别center: [116.397428, 39.90923], //中心点坐标viewMode: '3D' //使用3D视图});$.ajax({url: "请换为你的服务器端口",//json文件位置,文件名type: "GET",//请求方式为getdataType: "json", //返回数据格式为jsonasync: false,success: function(data) {position_list=$.parseJSON(JSON.stringify(data));  // 将string转换成可操作的objectconsole.log(position_list[0])for (var i=0;i<position_list.length;i++){marker = new AMap.Marker({icon: "\poi-marker-default.png",position: [position_list[i].longitude,position_list[i].latitude],offset: new AMap.Pixel(-13, -30)});marker.setMap(map);}}});	
//请求成功完成后要执行的方法  </script>
</body>
</html>

        以上的代码可以把服务器的里的经纬度数据遍历一遍并且显示在地图画布上。效果如下:

        我们还给每个Marker 对象添加一个事件监听器,以便监听点击操作。在使用者点击marker 后能够用infowindow 对象的open 方法将信息窗口显示在地图上,并将其链接到marker 的位置上。 

         效果如下图:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_338014.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实例讲解:通过三个案例搞懂tcp的那些冷门知识

最近在做数据库相关的事情&#xff0c;碰到了很多TCP相关的问题&#xff0c;新的场景新的挑战&#xff0c;有很多之前并没有掌握透彻的点&#xff0c;大大开了一把眼界&#xff0c;选了几个案例分享一下。 案例一&#xff1a;TCP中并不是所有的RST都有效 背景知识 在TCP协议…

Selenium-用这个框架自动化任何你想做的事情!

Chrome DevTools 简介 Chrome DevTools 是一组直接内置在基于 Chromium 的浏览器&#xff08;如 Chrome、Opera 和 Microsoft Edge&#xff09;中的工具&#xff0c;用于帮助开发人员调试和研究网站。 借助 Chrome DevTools&#xff0c;开发人员可以更深入地访问网站&#xf…

JPEG有损图像压缩编码器(附源码)

概述 一个基本由自己实现的JPEG有损图像压缩编码器&#xff0c;基于JFIF&#xff08;JPEG文件交换格式&#xff09;标准&#xff1a; 色彩空间转换&#xff08;RGB to YUV&#xff09;色度抽样&#xff08;采样因子4:2:0&#xff09;MCU分块&#xff08;16x16的最小编码单元&…

开放麒麟1.0发布一个月后,到底怎么样?另一款操作系统引发热议

具有里程碑意义 7月5日&#xff0c;国产首个开源桌面操作系统“开放麒麟1.0”正式发布。 标志着我国拥有了操作系统组件自主选型、操作系统独立构建的能力&#xff0c;填补了我国在这一领域的空白。 举国欢庆&#xff0c;算的上是里程碑意义了&#xff01; 发布后用着如何&a…

【Python】PySpark 数据计算 ② ( RDD#flatMap 方法 | RDD#flatMap 语法 | 代码示例 )

文章目录 一、RDD#flatMap 方法1、RDD#flatMap 方法引入2、解除嵌套3、RDD#flatMap 语法说明 二、代码示例 - RDD#flatMap 方法 一、RDD#flatMap 方法 1、RDD#flatMap 方法引入 RDD#map 方法 可以 将 RDD 中的数据元素 逐个进行处理 , 处理的逻辑 需要用外部 通过 参数传入 map…

深入理解 SQL:从基本查询到高级聚合

目录 背景理论知识示例1211. 查询结果的质量和占比&#xff08;Round group by&#xff09;1204. 最后一个能进入巴士的人 &#xff08;Having limit order by&#xff09;1193. 每月交易 I&#xff08;if group by&#xff09;1179. 重新格式化部门表1174. 即时食物配送 II&am…

链表刷题常用技巧——快慢指针

强大&#xff0c;不动如山的强大&#xff0c;不会输给自己的真正的强大。 往期回顾&#xff1a; 数据结构——单链表 单链表力扣刷题 文章目录 经典例题&#xff1a;链表的中间结点 题目分析及双指针思路引入 双指针图解 leetcode 核心代码 判断环形链表——快慢指针…

基于SSM+JSP+LayUI的校园任务帮管理系统

校园帮项目 校园即时服务平台 用户角色 管理员 功能 登录、公告管理&#xff08;发布公告、停用公告&#xff09;、任务管理&#xff08;下架任务、删除任务&#xff09;、用户管理&#xff08;用户充值、限制用户&#xff09;、修改密码 用户角色 用户 功能 注册、登录…

【Linux进程篇】进程概念(1)

【Linux进程篇】进程概念&#xff08;1&#xff09; 目录 【Linux进程篇】进程概念&#xff08;1&#xff09;进程基本概念描述进程-PCBtask_struct-PCB的一种task_ struct内容分类 组织进程查看进程通过系统调用获取进程标示符通过系统调用创建进程——fork初识 作者&#xff…

Android 中 app freezer 原理详解(二):S 版本

基于版本&#xff1a;Android S 0. 前言 在之前的两篇博文《Android 中app内存回收优化(一)》和 《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过 CachedAppOptimizer 类管理&#xff0c;为什么叫这个名字&#xff0c;而不…

青大数据结构【2016】

一、单选 二、简答 3.简述遍历二叉树的含义及常见的方法。

大数据面试题:HBase的RegionServer宕机以后怎么恢复的?

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 可回答&#xff1a;1&#xff09;HBase一个节点宕机了怎么办&#xff1b;2&#xff09;HBase故障恢复 参考答案&#xff1a; 1、HBase常见故障 导…

【构造】CF1758 C

Problem - 1758C - Codeforces 题意&#xff1a; 思路&#xff1a; 思路&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn2e510; const int mxe2e510;int N,x; int ans[mxn];void solve(){cin>>N>>x;if(N%x!0)…

使用MyBatis(2)

目录 一、定义接口、实体类、创建XML文件实现接口&#xff09; 二、MyBatis的增删改查 &#x1f345;1、MyBatis传递参数查询 &#x1f388;写法一 &#x1f388;写法二 &#x1f388;两种方式的区别 &#x1f345;2、删除操作 &#x1f345;3、根据id修改用户名 &#x…

机器学习-Basic Concept

机器学习(Basic Concept) videopptblog Where does the error come from? 在前面我们讨论误差的时候&#xff0c;我们提到了Average Error On Testing Data是最重要的 A more complex model does not lead to better performance on test data Bias And Variance Bias(偏差) …

反转链表(JS)

反转链表 题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&…

三数之和——力扣15

文章目录 题目描述法一 双指针排序 题目描述 法一 双指针排序 class Solution{ public:vector<vector<int>> threeSum(vector<int>& nums){int nnums.size();vector<vector<int>> ans;sort(nums.begin(), nums.end());for(int first0;first&…

死锁产生的原因及解决方案

死锁 1. 死锁的成因2. 解决方案 1. 死锁的成因 互斥条件: 一个资源每次只能被一个进程使用。请求与保持条件&#xff1a;一个进程因请求资源而阻塞时&#xff0c;对已获得的资源保持不放。不可剥夺条件:进程已获得的资源&#xff0c;在末使用完之前&#xff0c;不能强行剥夺。…

PHP8的常量-PHP8知识详解

常量和变量是构成PHP程序的基础&#xff0c;在PHP8中常量的这一节中&#xff0c;主要讲到了定义常量和预定义常量两大知识点。 一、定义常量 定义常量也叫声明常量。在PHP8中&#xff0c;常量就是一个标识符&#xff08;名字&#xff09;&#xff0c;一旦定义&#xff08;声明&…

Vuepress配置Algolia搜索的方法以及避坑指南

今天是2023年高考的第一天&#xff0c;身为高一学生的我也报名去体验了一下&#xff0c;感觉山东今年的语文和数学题都不是很难&#xff08;至少比一模二模都简单&#xff09;&#xff08;当然我的成绩肯定是很糟糕&#xff09; 祝愿所有考生都能取得好成绩&#xff01; 这是什…