Python中如何计算2个坐标之间的距离


=Start=

缘由:

最近在分析一些日志,里面有涉及到经纬度以及相应的距离计算的问题,所以学习整理一下,方便以后参考。

正文:

参考解答:
1、经度、纬度、经纬度都分别是什么?

经纬度是经度与纬度的合称组成一个坐标系统又称为地理坐标系统,它是一种利用三度空间的球面来定义地球上的空间的球面坐标系统,能够标示地球上的任何一个位置。

经纬度 coordinates
经度 longitude #为方便记忆,可以认为long的是经度
纬度 latitude

地球上所有的经线都一样长,并汇集到两极。通过英国格林威治天文台的经线为零度,称作本初子午线。由此向东、向西各分成180°,分别称东经和西经。东、西经180°线是重合在一起的。

在地球表面与经线直交的线叫纬线,把地球分成南北两半,到南极和北极距离相等的纬线就是赤道。所有的纬线都呈东西方向、与赤道平行,但长短不等,愈往极地愈短。

赤道的纬度是0°,南北极是90°,赤道以北叫北纬,赤道以南叫南纬。习惯上,人们还把纬度0~30°叫低纬,30~60°叫中纬,60~90°叫高纬。南、北纬23.5°,分别被称为南、北回归线。

经度:东经为正数,西经为负数。
纬度:北纬为正数,南纬为负数。

2、如何取地图上某个点的坐标?

经纬度 -> 地址
http://www.gpsspg.com/maps.htm

地址 -> 经纬度
#百度拾取坐标系统
#高德地图获取鼠标点击经纬度
#腾讯地图坐标拾取器

3、坐标之间的距离该如何计算?

地球上的位置现在都用经纬度来进行精确标注,又因为地球是一个球体,两点之间的距离不能简单的用平面上的方法来算,要考虑球面的因素,而常用的是Haversine公式,这里公式细节不细说,直接放出用Python计算的方法,方便参考和使用。

注:虽然叫「经纬度」但一般坐标里面是把「纬度放在前面」,即:「坐标 = (纬度,经度)」。且对于国内的坐标情况,一般是纬度数值要小于经度的数值。

import math

def distance(origin, destination):
    lat1, lon1 = origin
    lat2, lon2 = destination
    radius = 6371 # km

    dlat = math.radians(lat2-lat1)
    dlon = math.radians(lon2-lon1)
    a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
        * math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
    d = radius * c

    return d

# 38.35252313201552 (km为单位)
print distance((22.599578, 113.973129), (22.6986848, 114.3311032))

from math import sin, asin, cos, radians, fabs, sqrt

