GeoHash在POI的地理圍欄定位使用

LBS

LBS英文全稱為Location Based Services, 通過電信移動運營商的無線電通訊網絡(如GSM網、CDMA網)或外部定位方式(如GPS)獲取移動終端用戶的位置信息(地理座標,或大地座標),在GIS(Geographic Information System,地理信息系統)平臺的支持下,為用戶提供相應服務的一種增值業務。如尋找用戶當前位置1公里範圍內的賓館、影院、圖書館、加油站等的名稱和地址。包括兩層含義:

  • 確定移動設備或用戶所在的地理位置;
  • 供與位置相關的各類信息服務。

商業模式

  • 休閒娛樂模式。簽到模式用戶主動簽到記錄自己所在位置;通過積分、勳章以及領主等榮譽激勵用戶;通過商家合作,對獲得特定積分或勳章的用戶提供優惠或折扣獎勵,同時營銷商家品牌;通過綁定用戶其它工具以同步分享用戶位置信息;通過鼓勵用戶對地點商戶評價產生優質內容。大富翁遊戲模式,讓用戶用手機購買現實地理位置的虛擬房產與道具,並進行消費與互動等將現實和虛擬融合的模式。特點是趣味性,可玩性與互動性更強,比簽到模式更具粘性商業模式除了聯合商家營銷外,還可提供增值服務,以及植入廣告等。
  • 生活服務模式周邊服務搜索:如大眾點評網。主要體驗在工具實用,問題在信息量積累和覆蓋面要比較廣泛。與旅遊結合:LBS和旅遊的結合是十分切合的。分享攻略和心得體現了一定的社交性質,代表是遊玩網。會員卡與票務模式:一卡捆綁多種會員卡,電子會員卡記錄消費習慣信息,如Mokard、Eventbee。
  • 社交模式地點交友,即時通訊:不同用戶因為在同一時間處於同一地理位置構建用戶關鍵,如兜兜友。以地理位置為基礎的小型社區:如區區小事
  • 商業型LBS+團購:兩者都有地域性,用戶到本地簽約商家後簽到,到達一定數量就可以得到折扣或優惠。優惠信息推送:提供基於位置的優惠信息推送,盈利模式是通過和線下商家合作利益分成。店內模式:將用戶吸引到指定商場,完成指定行為後便贈送可兌換成商品或禮券的虛擬點數。
  • 其他模式例如小企業自建地理圍欄或者其他定位服務。

GeoHash的使用

給定經緯,獲取該位置周圍1000米的餐館或者ip地址。通過遍歷計算所有地標與目標點距離,顯然效率低下。GeoHash是二維的空間經緯度數據編碼成一個字符串的地址編碼方法。例如,美羅城的經緯度是[31.1932993, 121.43960190000007],下面計算該位置對應的GeoHash值。安裝需要的python包pip install python-geohash代碼:

<code>import geohash

longitude, latitude = 121.43960190000007, 31.1932993
hashcode = geohash.encode(latitude, longitude, precision=6) # 編碼
print(hashcode)
# 輸出 wtw37q

print(geohash.neighbors(hashcode)) # 8個近鄰編碼
# 輸出 ['wtw37n', 'wtw37w', 'wtw37p', 'wtw37r', 'wtw37x', 'wtw37j', 'wtw37m', 'wtw37t']/<code>

顯示如下圖:

GeoHash在POI的地理圍欄定位使用

wtw37q即為美羅城座標對應的矩形區域,該區域內所有的經緯度的geohash字符串前6位均為wtw37q。geohash長度與精度對應的關係

GeoHash在POI的地理圍欄定位使用

字段越長,精度越高,即對應的矩形範圍越小。因此僅需確定大致的精度範圍和geoHash字符串對應長度。

POI地理圍欄問題

在實際運用中,給定任意的經緯度座標,要快速定位對應到POI地理圍欄中。

方案一:計算圍欄範圍內所有的GeoHash編碼該場景封裝為函數:輸入組成圍欄的點經緯度座標集合和指定的geohash長度,輸出一組geohash編碼。不過該方法存在邊界周圍部分點缺失情況。

<code>def getHashByFence(point_list,geohash_length):
···
···
return geohas_list/<code>

算法步驟:

  1. 輸入圍欄點座標集合point_list和指定的geohash長度length
  2. 計算圍欄的外包矩形的左上角和右下角座標lat_min、lat_max、lng_min、lng_max
  3. 根據lat_min、lat_max、lng_min、lng_max,計算外包矩形對角定點的距離d
  4. 以外包矩形中心點為圓心,以d/2為半徑做一個圓,計算圓覆蓋範圍內的geohash4.1 獲取圓的外包矩形左上角和右下角定點座標經緯度,存儲到double[] locs4.2 根據geohash字符長度計算該長度geohash編碼對應的經緯度間隔(latA,lngA)4.3 根據latA和lngA,計算出locs組成的矩形的左上角和右下角定點的經緯度,在geohash劃分的網格的索引(也就是第幾個),分別記為lat_min,lat_max,lng_min,lng_max4.4 計算lat_min,lat_max,lng_min,lng_max對應範圍內左右geohash的二進制編碼,然後將經緯度二進制編碼uncode為geohash字符編碼,保存為Set。
  5. 剔除sets中geohash編碼對應矩形的中心點不在points圍欄範圍內的geohash,得到最終的geohash結果集。

方案二:利用GeoHash編碼對應的是地理區域屬性

利用瓦片思想,大幅減少遍歷次數,保證精度。

算法步驟:

  1. 因為poi對應區域較小,對poi中心點計算geohash值,字符串長度為6-8左右即可。
  2. 如果座標落在區域內,則遍歷該區域下所有的poi,使用點是否多邊形在多邊形內算法判斷。
  • https://blog.csdn.net/Nick_php/article/details/52319662
  • https://www.jianshu.com/p/1ecf03293b9a
  • https://halfrost.com/go_spatial_search/


分享到:


相關文章: