看看過去跑過哪些地方,用Python和高德API繪制跑步軌跡

最近幾個月跑了不少步品洛,試用了很多不同的APP树姨,導(dǎo)致軌跡、跑量什么的各自為政桥状,因此萌生了寫個程序把所有跑步的軌跡都畫在一張地圖上的想法。

第一步硝清,先把各個地方能導(dǎo)出軌跡的都導(dǎo)出來辅斟。看了一下.FIT .TPX .GPX中芦拿,以GPX文件結(jié)構(gòu)最簡單士飒,下面就是一段.gpx文件的記錄點格式,于是把軌跡都導(dǎo)成.gpx文件蔗崎。

GPX文件數(shù)據(jù)點

第二步酵幕,讀取GPX文件數(shù)據(jù)

人生苦短,我用Python——用Python讀入這些GPX軌跡信息缓苛,處理后再畫在地圖上芳撒,應(yīng)該是最容易的做法了。Python本身接近自然語言未桥,豐富的第三方庫讓寫程序就像用英文和計算機(jī)對話一樣笔刹。

直接使用Python自帶的xml庫完成讀取,注意要剔除lat和lon為0的數(shù)據(jù)點冬耿,因為GPX是用這種方法來標(biāo)記暫停的舌菜。

    import xml.dom.minidom as xdom

    gpxPath = 'test.gpx'
    dom_tree = xdom.parse(gpxPath)
    collection = dom_tree.documentElement
    trkpts = collection.getElementsByTagName("trkpt")
    lats, lons = [], []

    for trkpt in trkpts:
        lat = trkpt.getAttribute("lat")
        lon = trkpt.getAttribute("lon")
        if lat=='0' or lon=='0':
            continue
        lats.append(float(lat))
        lons.append(float(lon))

    datas = {'lat': lats, 'lon': lons}

第三步,將數(shù)據(jù)畫在地圖上

前面進(jìn)行的一切順利亦镶,沒想到在畫地圖的時候卡住了日月。

建筑師出身袱瓮,對圖面的要求不能太低。而Python的地圖庫里面幾乎沒有好看的地圖爱咬,而且使用起來都頗為麻煩尺借。在嘗試了Basemap、Plotly台颠、Folium之后褐望,最終選擇使用高德地圖,方便好用串前。

高德地圖JavaScrip API快速入門
在正式開始開發(fā)地圖應(yīng)用之前,您需要做如下幾步:

<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.3&key=您申請的key值"></script> 
  • 創(chuàng)建地圖容器
    在頁面body里你想展示地圖的地方創(chuàng)建一個div 容器瘫里,并指定id標(biāo)識:
<div id="container"></div>  
  • 指定容器大小
    按照需要設(shè)定地圖容器的大小,確保大小合適,比如用CSS這樣設(shè)置它:
#container {width:300px; height: 180px; }  

接下來要寫個網(wǎng)頁用來讀取本地的數(shù)據(jù)文件荡碾。因為之前已經(jīng)使用Python完成了GPX數(shù)據(jù)讀取谨读,所以先改寫一下,輸出JS可以方便讀取的JSON文件坛吁。

    import os

    fileDir, fileName = os.path.split(gpxPath)
    jsonDir = os.path.join(fileDir, 'jsons')
    if not os.path.exists(jsonDir):
        os.mkdir(jsonDir)

    jsonPath = os.path.join(jsonDir, fileName) + '.json'
    with open(jsonPath, 'w') as f:
        f.write(json.dumps(datas))

同時為了方便的處理多條數(shù)據(jù)劳殖,把上面Python的部分寫成一個procXml函數(shù),然后在命令行中將要轉(zhuǎn)換的文件作為參數(shù)傳入拨脉。

import sys

def main():
    if len(sys.argv) < 2:
        print 'Specify the gpx file path'
        return

    fileList = sys.argv[1:]
    for p in fileList:
        if os.path.isfile(p):
            gpxPath = os.path.abspath(p)
            print 'Processing'+str(gpxPath)
            try:
                procXml(p)
                print 'Coresponding JSON file was generated.'
            except:
                print '=====Somthing was wrong哆姻!====='

if __name__ == '__main__':
    main()

保存為gpx2json.py,將從跑步軟件中導(dǎo)出的GPX文件都放在同目錄下的gpxs文件夾中玫膀,然后在命令行中輸入以下命令進(jìn)行批量轉(zhuǎn)換:

