如何在LAT/LON NMEA坐标中获得6位小数

2024-06-02 13:16:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用此模块:

https://github.com/inmcm/micropyGPS/blob/master/micropyGPS.py

不幸的是,micropython中的float仅限于5位小数,例如80.12345

如何获得至少6个,例如80.123456

我知道精确到1米,但我需要更精确


Tags: 模块pyhttpsgithubmastercommicropythonfloat
2条回答

谢谢你的回答。问题是,在收到结果后,我必须进一步计算它,例如到另一个点的距离或一个与另一个航路点之间的方向。如果我理解正确的话,你们的例子仅仅是为了展示结果而不是为了进一步的计算吗

我的caluclates的示例代码:

    def dist_waypoints(self, lat1, lon1, lat2, lon2):
        """
        Calculate distance betweeen two coordinates.
        """
        try:
            lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
            result = 6371 * (acos(sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon1 - lon2)))
            meters = int(result * 1000.0);
            return meters
        except Exception as e:
            self.exception_save(e)
            sys.exit()
            return 0

    def bearing_dest(self, lat1, lon1, lat2, lon2):
        """
        Calculate bearing destination betweeen two coordinates.
        """

        try:
            theta1 = radians(lat1)
            theta2 = radians(lat2)
            delta1 = radians(lat2-lat1)
            delta2 = radians(lon2-lon1)
            y = sin(delta2) * cos(theta2)
            x = cos(theta1)*sin(theta2) - sin(theta1)*cos(theta2)*cos(delta2)
            brng = atan2(y,x)
            bearing = degrees(brng)
            bearing = (bearing + 360) % 360
            return bearing
        except Exception as e:
            self.exception_save(e)
            return 0


我查看了类MicropyGPS,并得出结论,如果不将'dms''dd'作为构造函数的location_formatting(第三个)参数传递,您将在类的内部表示中直接获得该类的latitudelongitude属性,这是由3项组成的list

  • int
  • float分钟
  • str半球('N''S''E''W'

因此,在此表示法中,精度比浮点数多2或3位。我不知道你需要如何用经度和纬度来表示你的目的。如果你需要它们成为一个单独的浮动,那么你就输了。如果你可以分别对待学位和分钟,或者如果你需要字符串,你就赢了

我还看了一眼MicroPython,我不知道。看起来,虽然浮点数的精度很低,但整数的精度是无限的。因此,如果这对您的目的来说是可以的,那么您可以做的是将度和分钟转换为整数,单位为10**-6度(微度)。类似于(未经测试):

DEGREES_FACTOR = 1000000
MINUTES_FACTOR = 1000000.0 / 60.0

degrees, minutes, hemisph = my_micropyGPS.longitude
microlongitude = degrees * DEGREES_FACTOR + round(minutes * MINUTES_FACTOR)
if hemisph == 'W':
    microlongitude = -microlongitude

degrees, minutes, hemisph = my_micropyGPS.latitude
microlatitude = degrees * DEGREES_FACTOR + round(minutes * MINUTES_FACTOR)
if hemisph == 'S':
    microlatitude = -microlatitude

结果整数将位于decimal fixed point representation中,小数点位于右边缘的6个小数点位置。这对于可视化来说很方便,但您也可以使用不同的单位,比如按2的幂放大的分钟数,这将消除任何转换错误

还请注意,5位精度意味着您的示例中的数字最好用十进制表示为80.123(所有数字都以浮点计算,而不仅仅是小数点右边的数字)

相关问题 更多 >