用户的lat / lng是否在公司的lat / lng边界内

时间:2014-12-05 05:33:25

标签: python django

我有三个数据:

- user's current lat/lng
- company's current lat/lng
- bounding distance

我需要检查用户的lat/lng是否在bounding distance(例如100米)创建的圈子内,并使用公司的lat/lng作为中心。我希望这是有道理的......

使用这三个值,我真正需要的是真/假 是他们还是不在这个空间。

不使用任何DB添加剂,ala geodjango会很棒。

感谢任何帮助, 感谢

1 个答案:

答案 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
>>>