一般百度地图、高德地图等都会提供API接口给我们,我们要使用其地图服务需要注册账号申请个密钥。
举例:
百度地图开放平台的网址:百度地图开放平台
图片中红框中的AK就是百度地图API的密钥(该AK就是我下面代码中调用百度地图API时使用的ak)
最后,附上我跑的有关地图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