Python调用百度地图API,通过经纬度信息计算两地距离 前期工作: 首先注册百度账号,然后在打开百度开放平台,点击控制台,进入控制台页面,然后激活个人开发者账号,这样就可以使用该平台。 在控制台页面,点击应用管理——>我的应用——>创建应用,创建一个应用。 输入应用名称,选中地点检索选项,在IP白名单中输入0.0.0.0/0,点击提交即可创建应用. 提交完成后在我的应用中即可看到所创建的应用,记住应用的AK值,使用该值调用百度的API. 应用创建完成,就可以使用了,先来测试以下.
在地点检索服务文档中,可以看到该接口的使用方式,假设输入链接 http://api.map.baidu.com/place/v2/search?query=咖啡馆®ion=北京&output=json&ak=您的ak,(记得将ak的值改成自己应用中AK值). 即可看到北京市所检索的咖啡馆地址信息,包括该地址的经纬度. 然后就可以拿经纬度信息计算两地的距离了.
编码实现: 首先根据地址获取该地址的经纬度,通过url获取即可(记得将key值改为自己的AK值).
from math import radians, cos, sin, asin, sqrt import requests import sys # 自己的AK值=你在百度开发者开放平台申请的AK # 依据地址获取经纬度 def Address_to_JWD(content): """ :param content: 地址信息 :return: 经纬度数据 (例:[经度,维度]) """ try: url = "http://api.map.baidu.com/geocoder?address=" + str(content) + "&output=json&key= 自己的AK值" response = requests.get(url) answer = response.json() # print(answer) addr = [answer['result']['location']['lng'], answer['result']['location']['lat']] return addr except: return {'code': 'Error', 'Info': '百度key失效或到期/地址信息错误', 'addr': str(content)}然后根据两地经纬度计算两地距离.
# 依据两个经纬度计算之前距离(单位/公里) def get_address_distance(lon1,lat1,lon2,lat2): """ 例如: lon1 = 117.804833 经度 lat1 = 39.165618 纬度 lon2 = 104.622000 lat2 = 28.765000 :return 计算距离 """ lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) # haversine公式 dlon = lon2 - lon1 dlat = lat2 - lat1 a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 c = 2 * asin(sqrt(a)) r = 6371 # 地球平均半径,单位为公里 #返回结果除以1000以公里为单位保留两位小数 dis = round((c * r * 1000)/1000, 2) return dis最后传参调用即可.完整代码如下:
from math import radians, cos, sin, asin, sqrt import requests import sys # key值=你在百度开发者开放平台申请的AK # 依据地址获取经纬度 def Address_to_JWD(content): """ :param content: 地址信息 :return: 经纬度数据 (例:[经度,维度]) """ try: url = "http://api.map.baidu.com/geocoder?address=" + str(content) + "&output=json&key=6Floz8UeLHrAqiRElu3afC6hRX9RWKLA" response = requests.get(url) answer = response.json() # print(answer) addr = [answer['result']['location']['lng'], answer['result']['location']['lat']] return addr except: return {'code': 'Error', 'Info': '百度key失效或到期/地址信息错误', 'addr': str(content)} # 依据两个经纬度计算之前距离(单位/公里) def get_address_distance(lon1,lat1,lon2,lat2): """ 例如: lon1 = 117.804833 经度 lat1 = 39.165618 纬度 lon2 = 104.622000 lat2 = 28.765000 :return 计算距离 """ lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) # haversine公式 dlon = lon2 - lon1 dlat = lat2 - lat1 a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 c = 2 * asin(sqrt(a)) r = 6371 # 地球平均半径,单位为公里 #返回结果除以1000以公里为单位保留两位小数 dis = round((c * r * 1000)/1000, 2) return dis if __name__ == '__main__': content = input("请输入地址信息:") coordinates = Address_to_JWD(content) x = coordinates[0] #得到列表中的经度值 y = coordinates[1] #得到列表中的纬度值 instance = get_address_distance(117.804833,39.165618,x,y) #中新天津生态城 print(content + "到中新天津生态城距离为:" + str(instance) + "公里")结果如下: 本人将一个地址写死了,所以程序运行的是从输入地址到给定地址的距离,如果根据两个地址求距离,可以稍微修改以下代码. 说明:这个距离是根据两地的经纬度进行计算的,所以应该是两地的直线距离,跟百度地图上规划路线的路程距离肯定不一样的.