經緯度編碼方法推薦-plus code簡介

2020-11-29 羅孚傳說

今天羅孚為大家推薦一種經緯度編碼的方法——plus code,原名open location code,是Google於2014年發明的,旨在將表示地理位置的經緯度通過算法推導成一個字符串。

plus code的用途

用一串字符表示地球上的任一位置

發明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是一種經緯度編碼方法,它能表示地球上的任何一個地方。

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位以後的代碼不再使用兩位編碼表示區域,而僅使用了一位,編碼方式有所不同。

層級字符數經緯度範圍長度範圍0220x202200km141x1110km260.05x0.055.5km380.0025x0.0025275m4100.000125x0.00012514m5110.000025x0.000031253.5m6120.000005x0.0000078125上表為plus code的層級表,既然plus code具有層級,那pluse code就可以改變長度,越短的長度表示的區域範圍越大,越長的長度表示的區域範圍越小。同時也說明,plus 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的位置,要裝下全世界,那將是一個多大的資料庫呢。這種編碼方法讓我首先想到的就是,做關鍵字競價排名應該是一個不錯的生意,該機構還真的做了這件事情。

我喜歡這種表示形式,但弊端確實太大了,本身需要通過API訪問才能定位,雖然也提供了離線SDK,但據說關鍵字競價排名不可以離線使用。需要網絡,並且無編碼算法可言,完全依賴於該機構對位置的定義,這是我最不能接受地方。

經緯度編碼的方法其實還有很多,今年也冒出了很多編碼方法,羅孚無法一一列舉和分析,如有更好的編碼方法推薦,也歡迎交流。

總的來說,羅孚認為,plus code非常適用於位置交換、定位以及基於位置範圍的搜索等,如果你的項目中正好有經緯度轉碼或經緯度範圍檢索,不妨試試plus code。

附上資料:

plus code 官網:https://plus.codes/,除了了解plus code外,還可以在Google地圖上直接查看任何位置的plus code代碼。

羅孚的plus code演示頁面:https://rovertang.com/labs/pluscode/,可以直接查看圖幅編號,基於leftlet+天地圖+plus code grid,不過Google的grid瓦片伺服器不穩定,你懂的。

Evaluation of Location Encoding Systems:https://github.com/google/open-location-code/wiki/Evaluation-of-Location-Encoding-Systems,關於地理位置編碼的分析比較,Google官方文檔,內容較多,英文原版,但非常值得一看。

plus code/open location code github:https://github.com/google/open-location-code

