使用地图的API获取目标的经纬度以及获取两地间的距离

一般百度地图、高德地图等都会提供API接口给我们,我们要使用其地图服务需要注册账号申请个密钥。

举例:

百度地图开放平台的网址:百度地图开放平台

注册后去创建个应用申请密钥:使用地图的API获取目标的经纬度以及获取两地间的距离_第1张图片

图片中红框中的AK就是百度地图API的密钥(该AK就是我下面代码中调用百度地图API时使用的ak)

可以在这个网站找到对应功能API的用法:使用地图的API获取目标的经纬度以及获取两地间的距离_第2张图片


最后,附上我跑的有关地图python代码:

# -- coding: UTF-8 --

'''
使用地图的API获取经纬度及计算两地之间距离
author:stephen
'''
import urllib, urllib2, json
from urllib2 import urlopen

def getGoogleMapForLngLat(address):
	'使用用Google Map查询地址的经纬度'
	addressUrl = "http://maps.googleapis.com/maps/api/geocode/json?address=" + address
    #中文url需要转码才能识别
	addressUrlQuote = urllib2.quote(addressUrl, ':?=/')
	response = urlopen(addressUrlQuote).read().decode('utf-8')
	responseJson = json.loads(response)
	lat = responseJson.get('results')[0]['geometry']['location']['lat'] #纬度
	lng = responseJson.get('results')[0]['geometry']['location']['lng'] #经度
	print(address + '的经纬度是: %f, %f'  %(lng, lat))
	return [lat, lng]
#getGoogleMapForLngLat('广东省佛山市') #谷歌地图对应地址的经纬度

def getGaoDeForLngLat(address):
	'使用高德地图API'
	apiStem = 'http://restapi.amap.com/v3/geocode/geo?'
	params = {}
	params['address'] = address
	params['output'] = 'JSON'
	params['key'] = 'a5717efe281fea54c2a03cc00310ae08'
	url_params = urllib.urlencode(params)
	RealAdd = apiStem + url_params

	abc = urllib2.urlopen(RealAdd)
	test = json.loads(abc.read())  # json.loads()  :把json字符串解码转换成Python对象
	#result = json.dumps(test, ensure_ascii=False, indent=1)  # json.dumps():  把Python对象转换成json字符串
	result = test['geocodes'][0]['location'].encode('utf8').split(',')
	return float(result[0]), float(result[1])
#print getGaoDeForLngLat('广东省佛山市')


#非百度坐标(目前支持GPS设备获取的坐标、google地图坐标、soso地图坐标、amap地图坐标、mapbar地图坐标)转换成百度地图中使用的坐标
def getOthercoordToBaiducoord(coords):
	apiStem = 'http://api.map.baidu.com/geoconv/v1/?'
	params = {}
	params['coords'] = coords
	params['ak'] = '93cca2ceb74ea634c606060608115c95' #申请的密钥
	url_params = urllib.urlencode(params)
	RealAdd = apiStem + url_params

	abc = urllib2.urlopen(RealAdd)
	result = json.loads(abc.read())
	return result['result'][0]['x'], result['result'][0]['y']
#print getOthercoordToBaiducoord(getGaoDeForLngLat('广东省佛山市'))

from math import *
def calcDistance(Lat_A, Lng_A, Lat_B, Lng_B):
	'输入两点的经纬度计算两者距离'
	ra = 6378.140  # 赤道半径 (km)
	rb = 6356.755  # 极半径 (km)
	flatten = (ra - rb) / ra  # 地球扁率
	rad_lat_A = radians(Lat_A)
	rad_lng_A = radians(Lng_A)
	rad_lat_B = radians(Lat_B)
	rad_lng_B = radians(Lng_B)
	pA = atan(rb / ra * tan(rad_lat_A))
	pB = atan(rb / ra * tan(rad_lat_B))
	xx = acos(sin(pA) * sin(pB) + cos(pA) * cos(pB) * cos(rad_lng_A - rad_lng_B))
	c1 = (sin(xx) - xx) * (sin(pA) + sin(pB)) ** 2 / cos(xx / 2) ** 2
	c2 = (sin(xx) + xx) * (sin(pA) - sin(pB)) ** 2 / sin(xx / 2) ** 2
	dr = flatten / 8 * (c1 - c2)
	distance = ra * (xx + dr)
	return distance

Lng_A, Lat_A = getGaoDeForLngLat('广东省佛山市')
Lng_B, Lat_B = getGaoDeForLngLat('广东省广州市')
distance = calcDistance(Lat_A, Lng_A, Lat_B, Lng_B)
print('(Lat_A, Lng_A)=({0:10.3f},{1:10.3f})'.format(Lat_A, Lng_A))
print('(Lat_B, Lng_B)=({0:10.3f},{1:10.3f})'.format(Lat_B, Lng_B))
print('Distance={0:10.3f} km'.format(distance))

两地距离的运行结果为:

(Lat_A, Lng_A)=(    23.022,   113.121)
(Lat_B, Lng_B)=(    23.129,   113.264)
Distance=    18.889 km

你可能感兴趣的:(Python)