GPS的GPRMC转GBS84,GCJ02,BD09 且将数据标定在百度地图上面

(注意,转成BD09需要百度秘钥,百度地图申请秘钥教程:http://lbsyun.baidu.com/index.php?title=jspopular/guide/getkey)

一. 采集信号与实际道路对比(左侧实际道路,右侧gps采集数据道路)

                     

二. 采集信号GPRMC转成WGS84,再将WGS84转成BD09(百度地图标准)

1. 首先将GPRMC转成WGS84标准

def GPRMC_to_GBS84(gps):
    ''' 将GPRMC的度分转成度'''
    d = int(gps / 100)
    m = (gps - d * 100) / 60.0
    return d + m

2. 将WGS84转成BD09

class Geoconv(object):
    my_ak = '输入你自己的ak秘钥'
    my_sk = 'fFyAglwnmgxnYI6c---------------------------'

    def __init__(self):
        pass

    # GPS坐标转换为百度坐标
    #解释:http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
    #API:http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.575429778924&from=1&to=5&ak=你的密钥 //GET
    def wgs84tobd09(self,lon,lat):
        queryStr = '/geoconv/v1/?coords={},{}&from=1&to=5&ak={}'.format(lon, lat, self.my_ak)
        # print queryStr
        # 对queryStr进行转码,safe内的保留字符不转换
        encodedStr = request.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")

        # 在最后直接追加上yoursk
        rawStr = encodedStr + self.my_sk

        # md5计算出的sn值
        my_sn = hashlib.md5(quote_plus(rawStr).encode("utf-8")).hexdigest()
        # print my_sn
        url = 'http://api.map.baidu.com' + queryStr + "&sn=" + my_sn
        # print url

        res = requests.get(url)
        # print '*' * 10
        # get收到的内容
        json_str = res.content
        # print json_str
        dictData = json.loads(json_str)
        # print dictData["result"][0]["x"]
        # print dictData["result"][0]["y"]
        return dictData["result"][0]["x"], dictData["result"][0]["y"]


def GPRMC_str_to_BD09(gprmc_str, myconv):
    ''' 将gprmc的字符串转成BD09的信息'''
    lng_bd09, lat_bd09, _ = 0, 0, 1
    strs = gprmc_str.split(',')
    if len(strs) == 13 and strs[0] == '$GPRMC' and strs[2] == 'A':
        lng, lat = strs[5], strs[3]
        lng = GPRMC_to_GBS84(float(lng))
        lat = GPRMC_to_GBS84(float(lat))
        lng_bd09, lat_bd09 = myconv.wgs84tobd09(lng, lat)
    return lng_bd09, lat_bd09, _

三. 将BD09显示在百度地图上

1. 将前面生成的gps数据,按照百度api的格式保存成.js

    json_str = 'var data = {"data":%s, "total":%d,"rt_loc_cnt":47764510,"errorno":0,"NearestTime":"2014-08-29 15:20:00","userTime":"2014-08-29 15:32:11"}' % (str(results), len(results))
    with open(os.path.join(folder_path, 'points-sample-data.js'), 'w') as fw:
        fw.write(json_str)

2. 使用百度的html,申请自己的ak账号,更改js的本地存储位置,然后双击html,在浏览器中查看

<!DOCTYPE html>
<html>
<head>
  <title>加载海量点</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
  <style type="text/css">
    html,body{
        margin:0;
        width:100%;
        height:100%;
        background:#ffffff;
    }
    #map{
        width:100%;
        height:100%;
    }
    #panel {
        position: absolute;
        top:30px;
        left:10px;
        z-index: 999;
        color: #fff;
    }
    #login{
        position:absolute;
        width:300px;
        height:40px;
        left:50%;
        top:50%;
        margin:-40px 0 0 -150px;
    }
    #login input[type=password]{
        width:200px;
        height:30px;
        padding:3px;
        line-height:30px;
        border:1px solid #000;
    }
    #login input[type=submit]{
        width:80px;
        height:38px;
        display:inline-block;
        line-height:38px;
    }
  </style>
  <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=修改成你的AK秘钥"></script>
  <script type="text/javascript" src="修改成你的js地址./jsdemo/data/points-sample-data.js"></script>
