如何設計實現一個地址反解析服務?

http://www.cnblogs.com/LBSer/p/4507829.html

一、什么是地址反解析

? ? ? ?我們都知道手機定位服務,其本質是匯總各種信號得出一個經緯度坐標(x,y)(具體定位原理可以參考:LBS定位技術基于樸素貝葉斯的定位算法),然而定位服務并未提供該坐標對應的實體地理信息,比如街道、POI等,要知道這些信息就需要使用地址反解析服務,該服務就是由經緯度信息得到結構化地址信息(圖1)。

圖1 地址反解析

? ? ? 例如lat:30.252188,?lng:120.120427,地址反解析得到的結果如表1所示。

?

表1 地址反解析得到的結果

{data: {province: "杭州市",city: "杭州",district: "西湖區",detail: "靈隱路-靈溪南路",lat: 30.252188,lng: 120.120427}
}

?  

二、基本思路

? ? ? 一般現有的地圖服務公司如高德、google、百度等都會提供地址反解析服務,當大家業務規模較小時可以選擇調用他們提供的接口,但是如果業務規模較大時,再去直接調用顯然不太合適。大家需要有自己的實現能力!

  實現地址反解析服務有矢量和柵格兩種思路。

1)矢量思路

? ? ? 高德、google、百度等地圖服務公司有自己的地圖數據,包括矢量數據(比如點、線、面等幾何數據)以及矢量對應的屬性信息(比如某線對應的屬性是“北京朝陽望京東路”),因此他們的地址反解析思路很直接,直接根據經緯度查找附近的矢量數據(POI、道路等數據),比如查找到一條道路,然后返回道路對應的屬性信息即可(圖2)。具體實現思路與地理圍欄算法解析(Geo-fencing)一文相似。

圖2 矢量思路示意圖

?? ? ?

  這種方式的優點是數據存儲量較小。缺點是要求有詳細的地圖矢量數據以及對應的屬性數據,而對一般公司來說很難獲得。

? ? ? 盡管我們可以通過開源的openstreetmap拿到中國的矢量地圖數據(如何獲取、存儲、管理、使用osm數據呢?可以參考:利用OpenStreetMap(OSM)數據搭建一個地圖服務),但是openstreetmap中國地區的矢量地圖數據很不詳細,精度也較低,完全依賴于openstreetmap的地圖數據來進行地址反解析還不太靠譜。

?2)柵格思路

? ? ? ?什么是柵格思路?如圖3a所示,比如將北京劃分成很多柵格(也稱之為瓦片),當柵格比較精細時,比如為10米*10米時,我們可以假設一個柵格內部的地址是相同的。這種假設是合理的,如圖3b虛線框柵格內的兩點所示,盡管該兩點經緯度坐標不同,但是其地址均為“中國北京市朝陽區北苑路”。基于上述假設,我們可以事先存儲各個柵格對應的地址信息。每當一個用戶請求過來,首先判斷該用戶經緯度所對應的柵格,然后將此柵格對應的地址信息返回即可。 ? ??

? ? ?柵格思路的優點是很簡單很直觀,缺點是數據量大。以北京為例,北京全市面積為?16,410.54平方千米,如果柵格大小為10米*10米,那么需要存儲1.6億個柵格對應的地址信息,如果放大到全國(約960萬平方千米),數據量將更大。


?
圖3 柵格思路示意圖

三、方案設計

? ? ? ?在沒有矢量數據的情況下一般應用可以采用柵格思路,因為簡單直觀易于上手,后期如果找到完備的矢量數據則可以借鑒矢量思路。

1)如何降低柵格方案的數據存儲量?

? ? ? ?柵格方案最大的缺點是存儲量巨大,如何降低柵格方案的數據存儲量呢?我們有兩種思路。