def haversine(lon1, lat1, lon2, lat2): # 经度1,纬度1,经度2,纬度2 (十进制度数)
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees)
    """
    # 将十进制度数转化为弧度
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
 
    # haversine公式
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    r = 6371 # 地球平均半径,单位为公里
    return c * r * 1000

# 38352.523132 (m为单位)
print haversine(113.973129, 22.599578, 114.3311032, 22.6986848)

 

参考链接:

=END=


《 “Python中如何计算2个坐标之间的距离” 》 有 7 条评论

  1. “APP神探”可定位陌陌用户位置,查在线ID仅需1元/次
    https://www.thepaper.cn/newsDetail_forward_2322296
    `
    陌陌是一款基于地理位置的移动社交工具,在用户界面中,每个好友或是周围的人都会显示与用户之间的距离。在最新版本的陌陌软件上,这个距离精确到了小数点后两位。对于用户而言,距离可能意味着心理上的接受程度,也有可能仅仅就是一个数字。但是,在复杂的网络世界,每当用户登录一次陌陌,就相当于在网络世界公布了自己现实世界的真实地理位置。你是否想过,如果这个信息一旦被泄露,会不会对现实生活造成影响。南京就有一些喜欢玩陌陌的用户,就因为陌陌这个软件“栽了”。

    有一款软件名叫“APP神探”,可以查找陌陌使用者的位置(基本上过个一两个小时就定位一次)。

    有一段使用经验的“圈内人士”告诉记者,本来APP神探这款软件可查询陌陌和QQ两款软件,可是QQ在很早之前已经通过更新,屏蔽了APP神探的查询功能,因此目前,APP神探也只能查询基于位置服务的陌陌这款软件。准确地说,可以查询陌陌用户最近一次登录陌陌时的位置。查询在线的陌陌ID,只需1元/次,查询隐身的陌陌ID则是10元/次。之前查询QQ位置需要100元/次。

    谈起该软件,吴某告诉民警,他是利用三角定位算法这一概念。原来,陌陌是一款基于位置的社交软件,使用该软件用户提供位置信息成了前置条件。
    所谓三角定位其实是一种数学原理,是利用2台或者2台以上的探测器在不同位置探测目标方位,然后运用三角几何原理确定目标的位置和距离。吴某称,他事先预设了另外三个坐标的位置,用户提交数据后,可以对查询用户和事先预设的三个坐标位置进行比对,通过一系列复杂的算法,从而精确算出用户的所在位置。
    `

    拿3月份的事来说,“APP神探”能查出陌陌用户位置过时了吗?
    https://zhuanlan.zhihu.com/p/41379542
    `
    用“APP神探”来寻找陌陌用户位置的事都发生在2018年3月;
    怕用户位置被泄露,可以在手机里把位置定位关闭,位置定位都没有开启,就不会出现这些问题。
    `

  2. 南京鼓楼警方破获国内首例技术定位侵犯公民个人信息案,涉恶涉黑团伙也用它
    https://mp.weixin.qq.com/s/26MRSUxDwvztxrE4klTBRg
    `
    年满30岁的吴某是江西上饶人,计算机专业毕业后做起了技术员。他喜欢黑客技术,一个偶然机会看到网上有人卖手机聊天工具定位软件,但使用功能很一般,就想自己开发定位精度更高的。没多久,他破解了一款手机聊天程序的位置信息防护系统,捣鼓出一款新的定位软件,并命名为“APP神探”,通过QQ群、微信群、聊天室等网上渠道销售。

    “用户要先在该APP软件上注册成为会员,充值后才能使用定位功能。如果对方在线,定位一次只要1元;如果对方不在线,定位一次要10元。他后来还开发出针对多款主流聊天工具的定位功能,定位一次100元。”杨桂年说。(第一个APP指的是陌陌,100的那个指的是QQ)

    这款APP定位精度多高?南京鼓楼网安大队做了多次侦查实验:民警在盐仓桥附近的家乐福超市打开聊天工具,与之相距数公里的同事用该软件进行定位,精确位置只相差20—50米。
    `

  3. 从手机定位谈谈科技
    https://mp.weixin.qq.com/s/jeGzj_Cmyx1DpuqO1EtoXQ
    `
    一、手机是怎么定位的?

    手机定位一般有三个方法。

    方法1:基于你当前所接触的WIFI热点,如果这个WIFI热点是公开可查询的热点,存在地址信息对应的。那么你的位置可以锁定在该位置的一定半径内。
    通过WIFI定位,你的位置只能被确认在一定半径的范围内,并不能精确识别你的位置,速度。

    方法2:基于移动基站定位,你的手机信号是通过移动基站交互的。移动基站的地理位置是清晰明确的,当你手机可以获得多个基站的信号,并且不同基站信号存在不同的强弱衰减,那么可以根据这几个基站的位置和你信号衰减的情况,大致获得你的当前位置范围,以及大致的移动速度,如果你处于具有一定速度的交通工具之内的话。

    方法3:最精准的,是通过卫星定位,你看,虽然WIFI,基站,卫星,具体是从近到远;但定位准确度确实越来越精确。

    那么卫星定位,其实也包括不同的选择,以前是GPS一统天下,大家一提卫星定位就是GPS,但其实现在有很多家不同的卫星定位系统,GPS依然是全球规模最大的,此外欧洲的伽利略,中国的北斗系统等等。

    实际上很多国产智能手机和卫星导航的芯片已经支持北斗系统,用户看到的标志可能还是GPS,但提供定位服务的,实际上可能是来自于不同的系统。

    那么手机会自动根据信号强弱选择合适的系统进行定位导航,通常情况下,用户无需自己选择用哪个卫星系统。所以你就不用问我怎么切换到北斗系统啊,手机会在它认为合适的情况下用到的。

    二、卫星定位的原理

    实际上,导航卫星的工作极为简单,就是广播,广播自己的位置,自己的时间。每个所谓GPS芯片(习惯这么叫,现在很多已经整合了多个卫星系统)就是接受这些信号,然后处理。

    怎么处理呢?你如果知道它信号发出的时间,知道自己接受的时间,乘以传播速度,也就是光速,就知道自己和卫星的距离了对不对。当你的手机可以获得多个卫星信号的时候,比如三颗及以上,由于你知道卫星当前的位置数据,就可以通过数学公式,算出自己的所在位置。

    但是,且慢,这里有个严峻的问题,因为光速太大,需要极高的时间精确度,卫星上有原子钟,可以提供极为精确的时间,但你手机上没有。这时候,就需要把时间也当作变量,所以,需要四颗以上的卫星,才能精准定位你的位置。

    感谢科技的力量,现在的卫星定位极为精准,可以精确到米,从而让驾驶导航成为可能,实际上军方信号未解密,可以有更好的精确度。

    这里其实还隐藏了一个问题,就是,由于极高的时间精确度,那么卫星相对于地球是高速运动的,基于相对论,我们知道不同速度下的时间是不同的,在这样的精确度要求下,这个不一致也会很致命,所以,相对论公式被用于修正这一误差。

    所以真正的原理是这样的,卫星广播自己的时间(原子钟时间,极为精确到小数点后面n多位),当前位置。手机上的定位芯片获得多个卫星的信息,然后通过相对论公式修正时间误差,然后基于四颗或更多卫星的信息,测算自己的位置。这就是我说的,如此普及而成本低廉的定位芯片,其实技术含量还是蛮高的。

    那么这里还有一个冷知识,卫星还负责给你准确的时间,所以你看现在很多智能手机没有调时间的选项,因为完全不需要,只要有卫星信号,时间一定是准确的。再根据你的地理位置判定你所处的时区,给予你当地的时间。
    `

  4. 是什么能让 APP 快速精准定位到我们的位置?
    https://mp.weixin.qq.com/s/KqCxb24FoIge9AropiSzXg
    `
    本文包含以下内容,阅读完需要约10分钟:

    * 我们日常生活中遇到哪些定位的场景
    * 简单复习一下经纬度
    * geohash原理解析
    * geohash存在的边界问题
    * 如何解决边界问题
    * 计算两点距离的计算
    * geohash 在redis中的实现

    # 简单复习一下经纬度
    以赤道和本初子午线为界,将地球分为经度和纬度。赤道是在0度,本初子午线也在0度。以赤道作为经度X横坐标,以本初子午线作为纬度 Y 竖坐标。

    其中,从本初子午线向东划分180度称为东经,用”E”表示:(0, 180];向西划分180度为西经,用“W”表示:[-180, 0)

    以赤道为0度,向南北各分出90度,南北极的读数均是90度,北纬用“N”表示 :(0, 90] ,南纬用“S”表示: [-90, 0)

    # geohash原理解析
    geohash通过以下步骤,实现了将一个经纬度数子串,转换成1个hash字符串。
    1. 指定一个位置的经纬度坐标值。
    2. 根据十字坐标图和二分法,将纬度和经度划分成1和0的二进制数字串。
    3. 按照“偶数位放经度,奇数位放纬度”算法,合并经度和纬度这2个二进制数字串。
    4. 合并后的二进制数字串,按照从前往后,每隔5位,换算成十进制数字,最后不足5位的用0补齐。
    5. 十进制数字,对应base32字符串算法的所在位置,一一匹配,得到了最后的字符串结果。
    6. 按照进度划分截取,得到最终的geohash值。
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注