相關焦點

  • 一文打盡前端Base64編碼知識
    }簡單的數據加密當然這不是好方法,但是至少讓你不好解讀。Unicode只規定了每個字符的碼點,到底用什麼樣的字節序表示這個碼點,就涉及到編碼方法。UTF-8UTF-8 是網際網路使用最多的一種 Unicode 的實現方式。
  • 股票代碼簡介:一文看懂上交編碼與深交編碼
    =====推薦閱讀=====  股票知識解讀:什麼是優先股,普通股,後配股    上交編碼  在上海證券交易所上市的證券,根據上交所「證券編碼實施方案」,採用6位數編制方法,前3位數為區別證券品種
  • C/C++免殺CS shellcode實踐
    概述什麼是shellcode百度百科這樣解釋道:shellcode是一段用於利用軟體漏洞而執行的代碼,shellcode為16進位的機器碼,因為經常讓攻擊者獲得shell而得名。翻譯成人話就是:shellcode是一段執行某些動作的機器碼。
  • 10種途徑,讓你在Visual StudioCode中輕鬆高效編碼!
    今天,小芯就為各位帶來,在VisualStudio Code中幫助提高編碼速度的10種途徑以及它們是如何幫助開發人員加速編碼進程的。1. 快捷鍵綁定每次手指離開鍵盤,都會給整個代碼編寫過程增加幾秒鐘的時間花費。
  • 《pokeplus》仙子伊布進化方法 太陽月葉冰伊布精靈進化地點技巧
    《pokeplus》仙子伊布怎麼進化?伊布是歷代遊戲中除了皮卡丘之外的人氣精靈之一,有九種進化型目前,下面小編就為玩家帶來《pokeplus》仙子伊布進化方法,一起來看看吧。伊布是歷代遊戲中除了皮卡丘之外的人氣精靈之一,有九種進化型目前,下面小編就為玩家帶來《pokeplus》仙子伊布進化方法,一起來看看吧。
  • 《異界鎖鏈》全武器出手順序及編碼推薦
    《異界鎖鏈》中每一個武器的出手速度和編碼都是不一樣的,那麼究竟要怎麼選擇和搭配好呢
  • 重寫equals之後,師哥一行一行教你重寫hashcode方法
    這兩個地方,我們可以發現,都是先比較hash,如果hash不同,則不進行equals方法判斷。那麼上面的hash(key),又是怎麼樣的呢?哎,此處key.hashCode(),好像我們Student類,沒有這個hashcode方法。。。
  • 總不能說「Erwei code」吧?!
    Difference between QR code and Barcode二維碼與條形碼的不同之處Key difference: Both QR code and barcode are instruments used to gather data
  • 方舟生存進化經緯度查詢方法 手機版經緯度
    經緯度也就是坐標的意思啦,下面小編就來給大家講解下查看經緯坐標的方法,還不會的就一起來看看吧。 單機模式查詢方法 第一方法: 最簡單的方法就是點擊打開「導航套件」再點右邊的準心按鈕放大,這樣就能看到目前所處的位置,但只能憑肉眼來估算大概坐標,比如下圖就處於:橫向X(經度)77;豎向Y(緯度)65左右。
  • Java中重寫equals方法為什麼要重寫hashcode方法?
    所有對象都有equals方法,默認是Object類的equals,其結果與==一樣。如果希望比較對象的值相同,必須重寫equals方法。當equals方法被重寫時,通常有必要重寫hashCode方法,以維護hashCode方法的常規約定:值相同的對象必須有相同的hashCode。
  • 建設項目信息分類和編碼方法
    建設項目信息分類和編碼的主要方法如下:  1)投資建設項目的結構編碼依據項目結構圖,對項目結構的每一層的每一個組成部分進行編碼。項目管理組織結構編碼依據項目管理的組織結構圖,對每一個工作部門進行編碼。  2)投資建設項目的政府主管部門和各參與單位的編碼。
  • 十進位數的編碼與運算
    這種編碼的優點是這4位基2碼之間滿足二進位的規則,而十進位數位之間則是十進位規則,故稱這種編碼為以二進位編碼的十進位(Binary Coded Decimal)數,簡稱BCD碼或二-十進位碼。另一個優點是在數字符的ASCII碼與這種編碼之間的轉換方便,即取每個數字符的ASCII碼的低4位的值便直接得到該數字的BCD碼,入/出操作簡便。
  • 全球編碼競賽落幕 計算機最好的世界大學排名出爐
    編者按:在全球編碼競賽之後,HackerRank就全球生產最好的編碼師的50所大學或學校進行了排名 - 結果令人驚訝! 日前,《THE》發布Best universities in the world for learning to code(學習編碼最好的世界大學排名),揭示了全球生產最好的編碼師的大學。
  • 今日Paper|新聞推薦系統;多路編碼;知識增強型預訓練模型等
    他們主要需要克服的困難是,要避免多尺度表徵把標準方法的使用變得過於複雜。他們的方法是,在二階池化的屬性的基礎上設計一個新型的多尺度關係網絡,用來在小樣本學習中預測圖像關係。作者們也設計了一系列方法優化模型的表現。最終,他們在幾個小樣本學習數據集上都刷新了最好成績。
  • iPhone 7plus手機「頻繁斷網」,最有效的解決方法!
    最近,一些iPhone7plus用戶反映,自己的iPhone7plus的網絡信號沒有新買來的時候好,甚至還有一部分用戶反映,自己的iPhone7plus在網絡覆蓋全面的集市或人煙稀少的郊區也會出現頻繁掉網,信號欄時不時的出現「搜索網絡」的症狀。
  • 萬字長文講解編碼知識,看這文就夠了!| 原力計劃
    它與UCS-2一樣,它使用兩個字節為全世界最常用的63K字符編碼,不同的是,它使用4個字節對不常用的字符進行編碼。目的就是為了支持從17個平面編碼1,112,064個代碼點。UTF-16屬於變長編碼。我們可以將UTF-16編碼看成是UCS-2編碼父集。在沒有輔助平面字符(surrogate code points)前,UTF-16與UCS-2所指的是同一意思。
  • 《精靈寶可夢Lets Go》精靈球plus怎麼使用 精靈球plus使用方法介紹
    導 讀 精靈寶可夢Lets Go精靈球plus怎麼用?
  • 編碼解碼是什麼意思?URL 如何編碼解碼?為什麼要編碼?
    編碼解碼是什麼?編碼是信息從一種形式或格式轉換為另一種形式的過程,也稱為計算機程式語言的代碼簡稱編碼。用預先規定的方法將文字、數字或其它對象編成數碼,或將信息、數據轉換成規定的電脈衝信號。編碼在電子計算機、電視、遙控和通訊等方面廣泛使用。編碼是信息從一種形式或格式轉換為另一種形式的過程。解碼,是編碼的逆過程。
  • 經緯度定位