Python调用百度地图API,简单实现批量地址标注

我工作的项目里,经常会碰到客户给个地址列表,我们要一个一个在地图上搜索的情况。为此,趁着周末稍有小闲,用Python写一个批量标注的。

程序逻辑:从excel里读取地址列表 →每个地址搜索一遍,百度地图API会返回url→打开url(好像用到了爬虫的基础),得到经纬度→在百度开发者平台上的html里,直接批量输入经纬度即可显示。

首先,介绍一下百度地图的开发平台,里面会涉及申请一个开发者账号,然后创建一个程序,以获得ak和sk。我是用sn的方式验证的,代码如下:(百度前几天V2升V3,链接变了,还坑了我一下)

def get_url(address):

   # V2: http://api.map.baidu.com/geocoder/v2/?address=搜索地址&output=json&ak=你的ak

    # V3: http://api.map.baidu.com/geocoding/v3/?address=百度大厦&output=json&ak=您的ak&callback=showLocation

    # V3版本中后缀callback加入链接后,会导致后续jason解析出错,所以不要加

    queryStr ='/geocoding/v3/?address=' + address +'&output=json&ak=' + ak

    # 对queryStr进行转码,safe内的保留字符不转换

    encodedStr = parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")

    # 在最后直接追加上你自己的sk

    rawStr = encodedStr + sk

    # 计算sn

    sn = (hashlib.md5(parse.quote_plus(rawStr).encode("utf8")).hexdigest())

    # 由于URL里面含有中文,所以需要用parse.quote进行处理,然后返回最终可调用的url

    url = parse.quote("http://api.map.baidu.com" + queryStr +"&sn=" + sn, safe="/:=&?#+!$,;'@()*[]")

    return url

这里ak和sk字符串提前定义好即可。多说一句,有人反馈找不到sk,在百度地图api应用列表里,点击设置进去就有,ak在最上,sk在最下。以上代码是从这篇文章抄的。

得到的url其实可以在浏览器里直接打开,浏览器里就能返回我们想要的经纬度。



用request解析url,之前看过两眼爬虫的技巧,所以还try了一下,不过估计没必要。用Jason得到一个包含经纬度的套了三层的字典。

def url_Open(url):

# 爬取网页通用代码框架,需要用try

    try:

        testResponse = requests.get(url)

        # 只要返回码不是200(200为正常),就会抛出异常

        testResponse.raise_for_status()

        # 剔除可能的解码异常

        testResponse.encoding = testResponse.apparent_encoding

        return testResponse.json()

except:

print("获取失败")

return "产生异常"



上一步做完,剩下的就是把经纬度信息封装到一个字典里即可,然后就卡在怎么在地图显示了,这个问题还是研究了一会儿的,直到搜到这篇文章。文章里给出的链接貌似是百度地图开发者一个测试模块?连接已经更新了,原文的链接失效了,新的链接:地图API示例。这里要注意的是,“源代码编辑器里的”ak是不用填的,反正我不填可以在这个界面直接用。填了反而会报错说没权限。如果导出html直接打开的话,不管填不填ak,都会说没权限。

其他的设置代码备注已经说得很清楚了。

以下代码贴到“源代码编辑器”,然后点击运行即可。

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <style type="text/css">

body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}

</style> <script type="text/javascript"

//ak填自己申请的ak

src="http://api.map.baidu.com/api?v=2.0& ak=您的密钥">

</script> <title>百度地图api展示</title> </head> <body> <div id="allmap"></div> </body> </html> <script type="text/javascript">

//新建三个地图上点

var points = [

//这里填你之前封装的包含经纬度的字典即可。

//示例:{'lat': 38.946090694889435, 'lng': 117.43834526985445, 'quyu': '第1个地址'}, {'lat': 36.87390250014566, 'lng': 115.46647728073067, 'quyu': '第2个地址'}, {'lat': 34.90387458594099, 'lng': 117.4259256589923, 'quyu': '第3个地址'}

];

//创建标注点并添加到地图中

function addMarker(points) {

    //循环建立标注点

    for(var i=0, pointsLen = points.length; i<pointsLen; i++) {

        var point = new BMap.Point(points[i].lng, points[i].lat); //将标注点转化成地图上的点

        var marker = new BMap.Marker(point); //将点转化成标注点

        map.addOverlay(marker);  //将标注点添加到地图上

        //添加监听事件

        (function() {

            var thePoint = points[i];

            marker.addEventListener("click",

                function() {

                showInfo(this,thePoint);

            });

        })(); 

    }

}

function showInfo(thisMarker,point) {

    //获取点的信息

    var sContent =

    '<ul style="margin:0 0 5px 0;padding:0.2em 0">' 

    +'<li style="line-height: 26px;font-size: 15px;">' 

    +'<span style="width: 50px;display: inline-block;">id:</span>' + point.quyu + '</li>' 

    +'<li style="line-height: 26px;font-size: 15px;">' 

    +'<span style="width: 50px;display: inline-block;">纬度:</span>' +

        point.lat +

        '<span style="width: 50px;display: inline-block;"> 经度:</span>' + point.lng +'</li>' 


    +'</ul>';

    var infoWindow = new BMap.InfoWindow(sContent); //创建信息窗口对象

    thisMarker.openInfoWindow(infoWindow); //图片加载完后重绘infoWindow

}

//创建地图

var map = new BMap.Map("allmap");   

map.centerAndZoom(new BMap.Point(118.164, 24.530), 30);  // 设置中心点

map.centerAndZoom( "厦门");

map.setCurrentCity("厦门");          //设置上海

map.addControl(new BMap.MapTypeControl()); 

map.enableScrollWheelZoom(true);   

addMarker(points);

</script>


然后就在右侧的地图上看到批量标记的点了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336