LBS地理位置距離計算方法之geohash算法

隨着移動終端的普及,不少應用都基於LBS功能,附近的某某(餐館、銀行、妹紙等等)。
基礎數據中,通常保存了目標位置的經緯度;利用用戶提供的經緯度,進行對比,從而得到是否在附近。這裏須要在設置出一個字段,是關於編碼的字段,一會看下文哈……php


地理位置距離實現目標:
查找附近多少千米內的人或者商家mysql

好比:微信、陌陌、美團、基於O2O的一些APP這些應用或者移動網頁都須要用到地理位置計算android

目前來講:移動地理位置距離計算比較好的算法是geohash,特此整理分享。git

 

geohash有如下幾個特色:github

第一:geohash用一個字符串表示經度和緯度兩個座標。算法

某些狀況下沒法在兩列上同時應用索引 (例如MySQL 4以前的版本,Google App Engine的數據層等),利用geohash,只需在一列上應用索引便可。sql

(這裏插一句:咱們的mysql爲字段建立的索引,其實原理就是利用二分法算法來作路徑查詢簡化,快速查找出想要的字段位置)數據庫

第二:geohash表示的並非一個點,而是一個矩形區域。好比編碼wx4g0ec19,它表示的是一個矩形區域。 微信

使用者能夠發佈地址編碼,既能代表本身位於北海公園附近,又不至於暴露本身的精確座標,有助於隱私保護。ide

第三:編碼的前綴能夠表示更大的區域。


例如wx4g0ec1,它的前綴wx4g0e表示包含編碼wx4g0ec1在內的更大範圍。 這個特性能夠用於附近地點搜索。首先根據用戶當前座標計算geohash(例如wx4g0ec1)而後取其前綴進行查詢 (SELECT * FROM place WHERE geohash LIKE 'wx4g0e%'),便可查詢附近的全部地點。

Geohash比直接用經緯度的高效不少。

 

Geohash的原理

Geohash的最簡單的解釋就是:將一個經緯度信息,轉換成一個能夠排序,能夠比較的字符串編碼

 

geohash能作到:

require_once('geohash.class.php');
$geohash = new Geohash;
//獲得這點的hash值
$hash = $geohash->encode(39.98123848, 116.30683690);
//取前綴,前綴約長範圍越小
$prefix = substr($hash, 0, 6);
//取出相鄰八個區域
$neighbors = $geohash->neighbors($prefix);
array_push($neighbors, $prefix);

print_r($neighbors);
  • 獲得9個geohash值
//獲得9個geohash值

Array
(
  [top] => wx4eqx
  [bottom] => wx4eqt
  [right] => wx4eqy
  [left] => wx4eqq
  [topleft] => wx4eqr
  [topright] => wx4eqz
  [bottomright] => wx4eqv
  [bottomleft] => wx4eqm
  [0] => wx4eqw
)

  

  • 範圍如圖:
  • 用sql語句查詢
  • SELECT * FROM xy WHERE geohash LIKE 'wx4eqw%';
    SELECT * FROM xy WHERE geohash LIKE 'wx4eqx%';
    SELECT * FROM xy WHERE geohash LIKE 'wx4eqt%';
    SELECT * FROM xy WHERE geohash LIKE 'wx4eqy%';
    SELECT * FROM xy WHERE geohash LIKE 'wx4eqq%';
    SELECT * FROM xy WHERE geohash LIKE 'wx4eqr%';
    SELECT * FROM xy WHERE geohash LIKE 'wx4eqz%';
    SELECT * FROM xy WHERE geohash LIKE 'wx4eqv%';
    SELECT * FROM xy WHERE geohash LIKE 'wx4eqm%';
    
  • 看一下是否用上索引 (一共有50多萬行測試數據):
  • 索引:




其餘資料:

- geohash演示: http://openlocation.org/geohash/geohash-js/

- wiki: http://en.wikipedia.org/wiki/Geohash

- 原理: https://github.com/CloudSide/geohash/wiki

 

 

移動端地理算法探討 交流QQ: 187395037 

相關文章
相關標籤/搜索