成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

揭秘打車軟件,如何找到方圓 1km 以內的乘客

大數據 數據分析
用geohash那結果顯然是AB更近,但是實際上A與B的距離比AE、AC、AD都遠。這其實是一個邊緣性的問題........后續我會更新如何去避免這種問題的出現。

背景

不知道大家是否思考過一個問題,在一些場景下(如大家在使用高德地圖打車的時候,鄰近的司機是如何知道你在他的附近并將你的打車通知推送給他去接單的?)是如何實現的?

一般來講,大家也許會想到,首先肯定需要知道每位乘客的經緯度(lng,lat),也即是二維坐標(當然這是在絕對理想的情況,不考慮上下坡度)。

而在知道了經緯度之后,一個暴力簡單且容易想到的思路就是將經緯度這個「二元組」 都存放在一個「數組」 當中,然后當我們需要拿到離我們規定范圍內的用戶(如獲取當前位置方圓百米內正在打車的乘客),我們就可以去遍歷維護的那個數組,以此去判斷數組中的經緯度與自己所在經緯度的距離,然后判斷是否在范圍內。

顯然這種方法一定是能夠達到目的的,但是值得注意的點是,維護的數據量一般來講是海量的,因此如果每次都需要遍歷所有數據去進行計算,那這計算量以及存儲量目前是無法滿足的。那如何在此基礎上去優化性能呢??那么這個內容就是本篇文章主要想探討的問題......

GeoHash基本原理介紹

首先我想先介紹一下GeoHash這種算法「基本原理」 ,再討論如何進行應用。

對于每一個坐標都有它的經緯度(lng,lat) ,而GeoHash的原理就是將經緯度先通過一個二分的思路拿到一個二進制數組的字符串,然后再通過base32編碼去進行壓縮存儲。

舉一個例子,比如經緯度為(116.3111126,40.085003),對其進行二分步驟如下:

經度步驟:

bit

left

mid

right

1

-180

0

180

1

0

90

180

0

90

135

180

1

90

112.5

135

0

112.5

123.75

135

0

112.5

118.125

123.75

1

112.5

115.3125

118.125

0

115.3125

116.71875

118.125

1

115.3125

116.015625

116.71875

0

116.015625

116.3671875

116.71875

1

116.015625

116.19140625

116.3671875

1

116.19140625

116.279296875

116.3671875

0

116.279296875

116.323242188

116.3671875

1

116.279296875

116.301269532

116.323242188

0

116.301269532

116.31225586

116.323242188

緯度步驟:

bit

left

mid

right

1

-90

0

90

0

0

45

90

1

0

22.5

45

1

22.5

33.75

45

1

33.75

39.375

45

0

39.375

42.1876

45

0

39.375

40.78125

42.1876

1

39.375

40.078125

40.78125

0

40.078125

40.4296875

40.78125

0

40.078125

40.25390625

40.4296875

0

40.078125

40.166015625

40.25390625

0

40.078125

40.1220703125

40.166015625

0

40.078125

40.1000976563

40.1220703125

0

40.078125

40.0891113282

40.1000976563

1

40.078125

40.0836181641

40.0891113282

「其思路就是不斷二分,如果原本值大于mid那本bit位就是1,以此往下遞歸,最終,我們遞歸二分得到緯度方向上的二進制字符串為 101110010000001,長度為 15 位」

那此時就拿到了30bit位的字符串,然后就開始進行拼接。

結合經度字符串 110100101011010 和緯度字符串 101110010000001,我們遵循先經度后緯度的順序,逐一交錯排列,最終得到的一維字符串為 11100 11101 00100 11000 10100 01001。

然后再進行Base32編碼,主要步驟就是首先會維護一個「0-9A-Za-z」 中32個字符的數組,如:['a','b','1','2','3','4','5','6','7','A'...],然后再將這30位的字符串每五個一組(正好覆蓋0-31的索引)去索引到指定字符以此拿到30/5=6位的base32編碼去進行存儲。

「ps:注意并不一定是必要將經緯度都二分得到15位長度,多少位都可以,只是精度越高結果也就越精確,但是算力就越大,只需在此做出權衡即可」。

GeoHash如何應用到這個問題當中?

上面講到了可以通過GeoHash將經緯度轉換成bit位的字符串,那么怎么進行應用呢,其實答案很明顯,其實如果經緯度越接近,他們的前綴匹配位數也就越長,比如:

圖片圖片

通過這個思路我們就比較容易得到我們想要的范圍內的乘客了。

遺留問題

但是其實僅僅如此是不夠的,因為一個base32其實是覆蓋了一片區域的,它并不是說僅僅代表一個精確的ip地址,那這其實就衍生出了一些問題,就比如:

圖片圖片

用geohash那結果顯然是AB更近,但是實際上A與B的距離比AE、AC、AD都遠。這其實是一個邊緣性的問題........后續我會更新如何去避免這種問題的出現。

責任編輯:武曉燕 來源: 架構精進之路
相關推薦

2015-08-20 15:26:10

漏洞滴滴打車滴滴專車券

2014-01-09 11:13:59

打車軟件BAT融資

2015-06-19 15:10:31

打車軟件

2013-08-21 09:23:10

打車軟件官方

2014-11-10 16:06:26

加密APP安全打車軟件

2020-11-13 12:24:08

滴滴導航平臺

2013-10-16 13:31:49

打車市場

2011-09-01 09:07:30

程序員

2014-10-09 09:34:38

ATM惡意軟件Tyupkin

2016-10-20 19:21:46

transformcss3css

2015-01-29 10:35:57

移動安全山寨軟件木馬

2015-02-06 18:29:09

仿滴滴打車android

2016-08-24 13:59:05

2013-12-17 10:41:42

2013-04-19 10:42:02

打車軟件大數據

2021-09-07 10:27:23

勒索軟件惡意軟件安全

2015-07-10 10:46:57

2023-02-17 15:47:39

AI機器人

2013-07-24 09:50:44

滴滴打車快的打車叫車軟件

2009-11-09 10:57:07

ibmdw軟件架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久久久久久人人人人传媒 | 国产日韩精品久久 | 黄视频免费观看 | 情侣酒店偷拍一区二区在线播放 | 国产毛片在线看 | 婷婷色国产偷v国产偷v小说 | 久久亚洲免费 | 日韩成人影院 | 日本一区二区高清视频 | 成人免费视频在线观看 | 亚洲一区中文字幕在线观看 | 亚洲精品久久久久中文字幕二区 | 国产在线精品一区二区 | 91在线精品视频 | 成人特级毛片 | 成年人在线观看 | 国产精品爱久久久久久久 | 亚洲成人精选 | 九九视频网 | 国产精品乱码一二三区的特点 | 免费视频99 | 逼逼网 | 蜜臀久久99精品久久久久野外 | 国内精品久久久久久久 | 亚洲综合视频 | 日韩一级欧美一级 | 羞羞的视频免费在线观看 | 天天影视亚洲综合网 | av在线二区 | 日本久久久久久 | 久久er99热精品一区二区 | 国产欧美日韩在线观看 | 国产精品久久久久久久久久久久 | 久草在线 | 成人免费视频观看 | 久久免费精品 | 黄色一级免费看 | 免费网站国产 | 涩爱av一区二区三区 | 中文字幕欧美在线观看 | 久久久久久免费毛片精品 |