使用Python和Perl绘制北京跑步地图

Python调用百度地图API实现路径规划提取真实距离、时间 阅读详情


访问flyai.club,一键创建你的人工智能项目



作者 | FerventDesert@博客园

http://www.cnblogs.com/buptzym/ 


当你在一个城市,穿越大街小巷,跑步跑了几千公里之后,一个显而易见的想法是,如果能把在这个城市的所有路线全部画出来,会是怎样的景象呢?


文章代码比较多,为了不吊人胃口,先看看最终效果,上到北七家,下到南三环,西到大望路,东到首都机场。二环32公里,三环50公里,这是极限,四环先暂时不考虑了。。。。


(本文工程已经托管在Github,https://github.com/ferventdesert/gpx-crawler)




1.数据来源:益动GPS

 

首先需要原始位置信息,手机上有众多跑步软件,但它们共同的问题是不允许自由导入导出(可能是为了防止用户脱离吧)。因此有一块智能运动手表应该是不二之选。我的是Garmin Fenix3,推荐一下:



与此同时,益动GPS算是业界良心了,能够同步咕咚,Garmin手表,悦跑圈的数据,因此我将其作为一个入口,抓取所有的GPS数据。


至于如何同步,可参考网站上的相关介绍,下面是我登录该网站后的截图:

http://edooon.com/user/5699607196/record/15414378




随便点进去以后,就可以看到导出路线的按钮:




无比坑爹的是,它不提供批量导出的按钮,几百条记录,依次导出都累死了。于是考虑用代码来自动化吧。


2. 获取益动网站上的数据


登录之后,可以看出它是动态加载,当滚轮滚到最下时,自动加载后面的内容。本来是应该嗅探和分析http请求的。后来我懒惰了,采取折中方案,拖到底,全部加载完毕后,保存了当前的html文件。


接下来就是解析这个Html,基本上是通过XPath的来做的。有经验的同学看了下图就都明白了:



图中高亮的部分,就是要下载gpx文件的实际地址。我们将其保存在urllist中。同时,元数据被保存在json文件里。


folder = u'D:/buptzym的同步盘/百度云/我的文档/数据分析/datasets/rungps/';
cookie='JSESSIONID=69DF607B71B1F14AFEC090F520B14B55; logincookie=5699607196$6098898D08E533587E82B33DD9D02196; persistent_cookie=5699607196$42C885AD38F59DCA407E09C95BE1A60B; uname_forloginform="buptzym@qq.com"; __utma=54733311.82935663.1447906150.1447937410.1456907433.7; __utmb=54733311.5.10.1456907433; __utmc=54733311; __utmz=54733311.1456907433.7.3.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; cookie_site=auto'userid='5699607196';
f = codecs.open(folder + 'desert.htm', 'r', 'utf-8');
html = f.read();
f.close();
root = etree.HTML(html)
tree = etree.ElementTree(root);

listnode=tree.xpath('//*[@id="feedList"]');
numre=re.compile(u'骑行|跑步|公里|,|耗时|消耗|大卡');
urllists=[]
records=[];for child in listnode[0].iterchildren():
    record={};
    temp=child.xpath('div[2]/div[1]/a[2]')    if len(temp)==0:        continue;
    source= temp[0].attrib['href'];
    record['id']=source.split('/')[-1];
    info=temp[0].text;
    numinfo= numre.split(info);    if len(numinfo)<6:        continue;
    record['type']= info[0:2];
    record['distance']= numinfo[1];
    record['hot']=numinfo[6];
    urllists.append('http://edooon.com/user/%s/record/export?type=gpx&id=%s' % (userid, record['id']));


值得注意的是,因为下载时需要cookie,因此读者需要将自己在益动GPS的userid和登录的cookie都替换掉(这种网站不值得为它开发自动登录)。


接下来就是下载的过程,获取导出数据按钮的URL的XPath,构造一个带cookie的请求,然后保存文件即可,非常容易。


opener = urllib.request.build_opener()
opener.addheaders.append(('Cookie', cookie));
path='//*[@id="exportList"]/li[1]/a';for everyURL in urllists:
    id = everyURL.split('=')[-1];    print(id);
    url='http://edooon.com/user/%s/record/%s' % (userid, id);
    f = opener.open(url);
    html = f.read();
    f.close();
    root = etree.HTML(html)
    tree = etree.ElementTree(root);
    fs = str(tree.xpath(path)[0]);    if fs is None:        continue;
    furl = 'http://edooon.com/user/%s/record/%s' % (userid, fs);
    f = opener.open(furl);
    html = f.read();
    f.close();
    filename=folder+'id'+'.gpx';
    xmlfile = codecs.open(filename, 'wb');
    xmlfile.write(html);
    xmlfile.close();


之后,我们便保存了大约300多个gpx文件。


3. 解析gpx数据


所谓gpx数据,是一种通用规范的GPS数据格式,详细的资料可自行搜索。

我们需要使用python的gpx解析器, gpxpy是个好选择,使用

pip3 install gpxpy 即可安装。

gpxpy提供了丰富的接口,当然为了统计,我们只需要提取一部分数据:


def readgpx(x):
     
    file= open(dir+x+'.gpx','r')
    txt=file.read()
    gpx=gpxpy.parse(txt)
    mv=gpx.get_moving_data()
    dat= {'移动时间':mv.moving_time,'静止时间':mv.stopped_time,'移动距离':mv.moving_distance,'暂停距离':mv.stopped_distance,'最大速度':mv.max_speed};
    dat['总时间']=(gpx.get_duration())
    dat['id']=str(x)
    updown=gpx.get_uphill_downhill()
    dat['上山']=(updown.uphill);
    dat['下山']=(updown.downhill)
    timebound=gpx.get_time_bounds();
    dat['开始时间']=(timebound.start_time)
    dat['结束时间']=(timebound.end_time)
    p=gpx.get_points_data()[0]
    dat['lat']=p.point.latitude
    dat['lng']=p.point.longitude
    file.close()    return dat


readgpx函数会读取文件名x,并将一个字典返回。并得到类似下面的一张表:



因为我们只需要绘制北京的区域,因此需要一个坐标表达式筛掉北京之外的地区。筛选代码使用了pandas,在附件里有更详细的代码。


exceptids=详细[(详细.lng<116.1)|(详细.lng>116.7)|(详细.lat<39.9)|(详细.lat>40.1)].id


def filtercity(r):    
sp=r.split('/')[-1].split('.')    
if sp[1]!='gpx':        
return False;    
if sp[0] in exceptids.values:        
return False;    
return True;
bjids= [r for r in gpxs if filtercity(r)]


这样,我们就将所有在北京完成的运动数据筛选了出来。


4.绘制GPS数据


反复造轮子是不好玩的,绘制gpx已经有比较强大的库,地址在

http://avtanski.net/projects/gps/


很不幸,这个库使用Perl作为开发语言,并使用了GD作为视觉渲染库。我花费了大量的时间,在安装GD上面。


Ubuntu默认安装Perl, GD是需要libgd的,libgd却在官网上极难下载,下载后却又发现版本不对,这让我在国外互联网上遨游了好几个小时,都要死掉了。。。到最后,我才发现,安装libgd库只要下面这一步就可以了:


apt-get install libgd-gd2-perl


我觉得这就是apt-get方式坑爹的地方,apt get gd 或者libgd根本找不到,如果不去查,谁知道这么写啊! 至于Perl的CPan管理工具,哎,不说了都是泪。

接下来下载gd 2.56,解压之后,


perl ./Makefile.PL

make

make install


即可

这份gpx绘制库是这么介绍自己的:


This folder contains several Perl scripts for processing and plottin  GPS track data in .GPX format.


当然我们不废话,把所有的gpx数据拷贝到sample_gpx文件夹下,然后华丽丽的运行


./runme.sh


如果没有问题的话,应该是下面这样:


我假设各位读者对bash都已经很熟悉了,更多的需求可以查看runme.sh。


最后得到的结果如下图:



当时看到这个结果,我都惊呆了!这是自己跑了2000公里左右的结果,北京三环内(主要集中在长安街以北)主要的道路都跑遍了,朝阳公园,天坛公园,尤其北三环和北土城路(10号线北段)被我各种虐。每一段白线都是一段故事,每一个点都是我的一个脚印啊!


5.总结


这文章写得显然不够详细,远远没有hand by hand。而且并没有提供更多的数据分析(显然这些工作我都做了)不过相信跑步的程序员一定都很厉害,我这就权作抛砖引玉了。


其实完全可以做成一个web服务,跑友们上传自己的跑步软件的id,就可以自动渲染出各种漂亮的跑步路径和分析图,应该会很有意义吧!


这件事情花费了我七八个小时,简直吐血,大量的时间用在了如何安装GD上,而不是下载数据上。教训告诉我,一定要读安装包里自带的说明文档,因为库和库之间的版本不同,因此可能造成版本地狱,到时候新版本卸载不了,老版本没法用的时候可别说我没提醒啊!


值得一提的是,益动gps下载的gpx文件不带换行符,这导致gpx_disualization库无法解析它(这货正则表达式写错了),我懒得再去动perl正则,于是通过替换增加了换行符。


—  End —



Python高级正则实战:锚点、分组、断言与回溯控制 正则表达式不仅是文本匹配工具,更是处理非结构化数据的核心工程能力。其本质是通过位置锚定(^、$、\b)限定作用域,利用分组机制(捕获组、命名组、非捕获组)提取结构化信息,借助断言(lookaround)实现上下文敏感的条件匹配,并通过回溯控制(惰性量词、原子组)保障性能与安全。这些高级特性共同解决真实场景中的关键痛点:日志解析需精准定位ERROR行内order_id、手机号清洗须避免从长数字串中误截、URL参数提取依赖前后文约束、HTML属性解析需防灾难性回溯。掌握它们,意味着能将模糊的业务规则转化为可验证 阅读详情

相关推荐

数学建模国赛论文写作指南:Word标准模板与高分策略

数学建模是将实际问题抽象为数学模型并求解的关键技术,其核心在于通过数学语言描述和量化现实世界中的复杂关系。其原理涉及优化理论、统计分析、微分方程等多个数学分支,旨在为决策提供科学依据。这项技术的价值在于能够系统化地分析问题、预测趋势并优化方案,是科学研究与工程实践中的重要工具。在学术竞赛、工业设计、经济分析等场景中,数学建模能力尤为关键。一份结构清晰、符合评审规范的论文,是有效展示建模成果、冲击奖项的“硬通货”。本文聚焦数学建模国赛,提供一套从评委视角出发的Word标准写作模板与深度解析,涵盖模型假设、灵敏

weixin_34235457的博客 436

python自动化访问百度地图

然后,你还需要下载并配置浏览器驱动程序,根据你使用的浏览器版本选择合适的驱动程序。比如,如果你使用的是Chrome浏览器,可以下载Chrome驱动程序。在上述代码中,我们首先导入了需要的相关模块。然后,我们指定了 Chrome 驱动程序的路径,构建了 Chrome 浏览器的驱动对象,并打开了百度地图的页面。最后,我们遍历搜索结果并输出名称和地址,并使用。这只是一个简单的示例,你可以根据自己的需求进一步扩展和优化代码。然后,我们等待搜索结果加载完毕,并使用。,你可以自动进行浏览器操作,实现各种自动化任务。

qq_68086484的博客 1284

DeepSeek V4十六字技术解析:32K上下文与单卡FP16落地实践

大语言模型的工程落地正从参数竞赛转向推理效率与部署友好性平衡。上下文长度、混合专家架构(MoE)、多语言代码支持、消费级显卡适配等基础能力,已成为选型核心指标。其中,32K上下文不再仅是理论值,而需结合ALiBi位置编码、KV缓存优化与分块重叠策略实现稳定长文本处理;单卡FP16运行则依赖MoE稀疏激活、混合精度计算与显存带宽协同设计。这些技术价值在本地部署、金融客服、代码助手等场景中直接转化为低延迟、高吞吐与低成本运维。本文基于DeepSeek V4的十六字宣言,还原其背后可验证的架构取舍与实操边界。

weixin_33708432的博客 389

PYTHON爬虫(1):利用requests库和re库批量爬取图片

话不多说,先上代码 import re import os import requests start_url = "http://pic.onlylady.com/2019/0520/" yuan_url = "http://pic.onlylady.com" now_url = start_url depth = 50 #depth 为爬取图集的数量 start_num = 3959092 n...

qq_43479540的博客 1041

使用Python调用百度地图API实现地址查询

本文介绍了如何使用Python调用百度地图API实现地址查询,并通过实例代码进行了详细说明。通过使用API Key和构建请求参数,我们可以轻松地获取地址的经纬度和格式化地址信息。在实际应用中,可以根据具体需求对代码进行优化和扩展,以满足更多的场景和需求。随着技术的发展和进步,相信未来会有更多的地图服务提供商提供更丰富的API接口和功能,为开发者提供更多的选择和便利。

这家伙很懒,什么都没有留下 3146

gpxpy:gpx-py是python GPX解析器。 GPX(GPS eXchange格式)是GPS轨道的基于XML的文件格式

gpxpy-GPX文件解析器 这是一个用于解析和处理GPX文件的简单Python库。 GPX是GPS航迹的基于XML的格式。 您可以在看到它的运行情况。 还有一个gpxpy的Golang端口: 。 如果您的轨道缺少高程数据,另请参见 用法 import gpxpy import gpxpy . gpx # Parsing an existing file: # ------------------------- gpx_file = open ( 'test_files/cerknicko-jezero.gpx' , 'r' ) gpx = gpxpy . parse ( gpx_file ) for track in gpx . tracks : for segment in track . segments : for point in segment

python在地图上画路线_使用Python和Perl绘制北京跑步地图

当你在一个城市,穿越大街小巷,跑步跑了几千公里之后,一个显而易见的想法是,如果能把在这个城市的所有路线全部画出来,会是怎样的景象呢?文章代码比较多,为了不吊人胃口,先看看最终效果,上到北七家,下到南三环,西到大望路,东到首都机场。二环32公里,三环50公里,这是极限,四环先暂时不考虑了。。。。(本文工程已经托管在Github,https://github.com/ferventdesert/gpx...

weixin_39611510的博客 307

ADS2020实战:村田电感.s2p与.mod文件导入全流程对比(附仿真结果差异分析)

本文详细对比了ADS2020中村田电感的.s2p与.mod文件导入流程及仿真结果差异,重点分析了两种模型在低频段和高频段的精度表现。通过实际案例展示.s2p文件在高频仿真中的优势,以及.mod文件在低频和非线性特性模拟中的准确性,为射频电路设计提供模型选择策略和混合仿真技巧。

weixin_29289821的博客 519

【课程设计】(附源码)Python宿舍管理系统 毕业设计231642

宿舍管理系统的主要使用者分为管理员、教师、学生,实现功能包括管理员:后台首页、系统用户(学生)模块管理(宿舍管理、寝室分配、宿舍调换、报修管理、公告管理、留言反馈、考勤管理),学生:后台首页、模块管理(寝室分配、宿舍调换、报修管理、公告管理、留言反馈、考勤管理)等功能, 教师:后台首页、系统用户(学生)模块管理(宿舍管理、寝室分配、宿舍调换、报修管理、公告管理、留言反馈、考勤管理)管理等功能。由于本网站的功能模块设计比较全面,所以使得整个宿舍管理系统信息管理的过程得以实现。

Biye_Design的博客 2909

Ubuntu 24.04 高效部署Slurm集群:从零到生产环境实战

本文提供了一份在Ubuntu 24.04 LTS系统上从零开始部署生产级Slurm高性能计算集群的完整实战指南。内容涵盖网络配置、Munge安全认证、Slurm核心组件安装与配置,并深入讲解了cgroups资源隔离、NFS共享存储、配置无感知模式等生产环境优化技巧,最后通过实例演示如何提交与管理Slurm作业,帮助用户构建高效、稳定的计算平台。

weixin_29213655的博客 565

AI智能体赋能Cypress:自动化前端测试的新范式

自动化测试是现代软件工程保障质量的核心实践,其原理是通过脚本模拟用户操作,对软件功能进行验证。随着大语言模型(LLM)和智能体(Agent)技术的发展,测试自动化正迈向智能化新阶段。智能体能够理解自然语言描述的测试需求,并自主规划、执行测试步骤,这为应对前端UI频繁变更、测试用例维护成本高等挑战提供了新思路。在工程实践中,将Cypress这一流行的前端测试框架封装为智能体可调用的标准化技能(Skill),是实现这一愿景的关键。通过设计清晰的交互协议和状态管理机制,智能体可以像人类测试工程师一样“感知”页面状

weixin_33726318的博客 686

【课程设计】python宿舍管理系統毕业设计源码231642

用户管理,老师对学生账号增删改查 宿舍管理,学生申请,老师实现寝室分配,调换,宿舍床位可视化 报修管理,学生报修,体现报修进度 公告管理,老师可在首页发布公告,学生可留言 考勤管理,考勤打分 信息管理,表格查看,导出,学生表,宿舍表,考勤表 系统管理,权限分配

高级程序源的博客 2197

Zynq7000双核裸机开发实战:如何安全实现共享内存与乒乓RAM设计

本文深入探讨了Zynq7000双核裸机开发中的共享内存与乒乓RAM设计,重点解析了核间通信的Cache一致性处理机制和硬件级实现方案。通过实战代码示例和性能优化技巧,帮助开发者解决双核运行中的访问冲突问题,提升嵌入式系统开发效率。

weixin_29191669的博客 375

上周热点回顾(2.29-3.6)

热点随笔: ·我在三月的边城里,陪你编程;一起等四月的流云来,摆渡此生(素依的铃铛)·.Net 高效开发之不可错过的实用工具(葡萄城控件技术团队)·echarts .NET类库开源(冰の酷龙)·ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发(孙凯旋)·脑洞大开之采用HTML5+SignalR2.0(.Net)实现原生Web视频(GuZhenYin)·.NET We...

weixin_30371469的博客 164

OpenClaw插件配置错误修复完全指南

插件文件名是插件目录结构正确package.json配置正确OpenClaw的插件系统还在快速迭代,偶尔会遇到这种配置问题。看错误信息检查配置文件检查实际文件对比差异修复问题大部分问题都能解决。查看官方文档:https://openclaw.ai/docs提Issue:https://github.com/openclaw/openclaw/issues加入Discord社区求助快速修复命令汇总。

Maynor的博客 4096

万字长文,YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务

YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务

Coding... 1万+

测试开发序列春招JD

美团 截止日期 2020.02.22 -tag 简历稀缺 岗位职责 如果你耐心、细心,喜欢玩大家来找茬; 如果你对技术有着各种吹毛求疵的见解和发现; 在这里,你可以尽情尝鲜,在第一时间发现各种BUG; 在这里,你可以用领先技术来保证产品质量,让亿万消费者受益; 在这里,你就是产品质量的Gatekeeper! 任职要求 1.良好的CS基础,熟练使用C家族/Java/Python/Ruby/Ja...

weixin_41687289的博客 965

【8】mctp & pldm

异步会check seq,保证不丢包,虽然发一条req,不用等,但是不能发下一条req,等上条response回来后才能发下一条。TO(tag owner)=1是request,TO=0是response,但是异步通信response由0改为1。如下还有kcs,i3c,serial等。

持续更新ing... 1082

逝去的2010,期待平静的2011

  还有半个月就是新的一年了,不平静的一年即将结束了!蓦然回首,一年多来自己走过的路!几多辛酸,几多快乐!   09年11月我跟另外一个兄弟我们一起来到北京打拼。作为实习生进入了一家做公安行业解决方案的企业。每个人的工资是1000块,没有饭补,没有任何补助,还好公司提供免费宿舍!在当时虽然感觉工资很低,但是心里还是很快乐,毕竟还是学生。进入公司后,技术老大给了一份资料让我们...

derfyfxh588690的博客 156

194、产线 Camera 校准与测试:终检测试项、规格线制定与量产数据监控

摘要: 文章通过"绿屏门"案例揭示了产线Camera校准测试中的关键问题,提出了系统性改进方案。在终检测试方面,建议增加多增益暗电流测试、混合光源色温测试和径向亮度梯度测试,覆盖用户真实场景。规格线制定强调用CPK替代固定百分比,区分硬软规格并建立动态调整机制。量产监控需关注参数趋势、边界模组分布,构建失效模式数据库。实践建议包括测试冗余设计、规格余量预留、自动化监控、供应商数据共享和人工抽检保留。文章指出Camera产线质量管控需形成"测试设计-规格优化-数据监控"闭环,以数据驱动决策避免客诉风险。

sundong_81的博客 192

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: 福利 | 这里,学习资源,了解一下?
下一篇: Python面试必须要了解的15个问题
iFlyAI
博客等级 码龄9年 238粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值