</head>
<body>
    <div id="map"></div>
    <script type="text/javascript">
    var map = new BMap.Map("map", {});                        // 创建Map实例
    map.centerAndZoom(new BMap.Point(105.000, 38.000), 5);     // 初始化地图,设置中心点坐标和地图级别
    map.enableScrollWheelZoom();                        //启用滚轮放大缩小
    if (document.createElement('canvas').getContext) {  // 判断当前浏览器是否支持绘制海量点
        var points = [];  // 添加海量点数据
        for (var i = 0; i < data.data.length; i++) {
          points.push(new BMap.Point(data.data[i][0], data.data[i][1]));
        }
        var options = {
            size: BMAP_POINT_SIZE_SMALL,
            shape: BMAP_POINT_SHAPE_STAR,
            color: '#d340c3'
        }
        var pointCollection = new BMap.PointCollection(points, options);  // 初始化PointCollection
        pointCollection.addEventListener('click', function (e) {
          alert('单击点的坐标为:' + e.point.lng + ',' + e.point.lat);  // 监听点击事件
        });
        map.addOverlay(pointCollection);  // 添加Overlay
    } else {
        alert('请在chrome、safari、IE8+以上浏览器查看本示例');
    }
  </script>
</body>
</html>

 

文末附上几个辅助的网址:
1. 从地图上拾取某点的经纬度(BD09格式):http://api.map.baidu.com/lbsapi/getpoint/

2. 将BD09、WGS84、GCJ02经纬度互转:https://tool.lu/coordinate/

3. 百度api各种使用教程例程:http://lbsyun.baidu.com/jsdemo.htm#c1_19

4. 百度api使用手册:http://lbsyun.baidu.com/index.php?title=jspopular/guide/custom

 

最后,我把全部的文件传到csdn上了,想要的可以下载。没积分的老哥直接私聊我:pantaojiacheng@163.com
 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以定义一个结构体来存储解析出来的GPRMC数据,然后将解析出来的数据赋值给结构体的相应成员变量。下面是一个示例代码,可以将GPRMC数据解析成一个名为"GPRMCData"的结构体: ```c #include <stdio.h> #include <string.h> #define GPRMC_START_CHAR '$' // GPRMC数据的起始字符 #define GPRMC_END_CHAR '\r\n' // GPRMC数据的结束字符 typedef struct { char time[10]; // 时间 char status; // 定位状态 double latitude; // 纬度 double longitude; // 经度 double speed; // 速度 double direction; // 方向 } GPRMCData; int main() { char buffer[256]; char *token; GPRMCData gprmcData; while (1) { // 读取串口数据 fgets(buffer, sizeof(buffer), stdin); // 判断是否为GPRMC数据 if (buffer[0] == GPRMC_START_CHAR && strstr(buffer, "GPRMC") != NULL) { // 对数据进行逐个字符的解析 token = strtok(buffer, ","); if (token != NULL && strcmp(token, "$GPRMC") == 0) { // 解析时间 token = strtok(NULL, ","); if (token != NULL) { strcpy(gprmcData.time, token); } // 解析定位状态 token = strtok(NULL, ","); if (token != NULL && strcmp(token, "A") == 0) { gprmcData.status = 'A'; } else { gprmcData.status = 'V'; } // 解析纬度 token = strtok(NULL, ","); if (token != NULL) { double latitude = atof(token); double degree = (int)(latitude / 100); double minute = (latitude - degree * 100) / 60; gprmcData.latitude = degree + minute; } // 解析南北半球 token = strtok(NULL, ","); if (token != NULL) { if (strcmp(token, "S") == 0) { gprmcData.latitude = -gprmcData.latitude; } } // 解析经度 token = strtok(NULL, ","); if (token != NULL) { double longitude = atof(token); double degree = (int)(longitude / 100); double minute = (longitude - degree * 100) / 60; gprmcData.longitude = degree + minute; } // 解析东西半球 token = strtok(NULL, ","); if (token != NULL) { if (strcmp(token, "W") == 0) { gprmcData.longitude = -gprmcData.longitude; } } // 解析速度 token = strtok(NULL, ","); if (token != NULL) { gprmcData.speed = atof(token); } // 解析方向 token = strtok(NULL, ","); if (token != NULL) { gprmcData.direction = atof(token); } // 校验数据是否合法 // TODO: 校验数据 // 输出解析出来的数据 printf("Time: %s\n", gprmcData.time); printf("Status: %c\n", gprmcData.status); printf("Latitude: %lf\n", gprmcData.latitude); printf("Longitude: %lf\n", gprmcData.longitude); printf("Speed: %lf\n", gprmcData.speed); printf("Direction: %lf\n", gprmcData.direction); } } } return 0; } ``` 需要注意的是,以上代码只是一个简单的示例,实际情况中还需要根据具体的需求进行适当的修改和完善。同时,如果需要将解析出来的结构体数据存储到文件或者数据库中,也需要进行相应的处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值