使用百度地图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. .sql文件如何执行_Excel如何运行可执行文件,别急,用过vba Shell函数的都知道
  2. .NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(下)...
  3. python面向窗体的开发_Python高级进阶#019 pyqt5菜单menu应用,新建多窗体
  4. 选中下拉列表显示全部数据_小白都能学会的多级下拉列表,让你的Excel效率提升百倍...
  5. Scrapy框架学习笔记 - 爬取腾讯招聘网数据
  6. python数据类型-列表练习
  7. lol韩服游戏内设置_LOL手游:灵药战队有多强?辅助国际服第六,AD堪比UZI
  8. maven 项目在 tomcat 中启动报错:Caused by: java.util.zip.ZipException: invalid LOC header (bad signature)...
  9. 13 Python函数进阶
  10. 我读过关于面试最好的一篇文章
  11. Java实现 蓝桥杯VIP 算法训练 调和数列
  12. js获取时分秒数据格式为YYYMMDDHHmm方法
  13. 西班牙知名导演:电影产业应与NFT及社区做结合
  14. 信息学奥赛一本通(c++):1413:确定进制
  15. 『精华』技术大牛养成指南,一篇不鸡汤的成功学实践
  16. Python入门习题大全——大号T恤
  17. 虚幻引擎发行版,Laby,jMonkeyEngine和更多开放游戏新闻
  18. H3C服务器带外默认账号和密码,H3C产品的默认密码是多少?
  19. php 表情 代码_PHP 大量QQ表情代码替换
  20. 数据库的完全依赖,部分依赖和传递依赖

热门文章

  1. 100亿级订单怎么调度,来一个大厂的极品方案
  2. C# 2015对Excel的操作
  3. Java热替换,不出现classcastException
  4. 《校园二手商品交易平台设计与实现》 开题报告
  5. 论文翻译-Text Recognition in the Wild: A Survey
  6. 创维酷开智慧屏P7065英寸4K电视机质量怎么样?
  7. 【CSS】1049- 深入了解::before 和 ::after 伪元素
  8. m6c2g核心板使用笔记
  9. 基于 spring boot 实现用户的增删改查
  10. [Qt5] QGraphics图形视图框架概述(Item、Scene和View)