python调用百度地图API得到两地经纬度计算直线距离

程序简述

程序封装了两个接口
一是调用百度地图的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,看一下完整的效果

猜你喜欢

转载自www.cnblogs.com/boom-meal/p/12368510.html