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

news2024/12/28 14:57:16

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

完整功能视频演示地址:本科最后的课设:“车载系统的辅助系统——基于机器视觉的行人和路面缺陷检测”完结撒花*罒▽罒*_哔哩哔哩_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 = line
    if 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:])/60
        print("纬度:  " + 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",//请求方式为get
		dataType: "json", //返回数据格式为json
		async: false,
		success: function(data) {
            position_list=$.parseJSON(JSON.stringify(data));  // 将string转换成可操作的object
			console.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.coloradmin.cn/o/817067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VS下开发Qt应用环境搭建

VS下开发Qt应用环境搭建 版本说明环境搭建步骤QT新增组件重新安装QTVS中的配置 版本说明 vs2019 QT5.14 我之前是按照QT基础组件的安装&#xff0c;但是这个安装只是最基础的组件&#xff0c;如果想要在VS中使用QT&#xff0c;还得安装其他组件&#xff0c;下面的安装流程、 …

轻松解决宝塔面板设置了授权IP访问,但是IP变动导致访问不了面板

为了宝塔面板的安全与隐蔽性&#xff0c;我们很多站长会设置授权IP&#xff0c;授权IP的作用是&#xff1a;设置访问授权IP,多个请使用逗号(,)隔开;注意&#xff1a;一旦设置授权IP,只有指定IP的电脑能访问面板! 但是很多站长不是通过专用的虚拟通道访问&#xff0c;用的都是宽…

【Python系列】Python基础语法轻松入门—从变量到循环

目录 写在前面 语法介绍 变量 数据类型 整数 浮点数 字符串 列表 元组 字典 运算符 算术运算符 比较运算符 逻辑运算符 条件语句 循环语句 图书推荐 图书介绍 参与方式 中奖名单 写在前面 Python 是一种高级、解释型的编程语言&#xff0c;具有简单易学…

恒心工程PMO运作实践︱恒丰银行苏州分行行长(拟)姜兆华

恒丰银行股份有限公司苏州分行党委书记、行长&#xff08;拟&#xff09;&#xff0c;原总行金融科技部副总经理、恒心工程PMO办公室主任姜兆华先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;恒心工程PMO运作实践——以商业银行核…

京东的成功秘诀:找到自己独特而有效的商业模式

你知道京东为什么能够从一个卖电器的小网站发展成为中国最大的电商平台吗&#xff1f;如果京东一开始靠卖电器赚钱&#xff0c;不可能有今天&#xff0c;在十几年刘强东刚创业的时候&#xff0c;如果京东靠卖电器赚钱&#xff0c;你知道想当年的国美黄光裕和想当年的苏宁的张近…

磁盘均衡器:HDFS Disk Balancer

HDFS Disk Balancer 背景产生的问题以及解决方法 hdfs disk balancer简介HDFS Disk Balancer功能数据传播报告 HDFS Disk Balancer开启相关命令 背景 相比较于个人PC&#xff0c;服务器一般可以通过挂载多块磁盘来扩大单机的存储能力在Hadoop HDFS中&#xff0c;DataNode负责最…

F5 LTM 知识点和实验 7-使用SNATs处理流量

第七章:使用SNATs处理流量 SNATs: 传统的vs都是对目的地址和端口进行改变,而源地址没有改变,如果你需要对源地址和源端口进行更改,则需要使用SNAT能力,好处在于: 1、允许不可路由地址(网络内部)的设备获得可路由地址以进入网络外部。2、确保目标服务器通过BIG-IP系统返…

[Docker实现测试部署CI/CD----相关服务器的安装配置(1)]

目录 0、CI/CD系统最终架构图规划IP地址 1、git配置Git下载pycharm配置gitidea配置git 2、GitLab安装与配置主机要求拉取镜像定义 compose.yml启动gitlab浏览器访问并修改密码查看登录密码修改密码 3、SonarQube 安装与配置拉取镜像修改虚拟内存的大小启动SonarQube登录 SonarQ…

5.2.16.静态映射操作LED3

5.2.16.静态映射操作LED3 5.2.16.1、添加驱动中的写函数 (1)先定义好应用和驱动之间的控制接口&#xff0c;这个是由自己来定义的。譬如定义为&#xff1a;应用向驱动写"on"则驱动让LED亮&#xff0c;应用向驱动写"off"&#xff0c;驱动就让LED灭 1. 驱动文…

自定义Controller接口参数的值不能为空的校验

需求&#xff1a;在进入到相应Controller控制器前&#xff0c;需要先校验参数是否符合规范要求&#xff0c;如是否为空等等。 有人说&#xff0c;可以使用PathVariable里面的required属性控制&#xff0c;然而该属性只是代表参数是否必填&#xff0c;并不能校验参数的值是否满…

python_在K线找出波段_01_找出所有转折点

目录 写在前面&#xff1a; 需要考虑的几种K线图情况&#xff1a; 寻找所有转折点逻辑&#xff1a; 代码&#xff1a; 寻找转折点方法&#xff1a;找到第一个转折点就返回 循环寻找峰谷方法 主方法 调用计算&#xff1a; 返回&#xff1a; 在【PyQt5开发验证K线视觉想…

C++继承特性(1)——含义与继承方式的讲解

目录 1.继承的含义 2.继承的定义&#xff1a; 3.继承方式 例子1&#xff1a;基类的访问限定符为public&#xff0c;两个派生类的继承方式分别为public、protected时&#xff1a; 例子2&#xff1a; 基类的访问限定符为protected&#xff0c;两个派生类的继承方式分别为pub…

软件测试工程师的职业规划,你都做好了吗?

第一阶段&#xff1a;初级测试工程师 一般刚刚入门&#xff0c;熟悉基本的测试流程&#xff0c;此时已打基础为主。入门薪资一般在6000-8000元之间。 具体工作是&#xff1a; &#xff08;1&#xff09; 按照测试方案和流程对产品进行功能测试&#xff0c;检查产品是否有缺陷…

Java读取及生成pb文件并转换jsonString

Java读取及生成pb文件并转换jsonString 1. 效果图2. 原理2.1 Protocol Buffers是什么2.2 支持的语言2.3 根据.proto生成.java2.4 初始化及构建pb&#xff0c;读取&#xff0c;转jsonString 3. 源码3.1 address.proto3.2 PbParseUtil.java 参考 读取pb及生成pb文件pb文件转换jso…

vue-cli4升级到vue-cli5的踩坑记录

前言 最近对部分项目升级了vue-cli脚手架&#xff0c;记录一下 问题一&#xff1a; scss/less/css中无法引入public下的静态资源 问题描述 在样式文件中使用静态资源路径导致编译无法通过 错误信息如下&#xff1a; Module not found: Error: Cant resolve /img/login/lo…

框架的知识点整理

目录 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; 2 、 使用Spring框架有什么好处&#xff1f; 3、Spring MVC 工作原理 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; Spring框架是一个开源的轻量级的Java应用程序开…

MySQL主从复制及读写分离(三十四)

目录 MySQL主从复制 一、概述 1、MySQL Replication优点&#xff1a; 二、MySQL复制类型 1、异步复制&#xff08;Asynchronous repication&#xff09; 2、全同步复制&#xff08;Fully synchronous replication&#xff09; 3、半同步复制&#xff08;Semisynchronous…

【构造】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)…

1999-2021年30省平均受教育年限(含原始数据和具体计算过程)

1999-2021年30省平均受教育年限&#xff08;含原始数据和具体计算过程&#xff09; 1、时间&#xff1a;1999-2021年 2、范围&#xff1a;30省&#xff08;剔除西藏&#xff09; 3、计算方式&#xff1a;平均受教育年限&#xff08;未上学人数*0小学人数*6初中人数*9高中人数…

2023年7月第4周大模型荟萃

2023年7月第4周大模型荟萃 2023.7.31版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、Cerebras推出全球最强AI超算 AI芯片初创公司Cerebras Systems和总部位于阿联酋的技术控股集团G42于7月20日宣布&#xff0c;携手打造一个由互联的超…