python gpx2json.py gpxs/*

軌跡處理完畢后的json文件會放到gpxs/json/下矛缨,馬上就要讀取本地的json文件并調(diào)用高德地圖的API畫軌跡了,已經(jīng)接近完成了呢帖旨。

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
    <script type="text/javascript" src="http://webapi.amap.com/maps?v=1.3&key=cgbvip@gmail.com"></script>
    <title>-*- iRunMap -*-</title>
</head>

<body>
    <form action="" method="post" enctype="multipart/form-data">
        <input id="file-upload" type="file" multiple>
        <input id ="clear" type="button" value='clear'>
    </form>
    <div id="container" style="width:1200px;height:800px;">
    </div>
    <script src="drawPath.js"></script>
</body>

</html>

保存為index.html箕昭。框架已經(jīng)搭好解阅,就差最后的drawPath.js了落竹。
看了一下高德的API,mapStyle選擇dark货抄,黑色的背景地圖非呈稣伲酷炫。為了更清楚的顯示軌跡信息碉熄,直接隱掉路網(wǎng)桨武、建筑等圖層,features設(shè)置為bg(純背景)锈津。用HTML5提供的ObjectURL獲得本地文件的地址呀酸。

'use strict';

var map = new AMap.Map('container', {
    zoom: 12,
    center: [121, 31],
    mapStyle: 'dark',
    features: ['bg'] 
});

$(document).ready(function(){
    $('#clear').on('click', (function(){
        map.clearMap();
    }));
    $('#file-upload').on('change', function(){
        for(var i=0,f;f=this.files[i];i++){
            var fPath = window.URL.createObjectURL(f);
            $.getJSON(fPath, function(data){
                var lineArr = new Array();
                for(var i=0;i<data.lat.length;i++){
                    lineArr.push(new AMap.LngLat(data.lon[i],data.lat[i]));
                }
                var polyline =new AMap.Polyline({
                    path: lineArr,
                    strokeColor: "#00ff00",
                    strokeOpacity: 0.5,
                    strokeWeight: 3, 
                    strokeStyle: "solid",
                });
                polyline.setMap(map);
            });
        }
    });
});

Duang的一下就完成了!打開文件上傳所有GPX文件琼梆,一直在復(fù)旦大學(xué)和上海西南某高校附近徘徊呢性誉,真是冤家窿吩。

7月-9月的跑步軌跡.png

查看源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市错览,隨后出現(xiàn)的幾起案子纫雁,更是在濱河造成了極大的恐慌,老刑警劉巖倾哺,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轧邪,死亡現(xiàn)場離奇詭異,居然都是意外死亡羞海,警方通過查閱死者的電腦和手機(jī)忌愚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來却邓,“玉大人硕糊,你說我怎么就攤上這事±搬悖” “怎么了简十?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長撬腾。 經(jīng)常有香客問我螟蝙,道長,這世上最難降的妖魔是什么民傻? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任胶逢,我火速辦了婚禮,結(jié)果婚禮上饰潜,老公的妹妹穿的比我還像新娘。我一直安慰自己和簸,他們只是感情好彭雾,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锁保,像睡著了一般薯酝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爽柒,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天吴菠,我揣著相機(jī)與錄音,去河邊找鬼浩村。 笑死做葵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的心墅。 我是一名探鬼主播酿矢,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼榨乎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘫筐?” 一聲冷哼從身側(cè)響起蜜暑,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎策肝,沒想到半個月后肛捍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡之众,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年拙毫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酝枢。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡恬偷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帘睦,到底是詐尸還是另有隱情袍患,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布竣付,位于F島的核電站诡延,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏古胆。R本人自食惡果不足惜肆良,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逸绎。 院中可真熱鬧惹恃,春花似錦、人聲如沸棺牧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颊乘。三九已至参淹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乏悄,已是汗流浹背浙值。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留檩小,地道東北人开呐。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親负蚊。 傳聞我的和親對象是個殘疾皇子神妹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)家妆,斷路器鸵荠,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,482評論 6 427
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,135評論 25 707
  • GitHub 上有一個 Awesome - XXX 系列的資源整理,資源非常豐富,涉及面非常廣伤极。awesome-p...
    若與閱讀 18,648評論 4 418
  • 加入到現(xiàn)在為止就是你生命的全部蛹找,那么你滿意自己的過往么?上天給了你同等的時間,你活出了自己的價值了么?如果此刻你正...
    木戲閱讀 167評論 0 0