电竞比分网-中国电竞赛事及体育赛事平台

分享

利用百度地圖API制作城市中心交通時(shí)空圈

 燕子地理圖書館 2019-11-02
城市森林有話說

      彈指一揮間,ArcGIS筆記已經(jīng)很久沒有更新了。這里先給大家道個(gè)歉,由于前段時(shí)間趕項(xiàng)目,加之錄python視頻,因此耽擱了很久。這里需要說明的是,我們公眾號(hào)會(huì)持續(xù)更新下去,希望大家多多支持。

      我們知道,城市的中心一般是商業(yè)、商務(wù)高度發(fā)達(dá),公共服務(wù)較為集中的區(qū)域。從市中心外圍前往市中心享受各類公共服務(wù)是市民的重要權(quán)利之一。但受城市交通條件的影響,各區(qū)域前往市中心的交通狀況差異較大。有效識(shí)別各區(qū)域前往市中心的交通時(shí)間,一方面有助于我們認(rèn)識(shí)各區(qū)域交通狀況,從而有針對(duì)性的進(jìn)行區(qū)域交通條件改進(jìn);另一方面,有助于我們進(jìn)行用地優(yōu)化,從而實(shí)現(xiàn)交通與用地的協(xié)調(diào)。當(dāng)然,前往市中心休閑、購(gòu)物是我們年輕人最為重要的假日活動(dòng),在房?jī)r(jià)高漲的當(dāng)下,選擇交通條件優(yōu)越、房?jī)r(jià)相對(duì)較低的區(qū)域是我們擇居的原則之一,故研究城市中心交通時(shí)空圈也具有重要意義。本期應(yīng)網(wǎng)友要求,帶來城市中心交通時(shí)空圈的技術(shù)方法講解。

1案例選擇

      本次案例城市選擇成都市。首先,成都是我的家鄉(xiāng),我對(duì)成都有著深厚的感情(要整就整成都);其次,成都中心城區(qū)受自然條件影響相對(duì)較少,不像南京有紫金山,武漢有東湖、長(zhǎng)江等自然條件的限制,網(wǎng)格之間可實(shí)現(xiàn)無差別的比較;最后,也是最為重要的,成都是環(huán)形放射網(wǎng)狀的路網(wǎng)格局,不同方位的交通狀況差異性并不十分明顯,并且市中心正好位于幾何中心,在交通條件差異不大的情況下,其交通通達(dá)績(jī)效究竟如何?

