<fieldset id="gy0wc"></fieldset>
<fieldset id="gy0wc"></fieldset>
  • <ul id="gy0wc"><sup id="gy0wc"></sup></ul>
  • 當(dāng)前位置:首頁 > 行業(yè)知識 > 綜合

    搜索附近的人代碼

    關(guān)注:13 發(fā)布時間:2021-11-12 09:13:04

    老板突然想上網(wǎng)找一個離方圓一公里的商業(yè)代理。明天上線!接到這個要求的時候差點吐血,時間太緊了。趕緊查查相關(guān)技術(shù)選型。經(jīng)過很多麻煩,終于在晚上10點滿足了這個需求,現(xiàn)在總結(jié)一下實現(xiàn)的大致思路。

    2.mysql不適合

    在滿足需求的時候,首先要考慮現(xiàn)有的東西能不能滿足,代價是什么。

    我首先想到的是mysql。畢竟,大部分?jǐn)?shù)據(jù)應(yīng)該堅持到mysql.然而,使用mysql需要geohash.的自我計算。需要使用大量的數(shù)學(xué)和幾何計算,并需要學(xué)習(xí)地理相關(guān)知識。門檻高,短時間內(nèi)不可能完成要求。從長遠(yuǎn)來看,這不是mysql擅長的領(lǐng)域,因此不予考慮。

    geohash可以參考其他文獻(xiàn)

    2.redis中的地球同步軌道

    redis是比較熟悉的k-v數(shù)據(jù)庫,它經(jīng)常被用作高性能緩存數(shù)據(jù)庫,并將在大多數(shù)項目中使用。自3.2版本以來,它提供了geo能力,用于實現(xiàn)附近位置、距離計算等依賴于地理位置信息的功能。geo"s的相關(guān)命令如下:

    redis命令描述geohash返回一個或多個位置元素的geohash,這意味著geopos從key返回所有給定位置元素的位置(經(jīng)度和緯度)。geodist返回兩個給定位置之間的距離。地球位于給定的緯度和經(jīng)度的中心。找出一定半徑內(nèi)的元素geoadd將指定的地理空間位置(緯度、經(jīng)度、名稱)添加到指定的關(guān)鍵georadiusbymember找出指定范圍內(nèi)的元素,中心點由給定的位置元素確定

    redis會假設(shè)地球是一個完美的球體,所以可能會有一些位置計算偏差,據(jù)說是=0.5%。對于地理位置要求嚴(yán)格的需求,要進(jìn)行一些場景測試,測試是否能滿足需求。

    2.1寫地理信息

    那么如何實現(xiàn)目標(biāo)單位半徑內(nèi)的所有元素呢?我們可以將所有位置的經(jīng)緯度轉(zhuǎn)換成52位的geohash,通過上表中的geoadd寫入redis。

    命令格式:

    geoadd關(guān)鍵經(jīng)度緯度成員[經(jīng)度緯度成員…]

    相應(yīng)的例子:

    redis geo add cities : locs 117.12 39.08天津114.29 38.02石家莊

    (整數(shù))2

    意思是在key.個城市的sorted set集合中添加經(jīng)度為117.12、緯度為39.08的天津和經(jīng)度為114.29、緯度為38.02的石家莊,您可以添加一個或多個位置。然后我們可以使用其他命令來計算地理位置。

    有效經(jīng)度范圍從-180度到180度。有效緯度范圍從-85.05112878度到85.0512778度。當(dāng)坐標(biāo)位置超過上述指定范圍時,該命令將返回一個錯誤。

    2.2統(tǒng)計單位半徑內(nèi)的面積

    借助georadius,我們可以找到給定經(jīng)緯度的某個半徑內(nèi)的所有元素。

    命令格式:

    地理坐標(biāo)長緯度半徑m | km | ft | mi[withourd][withdist][with ash][count][asc | desc]

    這個命令比geoadd更復(fù)雜:

    radius半徑長度,必需。以下m、km、ft和mi是長度單位選項,四選一。

    withcoord返回位置元素的經(jīng)度和維度,這是可選的。

    withdist返回位置元素和中心點以及位置元素之間的距離。距離的單位與查詢單位相同,這不是必需的。

    withhash以52位精度返回位置的geohash值,這是可選的。反正我很少用這個。也許其他一些偏向底層的lbs應(yīng)用服務(wù)需要這個。

    count返回合格位置元素的數(shù)量,這不是必需的。比如返回前10名,這樣可以避免過多的一致結(jié)果帶來的性能問題。

    asc|desc排序方式,非必選。默認(rèn)情況下返回未排序,但是大多數(shù)我們需要進(jìn)行排序。參照中心位置,從近到遠(yuǎn)使用asc,從遠(yuǎn)到近使用desc。

    例如,我們在城市:locs中查找以(115.03,38.44)為中心,方圓200公里的城市,結(jié)果包含城市名稱、對應(yīng)的坐標(biāo)和距離中心點的距離(公里),并按照從近到遠(yuǎn)排列。命令如下:

    redis georadius city : locas 115.03 38.44 200km,帶coord witist asc

    1) 1)石家莊

    2) "79.7653"

    3) 1) "114.29000169038772583"

    2) "38.01999994251037407"

    2) 1)"天津"

    2) "186.6937"

    3) 1) "117.02000230550765991"

    2) "39.0800000535766543"

    你可以加上計數(shù)一來查找比較近的一個位置。

    3.基于redis geo實戰(zhàn)

    大致的原理思路說完了,接下來就是實操了。結(jié)合spring boot應(yīng)用我們應(yīng)該如何做?

    3.1 開發(fā)環(huán)境

    需要具有g(shù)eo特性的redis版本,這里我使用的是redis 4。另外我們客戶端使用spring-boot-starter-data-redis。這里我們會使用到使用對象。

    3.2 批量添加位置信息

    第一步,我們需要將位置數(shù)據(jù)初始化到redis中。在spring data redis中一個位置坐標(biāo)(液化天然氣,lat)可以封裝到org。spring框架。數(shù)據(jù)。geo。要點對象中。然后指定一個名稱,就組成了一個位置geo信息redistemplate。提供了批量添加位置信息的方法。我們可以將章節(jié)2.1中的添加命令轉(zhuǎn)換為下面的代碼:

    mapstring,point points=new hashmap;

    points.put("天津",new point(117.12,39.08));

    points.put("石家莊",新點(114.29,38.02));

    //redistemplate批量添加長狹潮道

    redis模板。邊界城市:個位置.添加(分);

    可以結(jié)合彈簧靴提供的applicationrunner接口來實現(xiàn)初始化,建議從mysql等數(shù)據(jù)庫同步地理信息。

    @豆

    public applicationrunner cache activeapprunner(redistemplate string,string redistemplate) {

    返回參數(shù)- {

    比較終字符串geo _ key=" cities:locs

    //清理緩存

    redistemplate。刪除(geo _ key);

    //建議從關(guān)系型數(shù)據(jù)庫同步地理信息

    mapstring,point points=new hashmap;

    points.put("天津",new point(117.12,39.08));

    points.put("石家莊",新點(114.29,38.02));

    //redistemplate批量添加地理定位

    boundgeooperationsstring,string geoops=redistemplate。boundgeoops(geo _ key);

    geoops.add(點);

    };

    }

    3.3 查詢附近的特定位置

    使用針對georadius命令也有封裝:

    地理位置半徑(k鍵,內(nèi)圓,地理坐標(biāo)標(biāo)準(zhǔn)參數(shù))

    圓對象是封裝覆蓋的面積(圖1),需要的要素為中心點坐標(biāo)要點對象、半徑(半徑)、計量單位(公制),例如:

    點點=新點(115.03,38.44);

    公制公制=redisgeocommands .距離單位。kumts

    距離距離=新距離(200,公制);

    圓圓=新圓(點,距離);

    地理標(biāo)準(zhǔn)用來封裝georadius的一些可選命令參數(shù),參見章節(jié)2.2中的帶門、計數(shù)、asc等,例如我們需要在返回結(jié)果中包含坐標(biāo)、中心距離、由近到遠(yuǎn)排序的前5條數(shù)據(jù):

    redisgeocommands .地理社區(qū)標(biāo)準(zhǔn)參數(shù)=地理社區(qū)。地理標(biāo)準(zhǔn)。newgeoradiusargs。includedistance。包括坐標(biāo)。排序排序。極限(限制);

    然后執(zhí)行半徑方法就會拿到georesultsredisgeocommands .地理位置字符串封裝的結(jié)果,我們對這個可迭代對象進(jìn)行解析就可以拿到我們想要的數(shù)據(jù):

    georesultsredisgeocommands .geolocationstring radius=redis template。opsforgeo。半徑(geo_stage,圓,args);

    if (radius!=) {

    list staged to staged tos=new arraylist;

    半徑。foreach(地理定位地理結(jié)果-->

    重新調(diào)用命令地理位置字符串內(nèi)容=地理位置

    georesult . getcontent;

    //成員姓名如天津

    string name=content . getname;

    //對應(yīng)的經(jīng)緯度坐標(biāo)

    point pos=content . getpoint;

    //到中心點的距離

    distance dis=geolocationgeoresult . getdistance;

    });

    }

    3.4刪除元素

    有時我們可能需要刪除位置元素,但是redis的geo沒有刪除成員的命令。但是因為它的底層是zset,我們可以借助zrem命令刪除,對應(yīng)的java代碼是:

    redistemplate . boundsetops(geo _ stage)。移除(“天津”);

    4.摘要

    ,我們使用redis"sgeo功能來實現(xiàn)附近常見的地理信息查詢需求,簡單易用。事實上,nosql,的另一個mongodb數(shù)據(jù)庫,也可以使用。在數(shù)據(jù)量較小的情況下,redis能夠很好地滿足需求。如果數(shù)據(jù)量大,可以用mongodb.來實現(xiàn),本文涉及的demo可以通過文末相關(guān)文章的鏈接來獲得。

    猜你喜歡

    • 日本當(dāng)年為什么攻打珍珠港?

      日本當(dāng)年為什么攻打珍珠港?80人支持

      二戰(zhàn)初期,美國遠(yuǎn)離主戰(zhàn)場,所以大陸沒有受到戰(zhàn)爭的影響,美國人民過著相對穩(wěn)定的生活。然而,日本毫無征兆地轟炸了美國的珍珠港,使美國卷入了一場殘酷的戰(zhàn)爭。日本為什么要這么做?主…

    • 支付寶可以薅的羊毛

      支付寶可以薅的羊毛23人支持

      這篇文章是一個失敗的薅羊毛戰(zhàn)略,但我不想讓我努力工作的戰(zhàn)略付諸東流。發(fā)出去!如果能幫助無意看這篇文章的人避坑呢?支付寶-財富有相關(guān)活動嗎?像前幾天一樣,畫了15.18元。(是超…

    • 拼多多出事改簡介?

      拼多多出事改簡介?58人支持

      近日,拼多多一名員工因過度勞累死亡,在網(wǎng)上引起軒然大波。消息稱,死亡女孩已火化,相關(guān)后續(xù)治療仍在進(jìn)一步協(xié)調(diào)中。事件發(fā)生后,平臺在某平臺上進(jìn)行了動態(tài)開發(fā)。動態(tài)內(nèi)容一般表示現(xiàn)…

    • 為什么不建議年輕人一直刷抖音?

      為什么不建議年輕人一直刷抖音?45人支持

      作為目前短視頻的主流平臺,tik tok每天有6億用戶,可以說是全民的tik tok。從70、80年代到三、四歲的孩子,tik tok是慣的。雖然是社會的發(fā)展,科技的進(jìn)步,但我個人覺得這不是一…

    • 直接讓微信語音變聲的

      直接讓微信語音變聲的25人支持

      眾所周知,qq有自己的語音變聲,不需要編輯就可以發(fā)送。都是老馬產(chǎn)品,微信沒有這么好玩的功能。我也表示無奈。然而今天,陶濤給了每個人分享一個手機聊天變聲的技巧,和叔叔可以在…

    • 函授和網(wǎng)絡(luò)教育有什么區(qū)別

      函授和網(wǎng)絡(luò)教育有什么區(qū)別93人支持

      如果我們一直在大專或更低的教育水平,我們會不斷失去更多的信心,然后在職業(yè)發(fā)展的過程中不斷抑郁。為了使我們能夠更快地進(jìn)入社會并找到一份穩(wěn)定的工作,教育是必不可少的。對于…

    • 互聯(lián)網(wǎng)上神秘的一群人:羊毛黨

      互聯(lián)網(wǎng)上神秘的一群人:羊毛黨13人支持

      大家好,我是網(wǎng)購的先鋒。今天,我們來談?wù)劇把蛎h”。相信大家都聽說過羊毛黨這個詞,但是不清楚他們在做什么。大環(huán)境的形成據(jù)統(tǒng)計,現(xiàn)在的網(wǎng)購會員大約有6.39億。由于互聯(lián)網(wǎng)的快…

    • 抖音注銷后是什么狀態(tài)

      抖音注銷后是什么狀態(tài)116人支持

      今天是全新的一天,11月的第一天,還有61天進(jìn)入2021年。今天的自己很不一樣,沒有過去的頹廢,心里有一絲期待。今天,tik tok的帳戶被取消,同時卸載。我從17年開始接觸tik tok,3年多…

    • 股票停牌是好是壞

      股票停牌是好是壞51人支持

      停牌通常是由于一些市場消息或上市公司想發(fā)布的最大事件。為了維護(hù)投資市場的公平正義原則,證券交易所采取了突然停牌的方式。大多數(shù)情況下,上市公司停牌是在收盤后的晚上宣布…

    • 浪花黑卡怎么使用?

      浪花黑卡怎么使用?37人支持

      微信和支付寶可以說是兩個“國貨軟件”,在中國大約有11億用戶。支付寶先后推出了花店和貸店,受到大家的歡迎。對于很多微信用戶來說,他們希望微信也能推出類似支付寶的花店、借…

    • 無理數(shù)包括哪些

      無理數(shù)包括哪些34人支持

      什么是無理數(shù)?很多學(xué)生在接觸無理數(shù)時不知所措,有時會讓人感到頭疼。今天極客數(shù)學(xué)團(tuán)隊整理了關(guān)于無理數(shù)的知識點和相關(guān)練習(xí)。我們來看看什么是無理數(shù)。1.什么是無理數(shù)?無理數(shù)是…

    • 失敗了的羅永浩

      失敗了的羅永浩73人支持

      這段時間一直被羅永浩的各種消息所席卷。此人一直站在商業(yè)領(lǐng)域的最前沿,從錘子手機到玩電子煙,業(yè)務(wù)不斷失敗。現(xiàn)在不僅欠了一筆債,還被丹陽市人民法院列入失信人黑名單,限制高消…

    微商技巧

    主站蜘蛛池模板: 亚洲精品综合久久| 精品无人码麻豆乱码1区2区| 亚洲动漫精品无码av天堂| 成人国产精品一区二区视频| 日韩精品亚洲人成在线观看| 久久久亚洲精品蜜桃臀| 91精品福利在线观看| 99久久精品影院老鸭窝| 三上悠亚久久精品| 亚洲一日韩欧美中文字幕欧美日韩在线精品一区二 | 嫖妓丰满肥熟妇在线精品| 久久中文精品无码中文字幕| 国产精品∧v在线观看| 久久九九亚洲精品| 国产精品视频网站你懂得| 精品人妻人人做人人爽| 无码国内精品人妻少妇| 亚洲国产精品成人午夜在线观看| 久久97久久97精品免视看秋霞| 国产成人精品综合在线观看| 99久久精品国产一区二区| 亚洲色图国产精品| 色花堂国产精品第一页| 国产精品你懂的| 精品视频一区二区三区在线观看| 91麻豆精品视频| 国产cosplay精品视频| 91精品成人免费国产| 国产精品高清一区二区三区 | 欧美日韩国产精品系列| 久久这里只有精品视频99| 四虎影视永久在线精品免费| 无码精品人妻一区二区三区影院| 久久青青草原精品国产软件| 久久精品国产国产精品四凭| 日韩精品毛片| 最新在线精品国自av| 日韩国产成人精品视频| 精品国际久久久久999波多野| 囯产精品一品二区三区| 国产成人精品日本亚洲18图|