(注意,转成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