? ? ? ?a)有效柵格方案。前面講到如果柵格為10米*10米時,僅北京就會有1.6億個柵格。但是我們知道一般應用的用戶基本是在城區進行訪問,鮮有用戶會在山溝溝里使用大家的服務,因此這1.6億個柵格有大部分是不會有被訪問到的(某柵格被訪問到是指用戶請求的經緯度落在該柵格范圍內),我們將被用戶訪問到的柵格稱之為有效柵格。事實上我們無需存儲所有柵格對應的地址信息,而僅需存儲有效柵格對應的地址信息即可實現我們的地址反解析服務,從而大大降低數據存儲量。如圖4所示,黃色柵格代表是有用戶訪問到的柵格,即有效柵格,有效柵格數目<<全部柵格數目。

圖4 有效柵格方案(紅點代表用戶請求的經緯度,黃色柵格代表有效柵格)

?

? ? ? ?b)自適應粒度柵格方案。之前柵格粒度是不變的,比如都是10米*10米,由于大部分柵格用戶不會訪問到,這樣較為浪費存儲空間。我們可以采用四叉樹對地理空間進行劃分(圖5),每次劃分都對空間進行四等分,直到劃分出的柵格內沒有用戶請求點或者柵格的粒度<=10米*10米為止。在用戶訪問密集區域,柵格的粒度較為精細,精度較高,在鮮有用戶訪問區域,柵格粒度較粗,地址反解析的結果也較粗,可以發現:自適應粒度柵格數目<<均等粒度柵格數目。

圖5 自適應粒度柵格方案

?

? ? ? ? ?從本質上講有效柵格方案是key-value的存儲結構,存儲簡單方便,并且更新也很簡便,非常適合大數據環境。而自適應粒度柵格方案本質上是樹存儲結構(四叉樹),涉及到樹結構的節點分裂等操作,在大數據環境下實現邏輯較為復雜。簡便起見我們采用有效柵格方案。

2)數據存儲方式?

? ? ? ?有效柵格方案本質是key-value的存儲方式。1)這里的key指的是柵格的編號,一個用戶請求過來,首先根據用戶請求的經緯度判斷其所在的柵格編號(key),然后查找該編號(key)對應的地址信息。柵格的編號方式有很多,可以采用geohash編碼來進行編號(關于geohash可以查看GeoHash核心原理解析Geohash距離估算),一般來講,geohash編碼長度為8位時,其代表著20米*20米的柵格。2)value值指的是該柵格的中心點對應的地址信息。

? ? ?此外還需存儲該記錄的時間戳,以便我們知道數據的新舊,方便更新(表2)。

?

? ? 表2 數據存儲結構


3)實現流程
?

? ? ? ?地址反解析服務實現流程分為預處理以及線上服務兩個步驟(參見圖6)。

a)預處理

? ? ? 1)利用已有用戶的定位/地址反解析請求日志來確定有效柵格

? ? ? ? ? ? 用戶定位/地址反解析請求會攜帶有經緯度信息,可以計算該經緯度對應的geohash編碼(key),并查詢數據庫,如果沒有該key則進行插入,數據量較大時可以使用mapreduce進行處理,最后將數據寫入Hbase以便線上實時查詢;

? ? ? 2)獲取各個有效柵格對應的地址信息

? ? ? ? ? ? 獲取每個有效柵格對應的經緯度,去請求地圖服務商google、baidu、高德、搜狗等的地址反解析服務接口,獲得相應結構化地址信息并進行插入。

? ? ? ?上述兩個步驟也可以合二為一,確定了有效柵格后即可請求地圖服務商接口,并將geohash編碼、結構化地址信息和時間戳信息插入到數據庫中。

b)線上服務

? ? ? 對一個用戶請求,首先得到經緯度,通過geohash對該經緯度編碼,從而查找數據庫,如果找到便直接返回,如果沒找到或離上次更新時間與現在間隔超過一個月(具體時間可以動態設置)之內,則請求第三方地址反解析接口,并將更新任務放在任務隊列里實現異步更新。

圖6 柵格思路的地址反解析方案?

