【EC200U】GPS定位应用案例

EC200U 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定位探头,带字部分朝下放到室外!
在这里插入图片描述
不按说明放,可能就↓

在这里插入图片描述

执行后,等待中
在这里插入图片描述

执行成功,过滤数据
在这里插入图片描述
执行成功返回经纬度~
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45020839/article/details/128188468