2方法步驟

      第一步,我們需要獲取研究區(qū)域的范圍,以成都為例,我們獲取了中心城區(qū),包括天府新區(qū)的規(guī)劃范圍線。第二步,我們要將規(guī)劃范圍生成面,并生成網(wǎng)格(這里我們生成1000mX1000m的網(wǎng)格);第三步,我們要獲取各網(wǎng)格中心坐標(biāo)和市中心坐標(biāo)(市中心選擇天府廣場(chǎng)中心);第四步,運(yùn)用百度API獲取各網(wǎng)格中心坐標(biāo)至市中心坐標(biāo)的時(shí)間(http://lbsyun.baidu.com/index.php?title=webapi/direction-api,不再具體解釋,自己看參數(shù))。第五步,空間可視化后進(jìn)行相關(guān)分析,即可獲得城市中心交通時(shí)空圈。

3方法實(shí)施

      在對(duì)方法進(jìn)行具體實(shí)施前,我想感謝網(wǎng)友web攻城獅之路。他編寫了Python代碼用于抓取路線時(shí)間,具體見http://blog.csdn.net/taijiedi13/article/details/51279959。我在其基礎(chǔ)上結(jié)合規(guī)劃師的思維邏輯對(duì)代碼進(jìn)行優(yōu)化。主要的優(yōu)化部分是運(yùn)用arcpy來實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)更新。我猜想該網(wǎng)友并不是城市規(guī)劃專業(yè)的,因此可能未接觸過面向ArcGIS的arcpy,具體代碼調(diào)整后面講具體方法時(shí)會(huì)提到。為了讓大家更清楚的了解流程方法,因此很多地方我是直接運(yùn)用ArcGIS來實(shí)現(xiàn),并未完全采用python。如果網(wǎng)友感興趣,可以自己編寫Python代碼,來實(shí)現(xiàn)全過程的自動(dòng)化。

第一步:獲取范圍。

      這個(gè)不做過多介紹,你要研究,好歹有個(gè)基礎(chǔ)的CAD范圍線啊。別問我怎么找,發(fā)揮自己聰明頭腦。找不到,自己拿豆腐撞頭。

第二步:生成網(wǎng)格。

      將線生成面后,對(duì)面進(jìn)行坐標(biāo)調(diào)整,調(diào)整為百度十進(jìn)制經(jīng)緯度坐標(biāo)系。由于我們的研究范圍大,因此位置大致準(zhǔn)就行。建議在百度地圖中找好參照點(diǎn)后,運(yùn)用空間校正來實(shí)現(xiàn)??臻g坐標(biāo)準(zhǔn)確后,用創(chuàng)建漁網(wǎng)工具來生成1000mX1000m的漁網(wǎng)。生成的文件有點(diǎn)與線兩個(gè)要素,并將線生成面。最終,我們有了網(wǎng)格中心點(diǎn)與網(wǎng)格面兩個(gè)我們需要的文件(圖1)。


圖1

第三步:獲取坐標(biāo)。

      先講下獲取城市中心(天府廣場(chǎng))坐標(biāo)。運(yùn)用百度獲取坐標(biāo)系統(tǒng)工具(http://api.map.baidu.com/lbsapi/getpoint/index.html)可以輕松獲取(圖2)。


圖2

      接下來,講下獲取各網(wǎng)格中心點(diǎn)的坐標(biāo)。打開點(diǎn)要素表,添加經(jīng)度、緯度、時(shí)間3個(gè)字段(圖3,時(shí)間字段為后續(xù)記錄時(shí)間),并用計(jì)算幾何命令分別計(jì)算中心點(diǎn)的坐標(biāo),計(jì)算是要選擇十進(jìn)制,X坐標(biāo)為經(jīng)度,Y坐標(biāo)為緯度(圖4)。

      這樣,我們就獲取了起點(diǎn)(N各網(wǎng)格中心),終點(diǎn)(天府廣場(chǎng))的坐標(biāo)。


圖3


圖4

 第四步:獲取時(shí)間

      這一步驟為重點(diǎn)。在這個(gè)程序中獲取百度API的時(shí)間函數(shù)get_time()為直接來自網(wǎng)友web攻城獅之路,這些代碼我不做介紹,我只給大家講下我調(diào)整的代碼(圖5)。我將他的run()去掉,用數(shù)據(jù)訪問模塊的UpdateCursor來實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)更新。在網(wǎng)友web攻城獅之路的代碼中,需要將點(diǎn)坐標(biāo)統(tǒng)一封裝到excel文件中,然后再讀取每一個(gè)坐標(biāo),最終還要將獲取的時(shí)間再寫入excel文件。而且最終生成的時(shí)間數(shù)據(jù)還要導(dǎo)入ArcGIS進(jìn)行空間可視化。過程過于復(fù)雜,而且比較繁瑣,這一步驟完全可以運(yùn)用Arcpy中的UpdateCursor來高效實(shí)現(xiàn)。

圖5

      考慮到百度起點(diǎn)坐標(biāo)的引用規(guī)則(緯度在前,經(jīng)度在后),我們用變量coord來存儲(chǔ)每一個(gè)坐標(biāo)數(shù)據(jù),并調(diào)用get_time()來獲取時(shí)間數(shù)據(jù)。由于獲取的時(shí)間為秒,而我最后想用分鐘來表示,所以代碼53將秒數(shù)據(jù)改為分鐘數(shù)據(jù)。在代碼測(cè)試過程中,我遇到了JSON數(shù)據(jù)報(bào)錯(cuò),這是由于百度JSON數(shù)據(jù)規(guī)范性所產(chǎn)生的。因此,我加入了try命令進(jìn)行錯(cuò)誤調(diào)試,如果出現(xiàn)錯(cuò)誤,則時(shí)間為0,便于我們后續(xù)檢查數(shù)據(jù)。最后,將獲取的時(shí)間數(shù)據(jù)寫入點(diǎn)文件。

 第五步:空間可視化

      用空間鏈接,可將點(diǎn)要素中的時(shí)間數(shù)據(jù)記錄入面要素中,并進(jìn)行空間可視化,實(shí)現(xiàn)城市中心交通時(shí)空圈圖的最終生成(圖6、圖7)。我獲取的時(shí)間是10月1日晚11時(shí),由于假期外出車輛較多,故總體交通條件較優(yōu)。大家可以測(cè)試下高峰時(shí)期,估計(jì)時(shí)間會(huì)有所增加。結(jié)論大家自己總結(jié)吧!


圖6

圖7

4總結(jié)

全代碼如下。


# -*- coding:utf-8 -*-

import arcpy

import requests  

import json

fc = r'G:\2016tuto\baidur2.gdb\cd_dotuse_final'

fields = ['OID','lng','lat','dur']

def get_time(coordinate,mode,city,api_key):  

    api_addr='http://api.map.baidu.com/direction/v1?mode='+mode+'&origin='+coordinate+'&destination=30.663467,104.072247&origin_region='+city+'&destination_region='+city+'&output=json&coord_type=wgs84&ak=' + api_key

    req=requests.get(api_addr)  

    content=req.content  

    sjson=json.loads(content)  

    if sjson.has_key('result'):  

        #print sjson['status']  

        if sjson['status']==0:  

            if mode=='transit':  

                if sjson['result'].has_key('routes'):  

                    if sjson['result']['routes'][0].has_key('scheme'):  

                        time=sjson['result']['routes'][0]['scheme'][0]['duration']  

                    else:  

                        time=sjson['result']['routes'][0]['duration']  

                else:  

                    time=0  

            else:  

                if sjson['result'].has_key('routes'):  

                    if sjson['result']['routes']==None:  

                        time=0  

                    else:  

                        time=sjson['result']['routes'][0]['duration']  

                else:  

                    time=0  

        else:  

            time=0  

    else:  

        time=0  

    print '點(diǎn)'+coordinate+ '至市中心需要'+str(time) +'秒' +'。時(shí)間已寫入!'

    return time

#30.267552,104.303822

if __name__ == '__main__':

    mode = 'driving'

    city = u'成都'

    api_key = ''

    print '開始錄入數(shù)據(jù),請(qǐng)稍等...'

    with arcpy.da.UpdateCursor(fc, fields) as cursor:

        for row in cursor:

            coord = str(row[2])+','+str(row[1])

            try:

                time =  get_time(coord,mode,city,api_key) 

                row[3] = time/60

            except:

                row[3] = 0

            cursor.updateRow(row)

    print '全部數(shù)據(jù)錄入!'

      最后,我想說下,網(wǎng)絡(luò)上的數(shù)據(jù)實(shí)在是太豐富了,我們要善于去利用。時(shí)值國(guó)慶節(jié)期間,游山玩水期間發(fā)表此文,時(shí)間倉(cāng)促,未講清楚的地方請(qǐng)各位看官提出。

      祝大家國(guó)慶快樂,吃好玩好!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多