簡體   English   中英

如何在 LAT/LON NMEA 坐標中獲得 6 位小數

[英]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


如何在坐標(緯度,經度)中計算截然相反的坐標,其中-90 <lat<90 and -180<lon<180< div><div id="text_translate"><p> 給定坐標點 X=(lat, lon) 和圓心 C=(lat_center, lon_center) 我想計算點 X 截然相反的坐標(假設 X 在圓心為 C 的圓內) .</p><p> 例如,如果 C=(45.9, 180),則與 X=(45.9, -179) 截然相反的值應該是 (45.9, 179)。</p><p> 以下 function 是一個近似值,但不能解決緯度在 (-90, 90) 和經度 (-180, 180) 之間的問題。</p><pre> def f(lat, lon, center): lat_center = center[0] lon_center = center[1] dist_lon = np.abs(lon - lon_center) if np.abs(lon - lon_center)&lt;180 else 360 - np.abs(lon - lon_center) dist_lat = np.abs(lat - lat_center) if np.abs(lat - lat_center)&lt;180 else 360 - np.abs(lat - lat_center) lon_op = lon_center + dist_lon if lon_center + dist_lon.= lon else lon_center - dist_lon lat_op = lat_center + dist_lat if lat_center + dist_lat,= lat else lat_center - dist_lat return np,round(lat_op. 2), np.round(lon_op, 2)</pre> </div></lat<90>

[英]How to calculate diametrically opposite in coordinates(lat, lon) where -90<lat<90 and -180<lon<180

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 如何識別xarray中的時間,長度和緯度坐標? 如何在python中為數據集分配緯度/經度坐標? 如何在 python 中將緯度/經度值轉換為十進制? 如何使用cartopy將顯示坐標轉換為geographoc坐標(緯度,經度)? 如何從節點 id(OSMnx) 獲取經緯度坐標? 如何在坐標(緯度,經度)中計算截然相反的坐標,其中-90 <lat<90 and -180<lon<180< div><div id="text_translate"><p> 給定坐標點 X=(lat, lon) 和圓心 C=(lat_center, lon_center) 我想計算點 X 截然相反的坐標(假設 X 在圓心為 C 的圓內) .</p><p> 例如,如果 C=(45.9, 180),則與 X=(45.9, -179) 截然相反的值應該是 (45.9, 179)。</p><p> 以下 function 是一個近似值,但不能解決緯度在 (-90, 90) 和經度 (-180, 180) 之間的問題。</p><pre> def f(lat, lon, center): lat_center = center[0] lon_center = center[1] dist_lon = np.abs(lon - lon_center) if np.abs(lon - lon_center)&lt;180 else 360 - np.abs(lon - lon_center) dist_lat = np.abs(lat - lat_center) if np.abs(lat - lat_center)&lt;180 else 360 - np.abs(lat - lat_center) lon_op = lon_center + dist_lon if lon_center + dist_lon.= lon else lon_center - dist_lon lat_op = lat_center + dist_lat if lat_center + dist_lat,= lat else lat_center - dist_lat return np,round(lat_op. 2), np.round(lon_op, 2)</pre> </div></lat<90> 如何從x,y笛卡爾坐標tmerc投影獲得緯度/經度? 如何從 lon/lat 坐標計算形狀並用 plotly 繪制 如何將x,y坐標投影到netcdf文件中的緯度/經度 使用最大/最小緯度和經度以及網格點數,如何獲得經緯度網格?
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM