[英]How to get 6 decimal places in LAT/LON NMEA Coordinates
我正在使用這個模塊:
https://github.com/inmcm/micropyGPS/blob/master/micropyGPS.py
不幸的是,micropython 中的浮點數限制為小數點后 5 位,例如。 80.12345
如何獲得至少 6 個,例如 80.123456?
我知道它精確到 1 米,但我需要更高的精度。
我查看了latitude
MicropyGPS
,得出的結論是,如果您不將“ longitude
'dms'
或'dd'
作為構造函數的location_formatting
(第 3 個)參數傳遞,您將直接在它們的內部表示,它是 3 個項目的list
:
int
度float
分鍾str
半球 ( 'N'
, 'S'
, 'E'
或'W'
)因此,在此表示中,您的精度比浮點數多 2 或 3 位。 我不知道您如何需要緯度和經度來表示您的目的。 如果您需要它們每個都成為一個浮動,那么您就輸了。 如果您可以分別處理度數和分鍾數,或者如果您需要字符串,那么您就贏了。
我還看了一下我不知道的 MicroPython。 似乎雖然浮點數的精度較低,但整數的精度卻是無限的。 因此,如果這對您的目的來說可以的話,您可以做的是將度數和分鍾數轉換為 int,以 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
生成的整數將采用十進制定點表示,從右邊緣算起 6 個小數位。 這對於可視化來說很方便,但您也可以使用不同的單位,例如按 2 的冪放大的分鍾數,這將消除任何轉換錯誤。
另請注意,5 位精度意味着您的示例中的數字最好用十進制表示為80.123
(所有數字都以浮點數計算,而不僅僅是點右側的數字)。
感謝你的回答。 問題是在收到結果后我必須進一步計算它,例如到另一個點的距離或一個和另一個航點之間的方向。 如果我理解正確,您的示例是否僅用於展示結果而不用於進一步計算?
我的計算示例代碼:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.