如何在 python 中写这个

How to write this in python

我在编写代码方面不是很有经验。有人可以帮我吗?

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

基本上在 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 将纬度和经度转换为 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 循环中有这个和其他一些要点。可能有更好的方法,但这行得通。 再次感谢大家的帮助!

只需将其包装在 if 中的条件检查中。

不是特定语言,而是总体思路

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

如果您的语法 &c 得到纠正(那些字符串肯定是错误的),您将检查一个正方形,而不是一个圆。

假设 point_latgps_lat、&c 都是数字(不是字符串),并以英尺表示(并假设 _log_lon 的拼写错误,代表 "longitude"),你需要:

import math

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

math.hypot 应用毕达哥拉斯定理来计算直角三角形与给定的其他两条边的斜边——这也恰好是两点之间的距离。 "The two points are less than 10 feet apart" 根据需要定义一个

如果纬度和经度不是以英尺为单位测量的数字,您需要将它们设为这样,例如使用适当的比例因子将字符串转换为 float and/or。

首先,您需要修改支票。如果你想检查你是否在 10 英尺半径的气泡内,你需要使用毕达哥拉斯,否则你正在检查你是否在 20x20 英尺的正方形内。例如,如果您在纬度和经度上都距离该点 9 英尺,这意味着您实际上距离目标点 12.73 英尺,在 10 英尺的气泡之外,但您的代码会产生误报。

圆的公式是 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 米范围内有效,这几乎正好等于您的半径。这意味着你必须小心执行检查的方式,否则当你靠近目标区域时你会收到很多 "You are at point 1" 消息,因为你的明显位置可以在两个轴上跳跃 +/- 3 米,即使你站着不动。您可能必须使用 运行 平均值或类似的东西来提高原始准确性。

一个实用的解决方案是有一个起点并计算各个实例以查看它是否满足条件。

为了方便起见,我们导入 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 将是您的位置测试是否满足条件。