| 
 
	积分3625贡献 精华在线时间 小时注册时间2014-10-21最后登录1970-1-1 
 | 
 
| 
1、困惑复现
x
登录后查看更多精彩内容~您需要 登录 才可以下载或查看,没有帐号?立即注册 
  
 
 今天利用python和高德地图API对比计算2坐标的距离,发现相差很大,这种异常以前我也遇到过,
 以前,我在某点周边500m内检索餐饮企业,获得其坐标,再计算这些餐饮企业与某点的距离时,发现居然大于500m!
 
 
 2、迷雾散开
 
 
 经反复试验、思考,逐渐收缩包围圈,最后终于发现---是距离类型搞错了。
 高德地图给出的距离有3种:
 1、直线距离:type=0
 2、驾车距离:type=1
 3、步行距离:type=3
 显然我要的是直线距离,但默认的是驾车距离!问题就在这。
 
 
 3、代码精讲
 
 
 from geopy.distance import geodesic  #计算距离的包
 import requests  #获取网页响应的包
 import json  #解析json格式的包
 web_k='XXXXXXXXXXXXXXXXX'  #我的高德地图web开发K码,可免费申请,立等秒取
 #以前我把经度写为lon,以后我使用通用写法:经度lng,纬度lat
 
 
 lat1=30.28718#待计算的2个点
 lng1=120.12813
 lat2=30.28738
 lng2=120.12803
 
 
 distance=geodesic((lat1,lng1),(lat2,lng2)).m#python提供的距离计算函数
 print('GPS坐标2点直线距离=','%.2f' % distance,'m') #输出直线距离
 
 
 #通过高德API转换坐标:
 url='https://restapi.amap.com/v3/assistant/coordinate/convert?key='+\
 web_k+'&locations='+str(lng1)+','+str(lat1)+'|'+\
 str(lng2)+','+str(lat2)+'&coordsys=gps'
 x=json.loads(requests.get(url).text)['locations']
 cut=x.split(';')
 alng1=cut[0].split(',')[0]#前面加个a代表是amap高德
 alat1=cut[0].split(',')[1]
 alng2=cut[1].split(',')[0]
 alat2=cut[1].split(',')[1]
 
 
 #通过高德API计算距离:
 url='https://restapi.amap.com/v3/distance?'+\
 'origins='+str(alng1)+','+str(alat1)+\
 '&destination='+str(alng2)+','+str(alat2)+\
 '&output=json&key='+web_k+'&type=0'
 #直线距离:type=0;驾车距离:type=1;步行距离:type=3
 
 
 distance=json.loads(requests.get(url).text)['results'][0]['distance']
 print('高德坐标2点直线距离=',distance,'m')#高德地图返回的距离是整数
 
 
 #输出:
 #GPS坐标2点直线距离= 24.17 m
 #高德坐标2点直线距离= 24 m
 
 可见,python的geodesic()函数求距离可精确到米,符合要求,以后就用它了
 
 | 
 |