找到最近的摩拜單車——高德地圖API的應用

整體思路

  • 首先线召,將目標地點轉換為相應的經(jīng)緯度。
  • 然后以經(jīng)緯度查詢附近的摩拜單車赤炒,將其標記在地圖上。
  • 接著亏较,用起始位置與距離最近的單車位置調用導航API獲取路徑莺褒。
  • 最后將路線繪制在地圖上。

使用庫與資源

效果圖

代碼

  • 先將key換成你自己的,也可直接使用我的嘗試
import folium
import subprocess
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

key = 'efb66f1d0e0a897af3702fdb233c0812'

def geoMap(address=u'北京市', city=''):
    '''
    由地名獲得對應經(jīng)緯度
    '''
    geoMapUrl = ('http://restapi.amap.com/v3/geocode/geo?'
                 'key={key}&address={address}&city={city}')
    geo_map_url = geoMapUrl.format(key=key, address=address, city=city)

    r = requests.get(geo_map_url)
    try:
        locat = r.json()['geocodes'][0]['location']
        lng, lat = locat.split(',')
        return lat, lng  # 緯度本今,經(jīng)度拆座!
    except:
        raise Exception(u'無法找到該位置, 請嘗試更詳細的地址, 如添加省市限定')


def get_nearby_bikes(lat, lng):
    '''
    獲取附近的摩拜單車,參考http://www.reibang.com/p/8662de6f0d7a
    '''
    mobike_url = "https://mwx.mobike.com/mobike-api/rent/nearbyBikesInfo.do"
    headers = {
        'referer': "https://servicewechat.com/",
        # 'host': "mwx.mobike.com",  # host和agent暫時來看沒有影響
        # 'user-agent': "MicroMessenger/6.5.4.1000 NetType/WIFI Language/zh_CN"
    }
    data = {  # 請求參數(shù): 緯度冠息,經(jīng)度挪凑!
        'latitude': lat,
        'longitude': lng,
    }

    r = requests.post(mobike_url, data=data, headers=headers,
                      timeout=5, verify=False)
    return r.json()


def routeMap(origin, destination):
    '''
    以經(jīng)緯度起點和終點獲取導航路徑json數(shù)據(jù)
    '''
    routeMapUrl = ('http://restapi.amap.com/v3/direction/walking?'
                   'key={key}&'
                   'origin={origin[1]},{origin[0]}&'
                   'destination={destination[1]},{destination[0]}')

    route_map_url = routeMapUrl.format(key=key,
                                       origin=origin, destination=destination)

    r = requests.get(route_map_url)
    return r.json()


def json_to_line(json_):
    '''
    將獲取的導航json數(shù)據(jù)轉換為[[int, int], [int, int]]形式的經(jīng)緯度列表
    '''
    if json_.get('route', None):
        line = []
        route = json_['route']
        dest = route['destination']
        ori = route['origin']
        line.append(ori)
        for step in route['paths'][0]['steps']:
            line.extend(step['polyline'].split(';'))
        line.append(dest)
        line = [lnglat.split(',')[::-1] for lnglat in line]
        line = [[float(lat), float(lng)] for lat, lng in line]
        return line
    return None


def display_map(where, whereLatLng, markers, html_name):
    '''
    顯示所有摩拜單車的地點,并畫出從當前點到最近的摩拜的導航路線
    '''
    tileset = ('https://webrd01.is.autonavi.com/appmaptile?'
               'lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}')
    # colors = ['green', 'red', 'blue']

    map = folium.Map(location=whereLatLng,
                     zoom_start=7,
                     tiles=tileset,
                     attr='附近摩拜單車分布 @ Mobike & Gaode')
    for marker in markers:
        # import random
        # color = random.choice(colors)
        folium.Marker(marker,
                      popup=where,
                      icon=folium.Icon(color='green')).add_to(map)
    json_ = routeMap(whereLatLng, markers[0])
    line = json_to_line(json_)
    folium.PolyLine(line, color='red').add_to(map)
    map.fit_bounds(markers)
    map.save(html_name)
    command = ['start', html_name]
    subprocess.run(command, shell=True)


where = u'西安市鐘樓公交站'
whereLatLng = geoMap(where)
json_ = get_nearby_bikes(*whereLatLng)
if json_.get('object', None):
    bikes = json_['object']
    markers = [(bike['distY'], bike['distX']) for bike in bikes]
html_name = 'mapBike.html'
display_map(where, whereLatLng, markers, html_name)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末逛艰,一起剝皮案震驚了整個濱河市躏碳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌散怖,老刑警劉巖菇绵,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異镇眷,居然都是意外死亡咬最,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門欠动,熙熙樓的掌柜王于貴愁眉苦臉地迎上來永乌,“玉大人,你說我怎么就攤上這事具伍∶猓” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵沿猜,是天一觀的道長枚荣。 經(jīng)常有香客問我,道長啼肩,這世上最難降的妖魔是什么橄妆? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任衙伶,我火速辦了婚禮,結果婚禮上害碾,老公的妹妹穿的比我還像新娘矢劲。我一直安慰自己,他們只是感情好慌随,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布芬沉。 她就那樣靜靜地躺著,像睡著了一般阁猜。 火紅的嫁衣襯著肌膚如雪丸逸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天剃袍,我揣著相機與錄音黄刚,去河邊找鬼。 笑死民效,一個胖子當著我的面吹牛憔维,可吹牛的內容都是我干的。 我是一名探鬼主播畏邢,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼业扒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舒萎?” 一聲冷哼從身側響起程储,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逆甜,沒想到半個月后虱肄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體致板,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡交煞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了斟或。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片素征。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖萝挤,靈堂內的尸體忽然破棺而出御毅,到底是詐尸還是另有隱情,我是刑警寧澤怜珍,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布端蛆,位于F島的核電站,受9級特大地震影響酥泛,放射性物質發(fā)生泄漏今豆。R本人自食惡果不足惜嫌拣,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呆躲。 院中可真熱鬧异逐,春花似錦、人聲如沸插掂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辅甥。三九已至酝润,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肆氓,已是汗流浹背袍祖。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谢揪,地道東北人蕉陋。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像拨扶,于是被迫代替她去往敵國和親凳鬓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內容