概述
EC200U GPS定位应用案例
- GPS定位案例代码
- 使用方法
之前写了测试了一下GPS功能,今天在群里弄到了全代码~。
GPS定位案例代码
功能包括:GPS定位,经纬度转换,WGS84转GCJ02(火星坐标系),火星坐标系(GCJ-02)转百度坐标系(BD-09)等功能。
import quecgnss
import utime
import ure
import math
fixFlag = 0
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626 # π
a = 6378245.0 # 长半轴
ee = 0.00669342162296594323 # 扁率
num=0
class Gnssdata:
def main(self):
global num
try:
if ret == 0:
print('GNSS init ok.')
else:
print('GNSS init failed.')
return -1
print(quecgnss.get_state())
data = quecgnss.read(4096)
gnss_data = data[1].decode()
# 正则对获取到的定位数据进行截取
self.r = ure.search("GNGGA(.+?)M", gnss_data)
self.r1 = ure.search("GNRMC(.+?)M", gnss_data)
self.r2 = ure.search("GPGSV(.+?)M", gnss_data)
self.r3 = ure.search("GNVTG(.+?)M", gnss_data)
global fixFlag
if self.r1:
if self.r1.group(0).split(",")[2] == 'A': # 有效定位
if num < 10:
print('==============已获取到有效定位,正在过滤10次=================')
print('第%d次过滤!'%num)
num += 1
else:
fixFlag = 1
print('############开始输出有效定位!#############')
else:
fixFlag = 0
except:
print("Exception:read gnss data error!!!!!!!!")
raise
# 获取GPS模块是否定位成功
def isFix(self):
global fixFlag
return fixFlag
# 获取GPS模块定位的经纬度信息
def getLocation(self):
if self.isFix() is 1:
lat = float(self.r.group(0).split(",")[2])
# // 100 + float(float(float(self.r.group(0).split(",")[2]) % 100) / 60) #
lat_d = self.r.group(0).split(",")[3] #
log = float(self.r.group(0).split(",")[4])
# // 100 + float(float(float(self.r.group(0).split(",")[4]) % 100) / 60) #
log_d = self.r.group(0).split(",")[5] #
return lat, lat_d, log, log_d
else:
return None
# 获取GPS模块授时的UTC时间
def getUtcTime(self):
return self.r.group(0).split(",")[1]
# 获取GPS模块定位模式
def getLocationMode(self):
if self.r.group(0).split(",")[6] is '0':
# print('定位不可用或者无效')
return 0
if self.r.group(0).split(",")[6] is '1':
# print('定位有效,定位模式:GPS、SPS 模式')
return 1
if self.r.group(0).split(",")[6] is '2':
# print('定位有效,定位模式: DGPS、DSPS 模式')
return 2
# 获取GPS模块定位使用卫星数量
def getUsedSateCnt(self):
return self.r.group(0).split(",")[7]
# 获取GPS模块定位可见卫星数量
def getViewedSateCnt(self):
return self.r2.group(0).split(",")[3]
# 获取GPS模块定位方位角 范围:0~359。以真北为参考平面。
def getCourse(self):
return self.r2.group(0).split(",")[6]
# 获取GPS模块对地速度(单位:KM/h)
def getSpeed(self):
if self.r1.group(0).split(",")[7] == '':
return None
else:
return float(self.r1.group(0).split(",")[7]) * 1.852
# 获取GPS模块定位大地高(单位:米)
def getGeodeticHeight(self):
return self.r.group(0).split(",")[9]
# 纬度转换
def _transformlat(self, lng, lat):
ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat +
0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))
ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
math.sin(2.0 * lng * pi)) * 2.0 / 3.0
ret += (20.0 * math.sin(lat * pi) + 40.0 *
math.sin(lat / 3.0 * pi)) * 2.0 / 3.0
ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 *
math.sin(lat * pi / 30.0)) * 2.0 / 3.0
return ret
# 经度转换
def _transformlng(self, lng, lat):
ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng +
0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
math.sin(2.0 * lng * pi)) * 2.0 / 3.0
ret += (20.0 * math.sin(lng * pi) + 40.0 *
math.sin(lng / 3.0 * pi)) * 2.0 / 3.0
ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 *
math.sin(lng / 30.0 * pi)) * 2.0 / 3.0
return ret
def wgs84_to_gcj02(self, lng, lat):
"""
WGS84转GCJ02(火星坐标系)
:param lng:WGS84坐标系的经度
:param lat:WGS84坐标系的纬度
:return:
"""
dlat = gnss._transformlat(lng - 105.0, lat - 35.0)
dlng = gnss._transformlng(lng - 105.0, lat - 35.0)
radlat = lat / 180.0 * pi
magic = math.sin(radlat)
magic = 1 - ee * magic * magic
sqrtmagic = math.sqrt(magic)
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
mglat = lat + dlat
mglng = lng + dlng
return [mglng, mglat]
def gcj02_to_bd09(self, lng, lat):
"""
火星坐标系(GCJ-02)转百度坐标系(BD-09)
谷歌、高德——>百度
:param lng:火星坐标经度
:param lat:火星坐标纬度
:return:
"""
z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_pi)
theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_pi)
bd_lng = z * math.cos(theta) + 0.0065
bd_lat = z * math.sin(theta) + 0.006
return [bd_lng, bd_lat]
def ddmmtodd(self, lng, lat):
lng = str(lng / 100)
lng = lng.split(".")[0] + "." + str(int((lng.split("."))[1]) / 100 * 100 / 60).replace(".", "")[:9]
lat = str(lat / 100)
lat = lat.split(".")[0] + "." + str(int((lat.split("."))[1]) / 100 * 100 / 60).replace(".", "")[:9]
return [float(lng), float(lat)]
if __name__ == '__main__':
gnss = Gnssdata()
ret = quecgnss.init()
while True:
gnss.main()
print('获取GPS模块是否定位成功:{}(0表示失败,1表示成功)'.format(gnss.isFix()))
if gnss.isFix() == 1:
wgs_data = gnss.getLocation()
print('获取GPS原始坐标(WGS-84)(ddmm.mmmm格式)的经度为:{},纬度信息:{}'.format(wgs_data[2], wgs_data[0]))
ddmm_to_dd = gnss.ddmmtodd(wgs_data[2], wgs_data[0])
dd_to_gcj02= gnss.wgs84_to_gcj02(ddmm_to_dd[0], ddmm_to_dd[1])
gcj02_to_bd09 = gnss.gcj02_to_bd09(dd_to_gcj02[0], dd_to_gcj02[1])
print('火星坐标系(高德地图)坐标为:n经度:{}n纬度:{}'.format(dd_to_gcj02[0],dd_to_gcj02[1]))
print('最终百度地图的坐标为:n经度:{}n纬度:{}'.format(gcj02_to_bd09[0], gcj02_to_bd09[1]))
print('获取GPS模块定位可见卫星数量:{}'.format(gnss.getViewedSateCnt()))
print('获取GPS模块定位方位角范围在0和359之间,以真北为参考平面:{}'.format(gnss.getCourse()))
print('获取GPS模块定位大地高:{}米'.format(gnss.getGeodeticHeight()))
print('获取GPS模块对地速度:{}KM/h'.format(gnss.getSpeed()))
utime.sleep(3)
使用方法
基础用法自行查看:EC200U GPS定位
将GPS天线模块接到开发板的GNSS上
GPS定位探头,带字部分朝下放到室外!
不按说明放,可能就↓
执行后,等待中
执行成功,过滤数据
执行成功返回经纬度~
最后
以上就是糊涂大地为你收集整理的【EC200U】GPS定位应用案例GPS定位案例代码使用方法的全部内容,希望文章能够帮你解决【EC200U】GPS定位应用案例GPS定位案例代码使用方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复