轉載于:https://www.cnblogs.com/LBSer/p/4507829.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257296.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257296.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257296.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

html5 hr代碼縮減比例,HTML HR size用法及代碼示例

DOM HR size屬性用于設置或返回元素的size屬性的vlue。用法:它返回HR大小屬性。hrobject.size用于設置HR大小屬性。hrobject.size"value"屬性值&#xff1a;value:它包含指定HR元素高度的像素值。返回值&#xff1a;它返回一個字符串值&#xff0c;該值代表HR元素的高…

【轉】C++標準轉換運算符static_cast

static_cast<new_type> (expression) 雖然const_cast是用來去除變量的const限定&#xff0c;但是static_cast卻不是用來去除變量的static引用。其實這是很容易理解的&#xff0c;static決定的是一個變量的作用域和生命周期&#xff0c;比如&#xff1a;在一個文件中將變量…

MySQL Binlog Mixed模式記錄成Row格式

背景&#xff1a; 一個簡單的主從結構&#xff0c;主的binlog format是Mixed模式&#xff0c;在執行一條簡單的導入語句時&#xff0c;通過mysqlbinlog導出發現記錄的Binlog全部變成了Row的格式&#xff08;明明設置的是Mixed&#xff09;&#xff0c;現在就說說在什么情況下Bi…

update語句中使用子查詢

