1. 程式人生 > >LBS地理位置距離計算方法之geohash演算法

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

隨著移動終端的普及,很多應用都基於LBS功能,附近的某某(餐館、銀行、妹紙等等)。
基礎資料中,一般儲存了目標位置的經緯度;利用使用者提供的經緯度,進行對比,從而獲得是否在附近。這裡需要在設定出一個欄位,是關於編碼的欄位,一會看下文哈……


地理位置距離實現目標:
查詢附近多少公里內的人或者商家

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

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

geohash有以下幾個特點:

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

某些情況下無法在兩列上同時應用索引 (例如MySQL 4之前的版本,Google App Engine的資料層等),利用geohash,只需在一列上應用索引即可。

(這裡插一句:我們的mysql為欄位建立的索引,其實原理就是利用二分法演算法來做路徑查詢簡化,快速查找出想要的欄位位置)

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

使用者可以釋出地址編碼,既能表明自己位於北海公園附近,又不至於暴露自己的精確座標,有助於隱私保護。

第三:編碼的字首可以表示更大的區域。


例如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多萬行測試資料):
  • 索引:




其他資料:

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

相關推薦

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

隨著移動終端的普及,很多應用都基於LBS功能,附近的某某(餐館、銀行、妹紙等等)。基礎資料中,一般儲存了目標位置的經緯度;利用使用者提供的經緯度,進行對比,從而獲得是否在附近。這裡需要在設定出一個欄位,是關於編碼的欄位,一會看下文哈…… 地理位置距離實現目標:查詢附近多少公里內的人或者商家 比如:微信、陌

PHP實現搜索地理位置計算兩點地理位置距離的實例

IE reac mongod error 時代 dex 功能 pan [] 地理位置搜尋LBS,存儲每個地點的經緯度坐標,搜尋附近的地點,建立地理位置索引可提高查詢效率。mongodb地理位置索引,2d和2dsphere,對應平面和球面。 1.創建lbs集合存放地點坐標

SQL Server地理位置資訊計算兩點經緯度距離

計算兩點距離,4326是空間引用識別符號,4326代表GCS-WGS-1984座標系,是系統預設的座標系。 地理座標系空間需要用geography ,平面座標系空間用geometry,計算距離使用STDistance DECLARE @g geography; DECLA

地理空間距離計算優化

場景 sina 區間 -type 如果 北京地區 滿足 快速 產生 #1 地理空間距離計算面臨的挑戰 打開美團app,不管是篩選團購還是篩選商家,默認的排序項都是“離我最近”或者“智能排序”(如下圖所示)。 手機

點 線 面 最小距離計算方法

Minimum Distance between a Point and a Line Written by Paul Bourke October 1988 This note describes the technique and gives the soluti

兩經緯度點之間的距離計算方法

方法一 /* 計算經緯度之間的距離公式 */ function getRad(d) { var PI = Math.PI; return d * PI / 180.0; } /** * 獲

HorizontalScrollView的滾動到指定位置計算方法

//初始化偏移量 private int offset = 0; private int scrollViewWidth = 0;//獲取位置下標final Button btn=bt_list.

Java 地球上計算兩點之間距離計算方法

(1)包含經緯度的點物件 package com.ict.dto; /** * Created by chenlong on 2017/7/6. * Info: */ public cla

mongodb實現lbs地理位置查詢附近的商家

本文借鑑 http://blog.csdn.net/fdipzone/article/details/46285521 Java 程式碼 //查詢地理位置的條件 List&

計算方法非線性方程組求解

非線性方程求根數值解法 實驗目的 (1)通過對二分法與牛頓迭代法做程式設計練習和上機運算,進一步體會二分法和牛頓法的不同。 (2)編寫割線迭代法的程式,求非線性方程的解,並於牛頓迭代法作比較。 一、實驗內容 1、用牛頓迭代法求下列方程的根 (

微信 根據當前地理位置經緯度計算1000米以內的經緯度範圍 php版

核心PHP程式碼如下! $myLat = $postObj->Location_X;//接收到的當前位置的緯度 $myLng = $postObj->Location_Y;//接收到的當前位置的經度 $Label = $postO

距離計算方法

1、歐式距離(歐幾里得距離) 歐式距離是最易理解的距離定義,即各座標點的座標之差的平方和相加,然後開根號。 二維平面上點 與點 之

HAWQ + MADlib 玩轉資料探勘(七)——關聯規則方法Apriori演算法

一、關聯規則簡介        關聯規則挖掘的目標是發現數據項集之間的關聯關係,是資料挖據中一個重要的課題。關聯規則最初是針對購物籃分析(Market Basket Analysis)問題提出的。假設超市經理想更多地瞭解顧客的購物習慣,特別是想知道,哪些商品顧客可能會在一次購

關聯規則方法apriori演算法

        Apriori algorithm是關聯規則裡一項基本演算法,是由Rakesh Agrawal和Ramakrishnan Srikant兩位博士在1994年提出的關聯規則挖掘演算法。關聯規則的目的就是在一個數據集中找出項與項之間的關係,也被稱為購物藍分析 (M

Python地理位置資訊庫geopy的使用(二):根據中心點座標,方向,距離計算座標

上一篇文章我們介紹了geopy的基本使用,這一篇文章我們根據中心點座標,方向,距中心點距離計算出對應的座標點,這種用法官網並沒有給出詳細的文件,我們這裡做一下說明 生成座標點的具體方法 import geopy.distance def get_dista

HTML5API獲取地理位置詳解

ava scrip 什麽是 全球定位 程序 script 坐標 無線 顯示 在使用地理位置API之前先來了解一下什麽是經度和緯度以及地理位置獲取的原理 首先經度指的是南北極的連接線,緯度指的是東西的連接線 地理位置的獲取原理是通過IP地址(能夠知道這個IP地址屬於哪個城市)

Kossel的一種滑塊位置計算方法

定義 運行 pos 平面 當前 並不是 post then 傳感器 做了一個小激光雕刻機之後,研究了一下這款3D打印機的結構和工作原理,一下就對這個運動過程很感興趣,這三個桿是怎麽聯動使得噴頭保持在一個平面上運動呢?打算先做一個架構,然後把激光器放在上面不是

Python地理位置信息庫geopy的使用(二):根據中心點坐標,方向,距離計算坐標

block 我們 code ram des int pri 經緯 kilo 上一篇文章我們介紹了geopy的基本使用,這一篇文章我們根據中心點坐標,方向,距中心點距離計算出對應的坐標點,這種用法官網並沒有給出詳細的文檔,我們這裏做一下說明 生成坐標點的具體方法 impor

地理位置geo處理mysql函式

目前越來越多的業務都會基於LBS,附近的人,外賣位置,附近商家等等,現就討論離我最近這一業務場景的解決方案。 原文:https://www.jianshu.com/p/455d0468f6d4 目前已知解決方案有: mysql 自定義函式計算

小程式獲取使用者的地理位置與商家的相距距離

getUserLocation: function () { let vm = this; wx.getSetting({ success: (res) => { console.log(JSON.stringify(res))