程序简述
程序封装了两个接口
一是调用百度地图的API来获得地点的经纬度
二是调用python的geopy模块来计算两个经纬度的直线距离
程序输入:地点名称
程序输出:经纬度、直线距离
百度地图API申请过程(懒得申请可以直接点击上面的下载地址,里面有我个人的应用)
图1,进入网站http://lbsyun.baidu.com/apiconsole/key登录后进入控制台创建应用,点击应用可以看到应用的AK和SK码,后面程序要用
程序/数据集下载
核心代码解析
getCoordinate函数调用百度地图API,输入为地点名,输出为经纬度
def getCoordinate(address):
'''
输入地址输出坐标(经度,维度)
address:城市名
'''
#产生sn码
queryStr = "/geocoder/v2/?address="+address+'&output=json&ak='+ak
encodedStr = urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
rawStr = encodedStr+sk
sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())
#生成url
url = urllib.parse.quote("http://api.map.baidu.com"+queryStr+"&sn="+sn,safe="/:=&?#+!$,;'@()*[]")
result = requests.get(url).json()
coordinate = (result['result']['location']['lng'],result['result']['location']['lat'])
return coordinate
图2,可以看到该接口的调用效果
calDistance函数是调用python的geopy模块对两个地区进行直线距离计算,需要注意的是geopy模块的输入是纬度在前,经度在后
def calDistance(place1,place2):
'''
输入两个地点名,输出直线距离(米)
place1:地点1
place2:地点2
'''
coor1 = getCoordinate(place1)#经纬度1
coor2 = getCoordinate(place2)#经纬度2
#这里输入纬度在前,经度在后,所以做一下反转
distance = geodesic(coor1[::-1],coor2[::-1]).m#距离(米)
return distance
图3,看一下调用的效果,这里承接上一步计算秦皇岛和北京的距离
完整代码、运行效果(放入AK和SK码后可直接运行)
# -*- coding: utf-8 -*-
from geopy.distance import geodesic
import urllib.parse
import hashlib
import requests
#如果你懒得申请或不会申请,点击博客上面的下载按钮,那个代码提供了我的个人应用
ak = ""#百度地图ak码
sk = ""#百度地图sk码
def getCoordinate(address):
'''
输入地址输出坐标(经度,维度)
address:城市名
'''
#产生sn码
queryStr = "/geocoder/v2/?address="+address+'&output=json&ak='+ak
encodedStr = urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
rawStr = encodedStr+sk
sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())
#生成url
url = urllib.parse.quote("http://api.map.baidu.com"+queryStr+"&sn="+sn,safe="/:=&?#+!$,;'@()*[]")
result = requests.get(url).json()
coordinate = (result['result']['location']['lng'],result['result']['location']['lat'])
return coordinate
def calDistance(place1,place2):
'''
输入两个地点名,输出直线距离(米)
place1:地点1
place2:地点2
'''
coor1 = getCoordinate(place1)#经纬度1
coor2 = getCoordinate(place2)#经纬度2
#这里输入纬度在前,经度在后,所以做一下反转
distance = geodesic(coor1[::-1],coor2[::-1]).m#距离(米)
return distance
if __name__ == "__main__":
p1 = "北京市"
r1 = getCoordinate(p1)
print("%s经纬度"%p1,r1)
p2 = "秦皇岛市"
r2 = getCoordinate(p2)
print("%s经纬度"%p2,r2)
distance = calDistance(p1,p2)
print("两地距离约为%d米"%distance)
图4,看一下完整的效果