需求:给定一批地址,生成一张地图,上面有红点标注。
解决办法,总体思路是通过百度地图的API,免费高效:
1.注册一个百度帐号。登陆
http://lbsyun.baidu.com/apiconsole/key
创建一个应用,生成一个appkey
2.打开
http://developer.baidu.com/map/index.php?title=jspopular
找到云麻点图
http://developer.baidu.com/map/jsdemo.htm#g0_4
实际上找到的是JavaScript 开源库中的标注管理器
http://developer.baidu.com/map/index.php?title=open/library
选择里面的标注管理器的例子,基于它作修改。
3.用python脚本处理地址,调用http接口,生成json格式的代码。
接口说明如下:
http://developer.baidu.com/map/index.php?title=webapi/guide/webservice-placeapi
主要代码如下:
position_list = []
for place in list:
encode_place = urllib.quote(place)
url = ‘http://api.map.baidu.com/place/v2/search?&q=’ + encode_place + “®ion=” + encode_city + “&output=json&ak=” + ak
#print “place ” + place + ” encode ” + encode_place
#print “place ” + place + “url ” + url
url_ret = urllib.urlopen(url).read()
#print “place ” + place + ” ret ” + str(url_ret)
url_ret_json = json.loads(url_ret);
if url_ret_json['status'] == 0:
for position_info in url_ret_json['results']:
name = position_info['name']
if not position_info.has_key(‘location’):
continue
lat = position_info['location']['lat']
lng = position_info['location']['lng']
address = position_info['address']
coord_type = 1
#print (name.encode(‘utf8′) + “\t” + address.encode(‘utf8′) + “\t” + str(lng) + “\t” + str(lat) + “\t” + str(coord_type))
position = {
‘title’ : name,
‘address’ : address,
‘longitude’ : lng,
‘latitude’ : lat,
‘coord_type’ : coord_type
}
position_list.append(position)
print ‘{‘
print ‘\”title\”:\”‘ + name.encode(‘utf8′) + “\”,”
print ‘\”address\”:\”‘ + address.encode(‘utf8′) + “\”,”
print ‘\”longitude\”:’ + str(lng) + “,”
print ‘\”latitude\”:’ + str(lat) + “,”
print ‘\”coord_type\”:’ + str(lat)
print “},”
4.把生成的代码拷贝到position_list.js中
function get_position_list() {
var position_list = [
{
"title":"翡丽城",
"address":"城西西二环土门商圈核心团结中路(小树林旁)",
"longitude":108.889299,
"latitude":34.270751,
"coord_type":34.270751
},
...
]
5.在html中调用get_position_list,生成红点
需要注意的是,要引入MarkerManager_min.js,这个用来生成标注的js脚本
下载地址http://api.map.baidu.com/library/MarkerManager/1.2/src/MarkerManager_min.js
地图中心点随机从要画的地址中选择一个地址设置就可以。
把index.html和get_position.js拷贝到resin这个web server的webapps的baidu_map/目录下,直接访问http://localhost/baidu_map/index.html
就OK了。
这个过程的缺点有两个,一个是随着要绘制的点越来越多,这个例子中有1167个点要绘制,打开的速度会很慢,大约要一分钟。另一个缺点是鼠标点上去没有显示具体的地名,这个需要改进。
6.介绍另一种办法,方法在
http://jingyan.baidu.com/article/e4d08ffdd58e670fd2f60dd7.html?qq-pf-to=pcqq.c2c
中,应该更加高效。
但是我尝试了一下,生成了csv上传后,报服务器内部错误,生成失败,所以我选择自己生成原始数据,调用api绘制地图。