爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 11948|回复: 1

[经验总结] python之GPS和高德地图距离计算

[复制链接]

新浪微博达人勋

发表于 2020-6-29 17:30:03 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
1、困惑复现


今天利用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()函数求距离可精确到米,符合要求,以后就用它了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2020-6-30 09:45:14 | 显示全部楼层
对比学习---《IDL之调用高德地图API计算地图坐标距离》:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=96379
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表