今天羅孚為大家推薦一種經緯度編碼的方法——plus code,原名open location code,是google於2023年發明的,旨在將表示地理位置的經緯度通過演算法推導成乙個字串。
用一串字元表示地球上的任一位置
發明plus code的初衷,就是希望能夠通過乙個編碼標識地球的任何乙個地方。
我們最常用的位置編碼是位址編碼,通過行政區劃、道路和門牌號等資訊找到具體的位置資訊,這在日常生活中非常常見,比如送快遞。
但若你在京東或天貓上買東西,直接送回鄉下老家,怎麼辦?還能記得門址資訊嗎?一方面城市化程序變遷,也許門址早已不是當初的門址,另一方面即便有門牌號,乙個陌生人能否順利找到,也是未知問題。
門址無法找到,那我們用經緯度,經緯度是乙個非常精確的位置資訊。沒錯,但除了電影中會有通過十幾個數字(即經緯度)來尋找目標的場景,我們在日常生活中有用到嗎?加上國家的法律因素,連通過經緯度導航都不是乙個可行的方法。
世界上確實有無法使用門址表示的地方,而經緯度的數值也超出了常人的可記憶範疇,所以google希望通過一種編碼方法,簡單明瞭地表示世界上任一位置。
使用字串編碼來表示經緯度,其實有多種編碼方案,但plus code有什麼優勢?我們後面再講。只是,羅孚使用plus code並不僅僅為了表示地球上的位置這麼簡單。
基於位置範圍的檢索
在電子地圖的使用過程中,我們可能經常需要查詢酒店、餐飲、景點等資料,也就是我們常說的poi檢索。其檢索方式,除了名稱查詢外,可能會有周邊查詢或沿途搜尋,比如「徐家匯周圍10公里範圍內的奧迪4s店」。
周邊查詢和沿途搜尋,都是一種基於經緯度範圍的檢索,最常規的檢索方法,就是一條sql語句,限定一下範圍即可,比如:where lat > 31 and lat <32 and lon >121 and lon <121。
直接拿經緯度進行比較,一定不是乙個好的方法,當資料量達到千萬級,其檢索效率低下到無法直視。如何提高檢索效率?首先想到的,一定是分塊檢索,比如將資料進行四叉樹切分,根據當前位置找到附近的資料塊,然後再在資料塊中檢索。
資料分幅分塊是資料處理中最基本的內容,資料量大了以後必定要做分幅分塊處理,比如全國的poi資料。資料分幅有很多種方法,比如上述的四叉樹方法,或者直接按固定經緯度間隔進行分幅(類似印刷紙質地圖所用的分幅),當然按省名稱區分也可以算是分幅,只是形狀不規則罷了。
羅孚推薦plus code,一定在分幅上有它的優勢,待我慢慢道來,我們先來了解一下plus code。
plus code是一種經緯度編碼方法,它能表示地球上的任何乙個地方。
plus code將經緯度編碼後,一般為十位字元(如果含+號的話,就是11位)。plus code去除了容易混淆的字母以及一些令人不愉快的字元,只取用了20個字元(含部分數字),這20個字元是:2、3、4、5、6、7、8、9、c、f、g、h、j、m、p、q、r、v、w、x。
plus code的前四個字元是區域**,基本是1經緯度的範圍,也就是約100100公里的範圍,後六位是本地**,用來描述乙個建築物,面積約為1414公尺,差不多是半個籃球場的大小。
但如果覺得十位編碼精度不夠,是否可以繼續拓展呢?當然可以,plus code定義了乙個附加規則,可以將**拓展到11位或12位,其中11位編碼差不多代表了3公尺的範圍,應該可以描述乙個建築物的前門或後門,或者是一輛車的大小,定位顆粒更細。需要注意,10位以後的**不再使用兩位編碼表示區域,而僅使用了一位,編碼方式有所不同。
層級字元數
經緯度範圍
長度範圍02
20x20
2200km14
1x1110km26
0.05x0.05
5.5km38
0.0025x0.0025
275m410
0.000125x0.000125
14m5
110.000025x0.00003125
3.5m612
0.000005x0.0000078125
上表為plus code的層級表,既然plus code具有層級,那pluse code就可以改變長度,越短的長度表示的區域範圍越大,越長的長度表示的區域範圍越小。同時也說明,plus code所表示的經緯度,是乙個經緯度範圍(是乙個面),而不是乙個經緯度值(乙個點)。按理,面是無法用來導航的,當然,我們變通一下,可以取面的中心點。
plus code介紹完了,我們來總結一下plus code的優點。
方便儲存
經緯度經過編碼,由經度和緯度兩個字段,變更為乙個字段,減少了乙個字段,而且不再使用float型,可以直接使用固定長度的string。
方便比較
羅孚認為,方便比較是plus code的核心優勢,也是解決上述「基於位置範圍檢索」問題的核心。
方便比較主要體現在兩個方面,乙個是按層級分幅,另乙個是幅和幅之間具有連續性。
仍然舉例來說,如何檢索徐家匯附近10公里範圍的奧迪4s店?主要解決範圍的問題。
徐家匯的plus code是8q335cvq+,根據plus code層級中的長度範圍,約取6位編碼(對應長度範圍是5.5km)比較合適,即8q335c,再將該圖幅附近一圈的8個圖幅選取出來,8q3349、8q334c、8q334f、8q3359、8q335f、8q3369、8q336c、8q336f,最終形成乙個九宮格狀的圖幅。
通過plus code的層級可以基本限定搜尋的範圍,通過目標位置的圖幅擴充套件選擇周邊的圖幅,而圖幅之間的連續性讓圖幅號的獲取變得極其簡單。
反之,若使用plus code的規則進行資料分塊,將資料密集區域,分塊到level2,比如上海市區,對於資料稀疏區域,則可以分塊到level1,比如西部地區。資料塊的總量得到了控制,同時每個資料塊的資料量也比較均勻,沒有過密或過疏的情況。
其他優勢
**足夠短,方便記憶。**本身是支援全世界的,不需要國別等附加資訊。
**是通過演算法生成的,可以離線使用,並且不需要任何設定或程式,**不依賴於任何第三方。
特別需要說明的,這個演算法是開源的,可以自由使用,包括商業用途。
geohash
geohash是比較早期的經緯度編碼方法,也是使用較廣的編碼方法。geohash選用了32個符號作為其字符集,其字元長度也是可變的,縮短字串的長度會影響位置的精度,實際上geohash**也是表示了經緯度範圍,而不是經緯度位置。
當然,geohash也是開源的,也僅僅是乙個演算法,應該說,後來的geohash-36以及plus code編碼,都受到了geohash編碼演算法的較大啟發。
geohash也有不少的弊端,除了精度問題,根據當前分幅號獲取周圍分幅號碼有較多的不確定性,這應該是最大的弊端,原因在於資料切分方法和命名規則。比如0緯度地區,即赤道附近,兩個相鄰的圖幅,其圖幅編號可能會大相徑庭,geohash的切分方法導致圖幅號的首字母也存在不同,這樣就無法通過縮短**的長度來快速獲取圖幅號,也就是無法快速確定範圍。
what3words
what3words據說已經在benz上獲得了使用,當然,原因是benz是what3words的投資方。
what3words吸引我的地方有兩個方面,一是將世界分成了3m3m的網格,類似於預先進行了乙個固定長度和比例尺的分幅,另一是每乙個33的網格都可以使用3個單詞來表示,即全世界每乙個3*3的地方都可以用3個單詞找到。
舉個例子:用「香蕉.兔子.猴子」可以表示a位址,用「兔子.猴子.香蕉」來表示b位址。這種方法,類似於建立了乙個全世界的門址編碼系統,而覆蓋全世界3*3的位置,要裝下全世界,那將是乙個多大的資料庫呢。這種編碼方法讓我首先想到的就是,做關鍵字競價排名應該是乙個不錯的生意,該機構還真的做了這件事情。
總的來說,羅孚認為,plus code非常適用於位置交換、定位以及基於位置範圍的搜尋等,如果你的專案中正好有經緯度轉碼或經緯度範圍檢索,不妨試試plus code。
附上資料:
plus code 官網,除了了解plus code外,還可以在google地圖上直接檢視任何位置的plus code**。
羅孚的plus code演示頁面,可以直接檢視圖幅編號,基於leftlet+天地圖+plus code grid,不過google的grid瓦片伺服器不穩定,***。
evaluation of location encoding systems,關於地理位置編碼的分析比較,google官方文件,內容較多,英文原版,但非常值得一看。
plus code/open location code github
Redis學習筆記 GEO經緯度編碼原理 地理劃分
在日常生活中,我們經常使用手機搜尋附近的餐館,或者在打車軟體上打車,都需要獲取使用者和服務商之間位置資訊,而redis提供了一種可以查詢地理位置資訊的資料結構geo,其底層實現原理和有序集合 sorted set 的原理一樣,我們知道有序集合資料特點就是每個值有對應的權重 score 這篇文章學習一...
php 關於經緯度距離計算方法
1.php實現通過經緯度計算距離 單位為公里 function getdistance lng1,lat1,lng2,lat2 根據經緯度計算距離 2.計算某個經緯度的周圍某段距離的正方形的四個點 define earth radius,6371 地球半徑,平均半徑為 6371km 計算某個經緯度的...
經緯度到螢幕畫素點的換算方法
經緯度到螢幕畫素點的換算方法 相關問題點 1 地球是不規則的球體,兩極扁,赤道鼓。不能簡單地作為圓球體來計算。2 每緯度在地理位置上的距離是一致的 約 111公里 但是每經度之間的距離是不同的 越往兩極,東西方向上的距離就越小 不能直接轉換為直角座標系。3 給出的經緯度座標發生變化後,需要動態的縮放...