Python获取amap高德地图

原创
2016/07/26 16:27
阅读数 1.2W

A.初始值,Python的字符是ascii,html是utf-8,转要转码

#__author__='ZHENGT'
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')            #Python默认ascii,需要转成utf-8

B.以静态图片形式展示图片

1)读取文件信息,这里用pandas库以dataframe形式.

2)高德地图添加点有50数量限制

3)将查询经纬度后的结果存为csv

import webbrowser
import pandas as pd
import urllib
import json

#http://lbs.amap.com/api/webservice/reference/staticmaps/#t6
#945ae54516979776ab3ee717012c24d4     #key

df = pd.read_table('WWT_Facility.txt')     #读取目标文件
df['lon']=6.0                               #插入lon列
df['lat']=7.0                               #插入lat列
# print df.head(5)                           #显示开始5行

def getHtml(url):          #<---获取网页信息--->
    page = urllib.urlopen(url_amap)                #访问网页
    data = page.readline()                         #读入数据
    data_dic = json.loads(data)                    #转换成python->字典
    data_dic_geocodes = data_dic['geocodes'][0]   #获取geocodes信息,也是以字典存储
    data__dic_location = data_dic_geocodes['location']  # 获取location信息
    location = str(data__dic_location).split(",")   #处理locaiton成为List
    #print location
    return location                                 #返回信息

def getStaticAmap(lonlat_str,str_city_center):      #<---获取静态高德地图--->
    # sh = '121.472644,31.231706'  # 上海中心点
    #高德地图-->静态地图API地址
    url = r'http://restapi.amap.com/v3/staticmap?location=%s&zoom=10&size=1024*768&key=<YOURKEY>'
    url_1 = url % str_city_center                                       #加入城市
    url_amap=url_1+'&markers=mid,0xFF0000,A:'+lonlat_str            #增加marker点
    print url_amap                                                     #
    webbrowser.open(url_amap)                                          #打开

def formatLocation(str,location):    #<---格式化Location-->
#格式是lon1,lat1;lon2,lat2;lon3,lat3....
    strTemp=','.join(location)                #lon,lat
    if len(str)==0:                           #判断是否是初始字符串
        strLocation=strTemp
    else:                                     #不是初始字符串
        strLocation=str+';'+strTemp           #合并字符串
    return strLocation                        #返回值

if __name__=='__main__':         #<---主程序--->
    countdf=len(df)                                 #df的行号,用以循环
    lonlat_str=''                                   #定义空白定符串
    str_city_center = '121.472644,31.231706'     #城市中心点lonlat
    i=0                                             #初始化i
    while i<15:                                    #循环,高德地图有<50个点限制
          df_1=df.ix[i,1]                           #名称
          df_2=df.ix[i,2]                           #地址
          df_3=df.ix[i,5]                           #处理量
          amap = r'http://restapi.amap.com/v3/geocode/geo?address=%s&city=上海&output=JSON&key=945ae54516979776ab3ee717012c24d4'
          url_amap=amap % df_2
          getLocation=getHtml(url_amap)             #获取数据,返回List[lon,lat]
          df.ix[i,6]=getLocation[0]                 #lon信息
          df.ix[i,7]=getLocation[1]                 #lat信息
          lonlat_str=formatLocation(lonlat_str,getLocation)   #定义marker点格式--->静态地图用
          # print lonlat_str                        #显示marker点
          # print df[i:i+1]                         #显示相关行数据
          i+=1
    # print df                                       #观察一下数据
    getStaticAmap(lonlat_str,str_city_center)        #打开静态地图
    df.to_csv('WWT_lonlat.csv', index=False, sep=',', encoding='utf-8')   #存储为csv格式

结果如下:

C.以交互形式展式

1)mako库可以将python传递给本地HTML模版

2)AMAP的marker需要一个一个添加

3)需将产生的结果存为本地HTML,再用browser调用

4)经纬信息是下载好的,如需要可以调用另一script来进行获取

#似乎marker只能一个一个点添加,不能以数组形式添加
#http://lbs.amap.com/api/javascript-api/guide/quickstart/#t1
#https://wiki.python.org/moin/Templating
#http://www.jb51.net/article/84425.htm
#http://www.yeolar.com/note/2012/08/28/mako-syntax/
#Python打开HTML文件需要引用webbrowser
import webbrowser
from mako.template import Template                         #导入模板对象
import codecs                                              #导入转义库
import pandas as pd

#经纬度已经在R+Python中下载过,这里就不重复下载
df_lonlat=pd.read_table(r'C:\Users\zhengt\Desktop\Study\Python\BeginningPython\BeginningPython\result.txt',sep=",",header=None)
df_lonlat.head(5)           #查看前5行

def get_dic_lonlat(df):      #<---将lonlat转成字典,title:lon,lat--->
    count_df=len(df)                          #df的行号,用以循环
    i=0                                       #初始化变量
    title=[]                                  #初始化变量
    lonlat=[]                                 #初始化变量
    dic={}                                    #初始化变量
    while i<count_df-1:                        #循环
        title.append(df.ix[i,0])               #获取标题
        lon=round(df.ix[i,3],4)                #获取lon
        lat=round(df.ix[i,4],4)                #获取lat
        lonlat.append(str(lon)+","+str(lat))   #lon,lat
        # print title,lonlat
        dic=dict(zip(title,lonlat))            #写入字典,title:lonlat
        i=i+1
    return dic                                 #返回字典

def getInterAmap(str_city_center,dic_lonlat):      #<---获取动态高德地图--->
    # sh = '121.472644,31.231706'  # 上海中心点
    #高德地图-->静态地图API地址
    url = r'C:\Users\zhengt\Desktop\Study\Python\BeginningPython\BeginningPython\amap_with_point.html'
    tmple=Template(filename=url,input_encoding='utf-8')        #根据amap构建模板对象
    result=tmple.render(Locat=str_city_center,
                        Pt=dic_lonlat)                          #将location传递给mako的template
    # result=tmple.render(Locat='121.74,31.24')                 #test only
    print result                                               #显示结果
    f=codecs.open("text.html",'w',"utf-8")                   #另存为文件
    f.write(result)                                            #写入信息
    f.close()                                                  #关闭文件
    url_1=r'text.html'                                       #文件名
    webbrowser.open(url_1)                                     #打开本地html

if __name__=='__main__':         #<---主程序--->
    dic_lonlat=get_dic_lonlat(df_lonlat)                      #返回字典
    for key,value in dic_lonlat.items():
        print key,'-->',value                             #观察字典内容
    str_city_center = '121.47,31.23'            #城市中心点lonlat
    result=getInterAmap(str_city_center, dic_lonlat)              #获取地图

结果如下:

HTML模版如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="chrome=1">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <style type="text/css">
      body,html,#container{
        height: 100%;
        margin: 0px;
        font: 12px Helvetica, 'Hiragino Sans GB', 'Microsoft Yahei', '微软雅黑', Arial;
      }
    </style>
</head>
  <body>
   <div id="container" tabindex="0"></div>
   <div id='panel'></div>
<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.3&key=<YOURKEY>"></script>
   <script type="text/javascript">
    var mapObj = new AMap.Map('container',{
            resizeEnable: true,
            zoom: 10,
            center:[${Locat}]
            });

    % for key in Pt.keys():
    var marker = new AMap.Marker({
    		 position:[${Pt[key]}],
    		 title:"${key}",
    		 map: mapObj
    		 })
	% endfor
   </script>
  </body>
</html>

 

展开阅读全文
打赏
2
3 收藏
分享
加载中
更多评论
打赏
0 评论
3 收藏
2
分享
返回顶部
顶部