55. 更改 108 員工的信息: 使其工資變為所在部門中的最高工資, job 變為公司中平均工資最低的 job 1). 搭建骨架 update employees set salary (), job_id () where employee_id 108; 2). 所在部門中的最高工資 select max(salary) from employees where department_id ( s…

html后臺數據分類管理,細分數據.html

&#xfeff;細分數據$axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; };$axure.utils.getOtherPath function() { return resources/Other.html; };$axure.utils.getReloadPath function() { return resources/reload.html; };…

SpringBoot的配置文件加載順序和使用方式

1、bootstrap.properties bootstrap.properties 配置文件是由“根”上下文優先加載&#xff0c;程序啟動之初就感知 如&#xff1a;Spring Cloud Config指定遠程配置中心地址&#xff0c;就要在這個文件中指定。這樣才能在啟動之初發現遠程配置中心&#xff0c;并從遠程獲取配置…

Get請求

寫在前面的話 XMLHttpRequest對象的open方法的第一個參數為request-type,取值可以為get或post.本篇介紹get請求. get請求的目的,主要是為了獲取數據.雖然get請求可以傳遞數據,但傳遞數據的目的是為了告訴服務器,給我們什么內容. 使用get請求時,參數都是隨url進行傳遞的. 使用ge…

css3中的BFC,IFC,GFC和FFC(轉載)

作者原文網址&#xff1a;http://www.cnblogs.com/dingyufenglian/p/4845477.html What‘s FC&#xff1f; 一定不是KFC&#xff0c;FC的全稱是&#xff1a;Formatting Contexts&#xff0c;是W3C CSS2.1規范中的一個概念。它是頁面中的一塊渲染區域&#xff0c;并且有一套渲染…

javaweb學習總結——Filter高級開發

在filter中可以得到代表用戶請求和響應的request、response對象&#xff0c;因此在編程中可以使用Decorator(裝飾器)模式對request、response對象進行包裝&#xff0c;再把包裝對象傳給目標資源&#xff0c;從而實現一些特殊需求。 一、Decorator設計模式 1.1、Decorator設計模…

html期末網頁設計,求網頁設計的期末作業一份 HTML的

1&#xff0e; 課程設計建議主題方向&#xff1a;電子商務類網站、門戶類網站、專題類網站。整體要求&#xff1a;主題鮮明、健康&#xff1b;風格自然、內容充實、完整&#xff1b;布局合理&#xff0c;配色和諧。(5分)2&#xff0e; 網站至少包括15張頁面(包括首頁)&#x…

Android(java)學習筆記10:同步中的死鎖問題以及線程通信問題

1. 同步弊端&#xff1a; &#xff08;1&#xff09;效率低 &#xff08;2&#xff09;如果出現了同步嵌套&#xff0c;就容易產生死鎖問題 死鎖問題及其代碼 &#xff1a; &#xff08;1&#xff09;是指兩個或者兩個以上的線程在執行的過程中&#xff0c;因爭奪資源產生的一種…

4源代碼的下載和編譯

1、Android移植主要就是Linux內核移植&#xff0c;而Linux內核移植主要是Linux驅動移植&#xff0c;為了開發和測試Linux驅動&#xff0c;要在Ubuntu下搭建兩套開發環境&#xff1a;Android應用程序開發環境和Linux內核開發環境&#xff1b; 2、Android源代碼包括&#xff1a;內…

在html中三個圖片切換,輕松搞定網頁中的圖片切換

生活中經常看到&#xff0c;像新浪等很多門戶網站的首頁都有滾動圖片的展示&#xff0c;如下圖所示&#xff1a;某網站首頁滾動切換圖片這樣不但可以減少文字的單一、乏味&#xff0c;而且可以直觀內容&#xff0c;更好的吸引用戶。那在我們做軟件系統時&#xff0c;是否也可以…

python 進程編程速成

python具有thread多線程庫&#xff0c;但多線程并不是真正的多線程&#xff0c;不能充分利用多核CPU資源。 在大多數情況下&#xff0c;python可以使用multiprocessing多進程庫&#xff0c;可以輕松完成從單進程到并發執行的轉換。 multiprocessing庫支持子進程、通信和共享數據…

requirejs(shim)處理加載非AMD規范的js庫

使用requirejs加載模塊&#xff0c;模塊的定義得遵守AMD規范&#xff0c;也即定義模塊的時候使用如下函數定義模塊: 1 define(function(){ 2 var private function(){ 3 console.log(私有方法...); 4 }; 5 return { 6 public:funct…

關于常用meta的總結

入行也半年了&#xff0c;無數次的想過寫博客也無數次的想過第一篇會寫什么&#xff0c;一直沒有落實。今天心血來潮把博客開了&#xff0c;那就寫點東西吧。第一篇就寫一寫看似簡單但又經常不注意到的meta標簽吧。&#xff08;博主經驗尚淺&#xff0c;有許多理解不到位的地方…

計算機應用基礎18春在線作業1答案,東師計算機應用基礎-18春在線作業1.docx

東師計算機應用基礎18春在線作業11、A 2、C 3、C 4、C 5、B一、單選題共25題&#xff0c;62.5分1、國際區位、全拼雙音、五筆字型和自然碼是不同種類的漢字A外碼B內碼C字型碼D交換碼正確答案是&#xff1a;A2、漢字字形碼的使用是在____A輸入時B內部傳送時C輸出時D兩臺計算機之…

jQuery Validate 驗證,校驗規則寫在控件中的具體例子

將校驗規則寫到控件中 <script src"../js/jquery.js" type"text/javascript"></script> <script src"../js/jquery.validate.js" type"text/javascript"></script> <script src"./js/jquery.metadata…

在oracle中使用Trigger

1、初始目標 在對表h1插入一條數據時&#xff0c;同時插入一條重復的數據&#xff08;只有主鍵不同&#xff09; 2、在PL/SQL里New一個Trigger或者手動敲入代碼 先說明一下&#xff0c;表h1包括4列ID、C1、C2、C3 create or replace trigger Trigger_Testafter insert on h1for…

html突出顯示,javascript-記住html頁面中突出顯示的文本(向html頁面添加注釋)

我有一個HTML文件,我正在用webkit打開它,我想開發一個應用程序,這樣,在打開它之后,我應該能夠選擇一些文本并將其突出顯示(例如,按下“ highlight text”按鈕).并且它應該記住突出顯示的文本,以便下次打開時應自動突出顯示相同的文本…要存儲哪些信息,以便下次可以突出顯示相同…