假設一個應用有不少的用戶位置信息基礎數據,抽象數據格式以下:html
user_id
|
date
|
time
|
address
|
province
|
city
|
district
|
latitude
|
longitude
|
---|---|---|---|---|---|---|---|---|
user1 | 2018-01-01 | 12:00:00 | 北京市朝陽區朝陽大悅城 | 北京 | 北京 | 朝陽 | 1.1 | 1.2 |
... |
應用裏有一些須要根據地址位置定位用戶的需求,抽象問題是任給一塊區域找出該區域內全部的user_id,具體以下:git
這裏須要兩個基礎函數,sql
一個是根據兩個點的經緯度計算距離,calDistance;http://www.javashuo.com/article/p-nfffkexv-gr.html函數
一個是判斷一個點是否在給定的多邊形內,isInPolygon;http://www.javashuo.com/article/p-aektebzd-bg.html優化
方案一中會作大量的無用計算,並且calDistance和isInPolygon這兩個高階浮點計算很是昂貴spa
爲了優化這些無用計算獲得方案二以下:htm
方案二能夠抽象爲映射,第一輪映射是利用省市區信息來減小讀取數據量,第二輪映射是利用是否在正方形外來減小計算數據量;而且這兩輪映射都是現成的,或者很容易計算的;若是把映射改成網格grid,則效果比上述兩輪映射更好,獲得方案三以下:blog
另外還能夠利用ElasticSearch對GIS的支持 https://www.elastic.co/blog/geo-location-and-search內存