如何在python中写这个

时间:2015-02-14 01:35:41

标签: python gps

我在编写代码时没有太多经验。有人可以帮助我吗?

我正在尝试编写一些简单的python来处理一些GPS坐标。基本上我想让它检查gps是否是我的一点+或十英尺然后打印,如果它是真的。想想我得到了那部分,但我不确定这一部分。在gps =点之后,我希望它只打印我在这里一次,直到下一次是真的。

基本上在gps坐标周围设置一个10英尺的气泡,如果我走进那个气泡打印“我在这里”只是一次,直到我走出去并重新进入气泡。那有意义吗?

if "point_lat-10feet" <= gps_lat <= "point_lat+10" and "point_log-10" <= gps_log <= "point_log+10"
Print "You are at point 1"

更新

最后还有一些时间来完成这个项目,这是它最终的结果 我使用包utm 0.4.0将lat和long转换为Utm北和东。

north, east, zone, band = utm.from_latlon(gpsc.fix.latitude, gpsc.fix.longitude)
northgoal, eastgoal, heading = (11111, 22222, 90)

# +- 50 degree 
headerror = 50

#bubble size 10m 
pointsize = 10

flag = False

if ((north - northgoal) ** 2) + ((east - eastgoal) ** 2) <= (pointsize ** 2) and  ((heading - headerror) % 360) <= gpsc.fix.track <= ((heading + headerror) % 360):
            if not flag :
                print "Arriving at point 1" , north, east, gpsc.fix.track, gpsc.fix.speed
                flag = True
            else:
                print "Still inside point 1"

        else:
           # print "Outside point 1"
            flag = False

我在while循环中有一些其他几点。可能有更好的方法,但嘿,这是有效的。 再次感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

将其包装在if。

中的条件检查中

不是语言特定的,而是一般的想法

if <in coord condition>
    if <not printed condition>
       print
       set print condition
else
    clear print condition

答案 1 :(得分:1)

首先,您需要修改支票。如果你想检查你是否在10英尺半径的气泡内,你需要使用毕达哥拉斯,否则你要检查你是否在一个20x20英尺的广场内。例如,如果你距纬度和经度点9英尺,这意味着你实际距离你的目标点12.73英尺,这是在你的10英尺泡沫之外,但你的代码会产生假阳性。 / p>

圆的公式为x^2 + y^2 = r^2,其中xy是沿正交轴的增量,r是您的半径(10英尺。)

然而,请记住,GPS坐标(我假设我们正在谈论大地测量,因为你提到纬度和长度)是以度为单位给出的,因为大地坐标是球形的。因此,您需要将您的位置和目标位置投影到笛卡尔系统(如UTM)中。然后您可以按如下方式修改支票:

if (x - target_x) ** 2 + (y - target_y) ** 2 <= 3.048 ** 2

x是您的X坐标,target_x是目标X坐标等。值3.048是10英尺,以米为单位。我使用米,因为UTM坐标总是用米表示。

接下来,如果我理解正确,您只需要在输入气泡后打印一条消息,并且只有在您离开气泡并重新输入时才会再次打印。在这种情况下,您只需要分别在进入和离开所需区域时设置和取消设置的标记。罗伯特说得对,所以你会有这样的事情:

# Initialize flag here once
printFlag = False

...

# Check if we're in the target area
if (x - target_x) ** 2 + (y - target_y) ** 2 <= 3.048 ** 2:
    if not printFlag :
        print "You are at point 1"
        printFlag = True
else:
    printFlag = False

这将打印消息然后,只要您保留在该区域内,就不会再次打印该消息。但是,最后要记住的是:无辅助GPS只有大约+/- 3米,这几乎与你的半径相等。这意味着你必须要小心如何执行检查,否则当你靠近目标区域时会得到很多“你在第1点”的信息,因为你的视在位置可以跳跃+/- 3米斧头,即使你站着不动。您可能必须使用移动平均值或类似的东西才能提高原始准确度。

答案 2 :(得分:0)

如果你的语法和c被纠正(那些字符串肯定是错误的)你就要检查一个正方形,而不是一个圆圈。

假设point_latgps_lat和&amp; c都是数字(不是字符串),以英尺表示(假设_log_lon的拼写错误,站在&#34;经度&#34;),你需要:

import math

if math.hypot(point_lat - gps_lat, point_lon - gps_lon) < 10:
    print("You are at point 1")

math.hypot适用于毕达哥拉斯&#39;定理用给定的另外两边计算直角三角形的低角度 - 这也恰好是两点之间的距离。 &#34;两点相距不到10英尺&#34;根据需要定义

如果纬度和经度不是以英尺为单位测量的数字,那么您需要制作这样的数字,例如从字符串转换为float和/或使用适当的比例因子。

答案 3 :(得分:0)

一个实用的解决方案是有一个起点并计算个别实例,看它是否符合条件。

为方便起见,让我们导入 pyproj 来计算WGS-84大地水准面的距离。

#!/usr/bin/env python
""" banana """
from pyproj import Geod

def do_distance(lat1, lon1, lat2, lon2):
    """Simple, but accurate, distance"""
    try:
        geoid = Geod(ellps='WGS84')
        bearing_to, bearing_fro, distance = geoid.inv(lon1, lat1, lon2, lat2)
        distance *= 3.2808399  # because you wanted feet
        if distance <= 10:
            print('I am here')
        else:
            print('Still off {0:.0f} feet. Head {1:.0f}° from North'.format(distance, bearing_fro % 360))

    except Exception as error:
        print("Can't calculate because: ", error)

    print(bearing_to % 360, bearing_fro % 360, distance)

lat1 = -15.559752
lon1 = -146.240726
lat2 = -15.561200
lon2 = -146.241407

dd = do_distance(lat1, lon1, lat2, lon2)

lat1lon1将是您的开始,或目标lat2lon2将成为测试是否符合条件的位置