=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)
参考链接:
- 什么叫地理经度纬度?怎么看?如何划分和定位
- python利用地图两个点的经纬度计算两点间距离
- Python计算地图上两点经纬度间的距离
- I. 根据经纬度坐标计算两点间距离
- Getting distance between two points based on latitude/longitude
- Calculating the Distance Between Two GPS Coordinates with Python (Haversine Formula)
- Calculate distance between latitude longitude pairs with Python
=END=
《 “Python中如何计算2个坐标之间的距离” 》 有 7 条评论
“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月;
怕用户位置被泄露,可以在手机里把位置定位关闭,位置定位都没有开启,就不会出现这些问题。
`
南京鼓楼警方破获国内首例技术定位侵犯公民个人信息案,涉恶涉黑团伙也用它
https://mp.weixin.qq.com/s/26MRSUxDwvztxrE4klTBRg
`
年满30岁的吴某是江西上饶人,计算机专业毕业后做起了技术员。他喜欢黑客技术,一个偶然机会看到网上有人卖手机聊天工具定位软件,但使用功能很一般,就想自己开发定位精度更高的。没多久,他破解了一款手机聊天程序的位置信息防护系统,捣鼓出一款新的定位软件,并命名为“APP神探”,通过QQ群、微信群、聊天室等网上渠道销售。
“用户要先在该APP软件上注册成为会员,充值后才能使用定位功能。如果对方在线,定位一次只要1元;如果对方不在线,定位一次要10元。他后来还开发出针对多款主流聊天工具的定位功能,定位一次100元。”杨桂年说。(第一个APP指的是陌陌,100的那个指的是QQ)
这款APP定位精度多高?南京鼓楼网安大队做了多次侦查实验:民警在盐仓桥附近的家乐福超市打开聊天工具,与之相距数公里的同事用该软件进行定位,精确位置只相差20—50米。
`
手机移动设备究竟是怎样只利用Wi-Fi来定位的?
https://mp.weixin.qq.com/s/xwEmx3kSoud91mT-BM20Vw
微信查看附近的人通过三角定位可以准确定位位置吗?
https://www.zhihu.com/question/21295972
Wi-Fi 定位的原理是什么?
https://www.zhihu.com/question/20593603
什么是三角定位法?
https://www.zhihu.com/question/22040578/answer/35925671
从手机定位谈谈科技
https://mp.weixin.qq.com/s/jeGzj_Cmyx1DpuqO1EtoXQ
`
一、手机是怎么定位的?
手机定位一般有三个方法。
方法1:基于你当前所接触的WIFI热点,如果这个WIFI热点是公开可查询的热点,存在地址信息对应的。那么你的位置可以锁定在该位置的一定半径内。
通过WIFI定位,你的位置只能被确认在一定半径的范围内,并不能精确识别你的位置,速度。
方法2:基于移动基站定位,你的手机信号是通过移动基站交互的。移动基站的地理位置是清晰明确的,当你手机可以获得多个基站的信号,并且不同基站信号存在不同的强弱衰减,那么可以根据这几个基站的位置和你信号衰减的情况,大致获得你的当前位置范围,以及大致的移动速度,如果你处于具有一定速度的交通工具之内的话。
方法3:最精准的,是通过卫星定位,你看,虽然WIFI,基站,卫星,具体是从近到远;但定位准确度确实越来越精确。
那么卫星定位,其实也包括不同的选择,以前是GPS一统天下,大家一提卫星定位就是GPS,但其实现在有很多家不同的卫星定位系统,GPS依然是全球规模最大的,此外欧洲的伽利略,中国的北斗系统等等。
实际上很多国产智能手机和卫星导航的芯片已经支持北斗系统,用户看到的标志可能还是GPS,但提供定位服务的,实际上可能是来自于不同的系统。
那么手机会自动根据信号强弱选择合适的系统进行定位导航,通常情况下,用户无需自己选择用哪个卫星系统。所以你就不用问我怎么切换到北斗系统啊,手机会在它认为合适的情况下用到的。
二、卫星定位的原理
实际上,导航卫星的工作极为简单,就是广播,广播自己的位置,自己的时间。每个所谓GPS芯片(习惯这么叫,现在很多已经整合了多个卫星系统)就是接受这些信号,然后处理。
怎么处理呢?你如果知道它信号发出的时间,知道自己接受的时间,乘以传播速度,也就是光速,就知道自己和卫星的距离了对不对。当你的手机可以获得多个卫星信号的时候,比如三颗及以上,由于你知道卫星当前的位置数据,就可以通过数学公式,算出自己的所在位置。
但是,且慢,这里有个严峻的问题,因为光速太大,需要极高的时间精确度,卫星上有原子钟,可以提供极为精确的时间,但你手机上没有。这时候,就需要把时间也当作变量,所以,需要四颗以上的卫星,才能精准定位你的位置。
感谢科技的力量,现在的卫星定位极为精准,可以精确到米,从而让驾驶导航成为可能,实际上军方信号未解密,可以有更好的精确度。
这里其实还隐藏了一个问题,就是,由于极高的时间精确度,那么卫星相对于地球是高速运动的,基于相对论,我们知道不同速度下的时间是不同的,在这样的精确度要求下,这个不一致也会很致命,所以,相对论公式被用于修正这一误差。
所以真正的原理是这样的,卫星广播自己的时间(原子钟时间,极为精确到小数点后面n多位),当前位置。手机上的定位芯片获得多个卫星的信息,然后通过相对论公式修正时间误差,然后基于四颗或更多卫星的信息,测算自己的位置。这就是我说的,如此普及而成本低廉的定位芯片,其实技术含量还是蛮高的。
那么这里还有一个冷知识,卫星还负责给你准确的时间,所以你看现在很多智能手机没有调时间的选项,因为完全不需要,只要有卫星信号,时间一定是准确的。再根据你的地理位置判定你所处的时区,给予你当地的时间。
`
web网站如何获取用户的地理位置
https://www.cnblogs.com/Renyi-Fan/p/9223370.html
https://www.w3school.com.cn/tiy/t.asp?f=html5_geolocation_watchposition
[隐私安全]PC端网页版百度地图是如何定位你的真实地址的
https://segmentfault.com/p/1210000007775009
https://blog.catscarlet.com/201612122637.html
地址批量转换经纬度的工具
https://zhuanlan.zhihu.com/p/33274826
https://www.piliang.tech/reverse-geocoding
是什么能让 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值。
`