我有三个数据:
- user's current lat/lng
- company's current lat/lng
- bounding distance
我需要检查用户的lat/lng
是否在bounding distance
(例如100米)创建的圈子内,并使用公司的lat/lng
作为中心。我希望这是有道理的......
使用这三个值,我真正需要的是真/假 是他们还是不在这个空间。
不使用任何DB添加剂,ala geodjango会很棒。
感谢任何帮助, 感谢
答案 0 :(得分:0)
我删除了以前的版本,使用弧度,并在答案的最终格式中集成了连续编辑
要使用以下内容,user
是地球上的一个位置,必须由长度为2的元组/列表/ ndarray表示,第一个元素是纬度,以度为单位,第二个元素是经度,以度为单位同样...... company
的位置必须以相同的方式表示,最后必须以米为单位指定radius
。 (还有一个debug
可选变量,可以打印调试帮助)
def is_close(user,company,radius, debug=0):
"user=(lat, lon) in degrees, company=(lat, lon), radius in m"
from math import cos, pi, sqrt
EarthRadius = 6.371E6 # metre, = 6371 km
deg2rad = pi/180.0
# localize the equirectangular projection to the latitude
# (the 1st coordinate) of the company
radius_x = EarthRadius*cos(company[0]*deg2rad)
radius_y = EarthRadius
dx, dy = ((user[1]-company[1])*deg2rad*radius_x,
(user[0]-company[0])*deg2rad*radius_y)
if debug:print dx, dy, sqrt(dx*dx+dy*dy)
return True if (dx*dx+dy*dy) <= (radius*radius) else False
最终使用用户列表的版本绕过函数调用开销
def are_close(users, company, delta):
from math import cos, pi
# uses angles in degrees, uses Equirectangular projection
rx = 6.371E6*pi/180.*cos(company[0]*pi/180)
ry = 6.371E6*pi/180.
close = []
for user in users:
dx = (user[1]-company[1])*rx
dy = (user[0]-company[0])*ry
close.append(True if dx*dx+dy*dy-r*r <= 0 else False)
return close
交互式提示的使用示例
>>> def is_close(user,company,radius, debug=0):
... from math import cos, pi, sqrt
... EarthRadius = 6.371E6 # metre, = 6371 km
... deg2rad = pi/180.0
... radius_x = EarthRadius*cos(company[0]*deg2rad)
... radius_y = EarthRadius
... dx, dy = ((user[1]-company[1])*deg2rad*radius_x,
... (user[0]-company[0])*deg2rad*radius_y)
... if debug:print dx, dy, sqrt(dx*dx+dy*dy)
... return True if (dx*dx+dy*dy) <= (radius*radius) else False
...
>>> user, company = (48.860384,2.338520), (48.859282,2.343369)
>>> is_close(user,company,500, 1)
-354.73500519 122.536809163 375.302802424
True
>>> is_close(user,company,500)
True
>>>