簡體   English   中英

如何將緯度標准化為-90到90?

[英]how to normalise latitude into the range of -90 to 90?

使用piexif,我獲得了試圖以十進制度轉換的緯度和經度DMS,但是對於某些圖像,我獲得的緯度值為184.62583333333333,該值超出[-90,90]范圍。

看看下面的代碼,

exif_dict = piexif.load('images/DJI_0026.JPG')
long = 0
latt = 0
value = exif_dict['GPS']
if value:
    lat = value[2]
    lon = value[4]
    for i in range(3):
        if i == 1:
            latt += lat[i][0]/60.0
        elif i == 2:
            latt += lat[i][0]/3600.0
        else:
            latt += lat[i][0]
    for i in range(3):
        if i == 1:
            long += lon[i][0]/60.0
        elif i == 2:
            long += lon[i][0]/3600.0
        else:
            long += lon[i][0]
print(latt, long)

值= {0:(2,3,0,0),1:b'N',2:(((19,1),(8,1),(595773,10000)),3:b'E' ,4:((73,1),(0,1),(131775,10000)),5:0,6:(70989,1000)}

我關心的是緯度和經度,它們存儲在鍵2和4的值中。

緯度= 19 + 8 / 60.0 + 595773 / 3600.0

經度= 73 + 0 / 60.0 + 131775 / 3600.0

這就是輸出。

輸出:184.62583333333333 109.60416666666666

請讓我知道如何規范[-90,90]范圍內的緯度。

piexif返回的GPS坐標數據具有以下格式:

exif_data = {0: (2, 3, 0, 0),
             # Latitude: b'N' or b'S'
             1: b'N', 
             # deg, min, sec as (numerator,denominator) of rationals
             2: ((19, 1), (8, 1), (595773, 10000)),
             # Longitude: b'E' or b'W'
             3: b'E', 
             4: ((73, 1), (0, 1), (131775, 10000)), 
             5: 0, 6: (70989, 1000)}

緯度和經度是朝向N或S(分別為E或W)的正,理性值。

我們需要將DMS的正值轉換為十進制,然后根據方向給它們正確的符號:

def convert_DMS_tuple(tup):
    d, m, s = [t[0]/t[1] for t in tup]
    degrees = d + m/60 + s/3600
    return degrees

def EXIF_to_lat_long(exif_data):
    # Latitude is counted positive towards N
    lat_sign = 1 if exif_data[1] == b'N' else -1
    lat = lat_sign*convert_DMS_tuple(exif_data[2])

    # Longitude is counted positive towards E
    long_sign = 1 if exif_data[3] == b'E' else -1
    long = long_sign*convert_DMS_tuple(exif_data[4])

    return lat, long

EXIF_to_lat_long(exif_data)
# (19.149882583333333, 73.00366041666666)

您可以這樣使用:

exif_dict = piexif.load('images/DJI_0026.JPG')
value = exif_dict['GPS']
if value:
   print(EXIF_to_lat_long(value))

從給出的示例值中,很明顯應該將val [0]除以val [1]。

例如,595773/10000 = 59,這很有意義。

順便說一句,您不需要for循環。 它們使您的代碼超出了必要的時間。

value[1] == b'N'可能是有原因value[1] == b'N' 您當前的代碼雖然不會對其進行評估。 這意味着您的代碼僅適用於地球表面的1/4。

有關良好的概述,請參見https://sno.phy.queensu.ca/~phil/exiftool/TagNames/GPS.html 您的代碼也應該能夠解釋南方和西方。

暫無
暫無

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM