測試 根據位置經緯度返回最近的Geohash

2021-10-02 06:22:20 字數 4436 閱讀 2880

# 現在要做:

# 2:取geohash的前n位

# 3:計算前位geohash的demand

#4 返回離司機最近的最有可能接單的geohash位置和demand

from pygeohash import encode, decode

import plotly

import plotly.plotly as pyf

import plotly.graph_objs as go

import numpy as np

import pandas as pd

import math

from matplotlib.path import path

import numpy as np

import plotly.offline as of

import plotly.graph_objs as go

import plotly.plotly as py

import numpy as np

import pandas as pd

import folium

import webbrowser

from folium.plugins import heatmap

import datetime

import time

import pymysql.cursors

import decimal

import geohash

defgeo_demand

(geo_top_number)

:#按照時間獲取每個geo的接客概率

conn = pymysql.connect(

host=

'localhost'

, port=

3306

, user=

'root'

, passwd=

'xu19931026'

, db=

'cd_taxi'

, charset=

'utf8'

)if conn:

print

("連線成功!"

) cursor = conn.cursor(

)# 獲取游標

sql =

"select geohash,number,cast(number/(select count( 0 ) from order_data where from_unixtime(begintime) <'2016-11-01 24:00:00') as char(15))as demand from (select left(`order_data`.`geo`,%s) as `geohash`,count(0) as `number` from `order_data` where (from_unixtime(`order_data`.`begintime`)< '2016-11-01 24:00:00') group by `geohash` order by `number` desc) as t;"

cursor.execute(sql,geo_top_number)

conn.commit(

) result = cursor.fetchall(

) df =

list

(result)

# 將元組轉換為列表

conn.close(

)# 關閉資料庫連線

print

('資料庫處理資料完畢'

) geo_dict =

# 字典

geo_list =

order_number =

demand =

for point in df:

(point[0]

))# 將字串的經緯度轉換為float格式1]

)# 50610之類的本身就是int

float

(point[2]

))# decimal轉為float

num =

len(geo_list)

# num為陣列大小

geo_data =

[[geo_list[i]

, demand[i]

]for i in

range

(num)

] geo_nb =

[[geo_list[i]

, order_number[i]

]for i in

range

(num)

]return geo_data,geo_nb #返回geohash對應的訂單量與訂單量百分比即demand

defget_geohash

(lon, lat)

:#生成geohash

geo = geohash.encode(lat, lon)

# precision=9可以加精度

return geo

defmost_geo

(lon,lat,geo_data,geo_top_suzi)

:#返回離司機最近的最有可能接單的geohash位置和demand

n=1 mysql_controln=geo_top_suzi

taxi_geo=

most_geo_lis=

taxi_geo1=

taxi_geo1=get_geohash(lon,lat)

#生成司機位置座標的geo

#取司機資料庫裡的geo字母的前n個和mysql中取出的保持一致

taxi_geo=taxi_geo1[0:

int(geo_top_suzi)

]#取司機資料庫裡的geo字母的前n個和mysql中取出的保持一致

i=0while i<

len(geo_data)

:if geo_data[i][0

]==taxi_geo:

#第0列是geohash,如果和計程車的geohash相等

[geo_data[i][0

],geo_data[i][1

]])#存放相等的geohash和對應的demand

i+=1if

len(most_geo_lis)==0

:#如果不相等也即沒有新增到列表這時候mysql裡的geohash減少1

mysql_controln-=

1 n=

0return most_geo_lis,mysql_controln,n

if __name__ ==

'__main__'

:print

(" 開始推薦!!! "

)#'2016-11-01 24:00:00'

print

('*********************'

)print

('開始獲取你的座標'

)print

('*********************'

)#接下來要返回離司機最近的最有可能接單的geohash位置和demand

print

(" 請按照格式輸入經度:例:104.0360900 "

) lon =

float

(input

("請輸入:"))

print

(" 請按照格式輸入緯度:例:30.6226900 "

) lat =

float

(input

("請輸入:"))

taxi_geo1 = get_geohash(lon, lat)

# 生成司機位置座標的geo

a=len(taxi_geo1)

#a為司機座標生成的geohash的長度 根據座標生成的一般都是12位的geohash

print

(' 座標geo已經生成:%s,geohash的長度是%d 請等候'

%(taxi_geo1,a)

) geo_data, geo_nb = geo_demand(a)

# 返回mysql裡的長度為司機長度的geohash對應的訂單量與訂單量百分比即demand

most_geo_lis,mysql_controln,n = most_geo(lon,lat,geo_data,a)

#查詢mysql裡有沒有對應的geohash

while n==0:

#只要是n=0說明沒有一樣的geohash,此時重新取資料庫

geo_data, geo_nb = geo_demand(mysql_controln)

#繼續計算資料庫

most_geo_lis,mysql_controln,n = most_geo(lon,lat,geo_data,mysql_controln)

#繼續計算mysql_controln

根據經緯度,查詢最近距離

select eden product.product number,6371 acos cos radians 31.398876 cos radians product adress y cos radians product adress x radians 121.467962 sin ra...

iOS獲取地理位置,根據經緯度獲取省市街道

首先要在工程的info.plist裡面新增key和value。value是你請求位置提示使用者的資訊,如下圖。當然也可以不填。nslocationalwaysusagedescription 應用一直可以訪問地理位置 nslocationwheninuseusagedescription 應用在使用...

Android之獲取網路位置的經緯度

這一篇想說一下基於網路的位置提供者獲取到經緯度 直接貼 吧,我是獲取了聚合資料的位置,然後在獲取到經緯度的,其實也可以獲取到自己位置的經緯度,那就是 public class mainactivity extends activity 位置服務可用 override public void onpr...