我在编写代码时没有太多经验。有人可以帮助我吗?
我正在尝试编写一些简单的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循环中有一些其他几点。可能有更好的方法,但嘿,这是有效的。 再次感谢您的帮助!
答案 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
,其中x
和y
是沿正交轴的增量,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_lat
,gps_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)
lat1
和lon1
将是您的开始,或目标,lat2
和lon2
将成为测试是否符合条件的位置