使用百度地图API计算两点直线距离、道路距离和行车时间

  • 摘要
  • 关键词
  • 介绍
    • 数据展示
    • 工具介绍
    • 根据经纬度计算两点之间的距离
    • 根据经纬度计算两点之间的道路距离和行车时间
    • 多进程
      • 运行中
    • 结果展示
    • 问题收集
  • 参考文献

摘要

在本篇博客中,将通过调用百度地图的API计算两点间的距离和行车时间。处理的csv文件包含30万条数据的经纬度,通过爬虫即可获得;为了更加高效的处理数据,使用到了多进程的方式。

关键词

Python,多进程,距离计算

介绍

数据展示

ID Latitude Longitude
136368 39.71329879760742 116.3936920166016
136369 39.685951232910156 116.31591033935551
136370 39.675697326660156 116.3159561157227
136371 39.675697326660156 116.3159561157227

工具介绍

  • json包:用于读取json文件内容
  • multiprocessing包:python专用多进程包
  • requests包:用于网页信息爬取,是一个很强大的包
  • tqdm包:进度展示
  • time包:time.sleep(),设置进程休眠时间
  • socket包:socket.setdefaulttimeout(), 防止因为爬取网页时间过长带来的卡顿
import json
from multiprocessing.pool import Pool
from urllib.request import urlopen
import pandas as pd
from random import choice
import numpy as np
from tqdm import tqdm
import requests
from requests import adapters
import time
import socket

根据经纬度计算两点之间的距离

def getWorkDistance(lon_a, lat_a, lon_b, lat_b):if abs(lon_a - lon_b) < 0.000001 and abs(lat_a - lat_b) < 0.000001:return 0re = 6378140  # 赤道半径 (m)rp = 6356755  # 极半径 (m)oblateness = (re - rp) / re  # 地球扁率rad_lat_a = radians(lat_a)rad_lon_a = radians(lon_a)rad_lat_b = radians(lat_b)rad_lon_b = radians(lon_b)atan_a = atan(rp / re * tan(rad_lat_a))atan_b = atan(rp / re * tan(rad_lat_b))tmp = acos(sin(atan_a) * sin(atan_b) + cos(atan_a) * cos(atan_b) * cos(rad_lon_a - rad_lon_b))if tmp == 0:return 0c1 = (sin(tmp) - tmp) * (sin(atan_a) + sin(atan_b)) ** 2 / cos(tmp / 2) ** 2c2 = (sin(tmp) + tmp) * (sin(atan_a) - sin(atan_b)) ** 2 / sin(tmp / 2) ** 2dr = oblateness / 8 * (c1 - c2)distance = re * (tmp + dr)return distance

根据经纬度计算两点之间的道路距离和行车时间

在调用百度地图API的时候需要用到API KEY作为密钥,每个key每天有使用次数的限制,所以我们需要通过收集许多keys来保证爬取过程的流畅和成功率。

ak_pool = ['k936lbWYFPwG1LEoKb9faZ8MEizFwh60',
'jBSeo7Mu3M8c1YGRPwegojz6G77K1XQo',
'0Acp9mZxe08BaGRt51cN3XAl4qCjEsrG',
...]
def getDistAndTime(var):"""The input var is a list contains both latitude and longitude of new and old places. Try different AK to catch the information. If AKs run out, return 'No AK', 'No AK' to represent that all today's opportunities are exhausted. If there's some wrong happened when requesting, then return 'wrong request', 'wrong request'. To deal with these invalid returns, we can have a try in another time."""s = requests.session()s.keep_alive = False  # 关闭多余连接requests.adapters.DEFAULT_RETRIES = 5  # 增加重连次数i = 0for i in range(len(ak_pool)):ak = ak_pool[i]try:url_drive = r"http://api.map.baidu.com/direction/v2/driving?output=json&origin={0},{1}&destination={2},{3}&ak={4}".format(var[0], var[1], var[2], var[3], ak)result_drive = json.loads(urlopen(url_drive).read())  # json转dictstatus_drive = result_drive['status']if status_drive == 0:  # 状态码为0:无异常distance_drive = result_drive['result']['routes'][0]['distance']  # 里程(米)timesec_drive = result_drive['result']['routes'][0]['duration']  # 耗时(秒)return distance_drive, timesec_driveexcept:time.sleep(5)return 'wrong request', 'wrong request'return 'No AK', 'No AK'

多进程

variables = zip(new_lat, new_long, old_lat, old_long)pool1 = Pool(10)  # 设置进程数
newToOldDis, newToOldTime = [], []
for result1, result2 in tqdm(pool1.imap(getWorkRoad, variables), total=1000):  # 加入进度条查看进度newToOldDis.append(result1)newToOldTime.append(result2)
pool1.close()
pool1.join()

运行中

结果展示

id,new_lat,new_long,work_lat,work_long,current_lat,current_long,newToWork_Distance,curToWork_Distance,newToWork_RoadDis,curToWork_RoadDis,newToWork_TimeByCar,curwToWork_TimeByCar

