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

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

plus code

plus code的用途

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

發明plus code的初衷,就是但願可以經過一個編碼標識地球的任何一個地方。算法

咱們最經常使用的位置編碼是地址編碼,經過行政區劃、道路和門牌號等信息找到具體的位置信息,這在平常生活中很是常見,好比送快遞。sql

但若你在京東或天貓上買東西,直接送回鄉下老家,怎麼辦?還能記得門址信息嗎?一方面城市化進程變遷,也許門址早已不是當初的門址,另外一方面即使有門牌號,一個陌生人可否順利找到,也是未知問題。數據庫

門址沒法找到,那咱們用經緯度,經緯度是一個很是精確的位置信息。沒錯,但除了電影中會有經過十幾個數字(即經緯度)來尋找目標的場景,咱們在平常生活中有用到嗎?加上國家的法律因素,連經過經緯度導航都不是一個可行的方法。服務器

世界上確實有沒法使用門址表示的地方,而經緯度的數值也超出了常人的可記憶範疇,因此Google但願經過一種編碼方法,簡單明瞭地表示世界上任一位置。網絡

使用字符串編碼來表示經緯度,其實有多種編碼方案,但plus code有什麼優點?咱們後面再講。只是,羅孚使用plus code並不只僅爲了表示地球上的位置這麼簡單。google

基於位置範圍的檢索編碼

在電子地圖的使用過程當中,咱們可能常常須要查詢酒店、餐飲、景點等數據,也就是咱們常說的POI檢索。其檢索方式,除了名稱查詢外,可能會有周邊查詢或沿途搜索,好比「徐家彙周圍10千米範圍內的奧迪4S店」。lua

徐家彙周圍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個字符是:二、三、四、五、六、七、八、九、C、F、G、H、J、M、P、Q、R、V、W、X。

港匯恆隆廣場的pluscode碼

plus code的前四個字符是區域代碼,基本是1經緯度的範圍,也就是約100100千米的範圍,後六位是本地代碼,用來描述一個建築物,面積約爲1414米,差很少是半個籃球場的大小。

但若是以爲十位編碼精度不夠,是否能夠繼續拓展呢?固然能夠,plus code定義了一個附加規則,能夠將代碼拓展到11位或12位,其中11位編碼差很少表明了3米的範圍,應該能夠描述一個建築物的前門或後門,或者是一輛車的大小,定位顆粒更細。須要注意,10位之後的代碼再也不使用兩位編碼表示區域,而僅使用了一位,編碼方式有所不一樣。

層級 字符數 經緯度範圍 長度範圍
0 2 20x20 2200km
1 4 1x1 110km
2 6 0.05x0.05 5.5km
3 8 0.0025x0.0025 275m
4 10 0.000125x0.000125 14m
5 11 0.000025x0.00003125 3.5m
6 12 0.000005x0.0000078125

上表爲plus code的層級表,既然plus code具備層級,那pluse code就能夠改變長度,越短的長度表示的區域範圍越大,越長的長度表示的區域範圍越小。同時也說明,plus code所表示的經緯度,是一個經緯度範圍(是一個面),而不是一個經緯度值(一個點)。按理,面是沒法用來導航的,固然,咱們變通一下,能夠取面的中心點。

plus code的優勢

plus code介紹完了,咱們來總結一下plus code的優勢。

方便存儲

經緯度通過編碼,由經度和緯度兩個字段,變動爲一個字段,減小了一個字段,並且再也不使用float型,能夠直接使用固定長度的string。

方便比較

羅孚認爲,方便比較是plus code的核心優點,也是解決上述「基於位置範圍檢索」問題的核心。

方便比較主要體如今兩個方面,一個是按層級分幅,另外一個是幅和幅之間具備連續性。

plus code的層級分幅

仍然舉例來講,如何檢索徐家彙附近10千米範圍的奧迪4S店?主要解決範圍的問題。

徐家彙的plus code是8Q335CVQ+,根據plus code層級中的長度範圍,約取6位編碼(對應長度範圍是5.5km)比較合適,即8Q335C,再將該圖幅附近一圈的8個圖幅選取出來,8Q334九、8Q334C、8Q334F、8Q335九、8Q335F、8Q336九、8Q336C、8Q336F,最終造成一個九宮格狀的圖幅。

查找徐家彙附近10千米範圍

經過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 官網,除了瞭解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

相關文章
相關標籤/搜索