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))