ID New_Latitude New_Longitude Old_Latitude Old_Longitude Straight_Dist(km) Road_Dist(m) Road_Time(s)
68753 40.062156677246094 116.3487548828125 39.980587 116.33853 8.545381076149896 13183 494
68754 39.8731803894043 116.4880599975586 39.908627 116.31234 15.497297749814635 19629 736

问题收集

进度条卡住。导致整个问题的原因比较多,我在排除了自身算法问题之后发现应该是爬取网页时,因为一直获取不到信息,而连接一直卡住,不能向前。
解决方案:设置网页响应时间限制。

参考文献

使用百度地图API计算两点直线距离、道路距离和行车时间相关推荐

  1. 使用百度地图api搜索两点位置、连线、计算距离、ip定位

    欢迎大家点一个关注,支持我的原创文章,谢谢! 正文 现在在企业做web项目时,偶尔会用到地图功能,而当前最流行的无疑是百度地图了,百度地图API为应用开发者提供了强大的功能,以下就介绍关于本人在做项目 ...

  2. 基于百度地图API计算任意两点间的出行距离

    文章目录 前言 使用步骤 1.导入相关包 2.计算小汽车距离 3.计算骑行距离 4.创建主函数 总结 前言 为了方便自己以后查找代码,也不想让自己的桌面变得凌乱不堪,所以将把自己之前的代码保存到这里面 ...

  3. 百度地图API计算俩点距离

    百度地图提供了获取经度跟维度的方法: new BMap.Point(poi.point.lng, poi.point.lat) 1,首先得引入百度地图的js文件 2.这样就可以调用其中的方法了,接着在 ...

  4. 百度地图API关于两点之间连接直线上的所有点

    最近项目用到百度地图,由于司机错误使用导致上传的GPS点天少,两点之间的距离太长没有GPS点,现做了一个小算法来解决此问题(地图视为平面图形)代码如下. //每1000米算作一个点 var point ...

  5. Python 全栈系列106 -调用百度地图api计算两点间距离和行车时间

    说明 百度地图的api还是蛮大方的,反正个人是肯定够用的.没想到还有天气接口,以后也可以玩一玩.本篇实现计算两个地址间的距离. 内容 1 地址转为经纬度 使用这个接口进行地址转换坐标. 第一次提交报A ...

  6. Python调用百度地图api获取起点终点路线规划距离和预估时长

    现有起点和终点坐标值(经纬度lng.lat),目的是通过百度地图开发者平台的路线规划功能获取起点终点路线规划距离和预估时长,百度地图开发者平台路线规划使用说明网址为:http://lbsyun.bai ...

  7. 百度地图java计算2个坐标建距离_Java开发之百度地图2 :计算两地之间的距离

    package com.***********.util; import java.awt.geom.Point2D; /** * 百度工具类 * * @author qyx * */ public ...

  8. 高德地图相关api使用计算两点地理坐标之间的距离

    利用腾讯地图api&计算两点地理坐标之间的距离 $key = 'key参数'; //腾讯地图开发自己申请 $mode = 'driving'; //driving(驾车).walking(步行 ...

  9. 基于百度地图API的交通可达性分析python

    文章目录 一.交通可达性是什么? 二.计算步骤 1.引入库 2.调用百度API进行两点之间的路径查询 3.输入待计算的文件和保存结果文件路径 4.读取文件并进行时间和距离计算 5.代码总览 总结 一. ...

最新文章

  1. 扩展筛选LightOj 1054 Efficient Pseudo Code
  2. [链接]C++和Python版本的委托
  3. Powered Addition CodeForces - 1339C(位运算)
  4. ECCV2018 论文简析 Oral_1
  5. Nginx使用教程(七):使用Nginx缓存之proxy cache
  6. 使用selenium webdriver进行元素定位
  7. React ant design UI 禁用 启用 switch 开关 加弹窗确认提示 代码片段
  8. gtk/gtk.h 没有那个文件或目录
  9. 第3.4节 通过GPIB控制频谱仪
  10. Excel--indirect函数(间接引用)
  11. VideoView源码分析
  12. 全国计算机考试 二级 office pdf,全国计算机等级考试二级MSoffice讲义看看[整理].pdf...
  13. 【Python】Scrapy爬虫介绍requests爬虫移植到Scrapy爬虫
  14. R绘图| Kaplan-Meier曲线及美化
  15. wincc实现手机APP远程监控
  16. 量子计算机论坛,IBM量子计算机取得重大突破
  17. 计算机等级证书中级是个什么级别呢
  18. 关于PS课程中色彩调整部分的学习总结
  19. 面试记录-苏宁(客服研发中心)
  20. WPF-MVVM详解

热门文章

  1. 云计算机能否移动网络,移动云计算能实现吗?
  2. 网站建设:外贸网站的制作步骤
  3. TI ZLL wiki
  4. 怎么把短视频做成gif图?短视频生成gif的步骤
  5. STM32F429与陶晶驰串口屏数据传输(1)
  6. 文件系统XFS与EXT4的区别
  7. Vue 3.0双向绑定原理的实现
  8. Android切换语言
  9. Mr.Nobody观后感
  10. macbook2016款学计算机,捡垃圾之路 篇一:Macbook Pro 2016款,2020年捡垃圾心得。