2013-03-26 156 views
3

爲什麼決定將觀察者緯度/經度值視爲弧度,而將字符串值視爲十進制度?pyephem - 觀察者緯度/經度類型

在處理Python中的緯度/經度值時,我通常會處理浮動對象。如果星星右對齊,那麼可能有一個int對象或兩個漂浮物,但大多是漂浮物。我總是天真地寫下這樣的代碼:

lat = 0.0 
lon = 0.0 

observer = ephem.Observer() 
observer.lat = lat 
observer.lon = lon 
# etc... etc... 

然後,我被燒了。我被燒,因爲我的緯度/經度值是十進制度數,而不是弧度。這通常是不好的,因爲我最終撓撓腦袋想知道我做錯了什麼。最後,我最終轉換爲弧度。現在理論上,我能做到這一點,以獲得正確的結果:

observer = ephem.Observer() 
observer.lat = str(lat) 
observer.lon = str(lon) 

,但似乎也靠不住,我還以爲我的價值觀必須是弧度!哦,等一下,只有當它是一個浮動。我明白接受字符串或浮動對象是好的,但接受基於python類型的不同數字類型似乎不一致。我希望這兩個任務採取同樣的數字類型,像這樣:

lat = lon = 0.55 
observer.lat = lat # float lat is assumed to be in radians 
observer.lon = lon # float lon is assumed to be in radians 

lat = lon = '0.55' 
observer.lat = lat # string lat is assumed to be in radians 
observer.lon = lon # string lon is assumed to be in radians 

然後轉換操作符可以爲十進制度/ DMS提供:

lat = '25.0' 
lon = 25.0 
observer.lat = ephem.to_rad(lat) 
observer.lon = ephem.to_rad(lon) 

然後to_rad功能會明確地假定小數學位被提供爲浮子或絃樂對象。在這一點上,接口將是一致的。我通過_libastro.c非常簡短地挖掘並研究了to_angle函數,它是這個問題的核心。

我想不出一個很好的理由不實施這個。事實上,我會自願去做!但在我開槍之前,我知道我不是libastro/pyephem專家,所以我想打開這個問題來確保這是有道理的。這完全有可能是因爲很好的理由,我只是無法理解而感到困惑。

如果有經驗的用戶或熟悉軟件核心的人可以發表評論,我將不勝感激。

謝謝您提前!

回答

2

第一:當您需要在當前版本的PyEphem中將度數轉換爲弧度時,可以使用degree常數,這是用弧度測量的一度。所以,你可以寫這樣的事情:

observer.lat = 33.7 * ephem.degree 

當時的想法是,讀者會從中看到此爲「33.7倍一度」 - 我的傳統擔心與像to_rad()函數名,它不一定會清楚它是從什麼單位轉換如果要引入一個函數或方法,那麼像from_degrees()這樣的名稱實際上可能更可取 - 但我不確定我自己是否會發現代碼更清晰,而不僅僅是將數字乘以degree,如上所示。

向後退一步:弧度是默認角度測量的原因不是任何理論上的原因 - 比如弧度是測量數學角度的「自然」方式,或者它們是事實該單元由Python的sin()cos()常規預期誰拿PyEphem角度做三角的人 - 但主要是因爲這是由libastro庫,PyEphem周圍的包裝使用的基本單元。這似乎是最明顯的舉動,尤其是對於那些可能已經在其C代碼中使用了libastro的人來說,只是簡單地暴露底層庫的單元而不是隱藏它們,並且總是強制在每個方向進行轉換。回想起來,印刷一個角度可以方便地顯示小時(RA)或度數(用於偏角),但是一旦做出了這個決定 - 移動了float→str轉換,它可能有點模糊不清到幾個小時或幾個度 - 然後對稱本身決定了提供一個str應該被解釋爲小時或度,以便字符串輸出和字符串輸入將是相同的並且在相同的單位中。

您的論點的後果似乎是後一步 - 如果爲像.lat.lon這樣的屬性提供了一個字符串的自動str→float轉換 - 太模糊,應該簡單地禁用,因爲提供了一個字符串一個數字應該是傳統的Python中的TypeError,而不是一個神奇的無聲轉換。我實際上傾向於同意,但我認爲在這一點上禁止轉換並迫使人們明確地乘以ephem.degree已經太晚了,因爲這會破壞現有的代碼。我希望PyEphem繼續爲那些花時間寫程序的人工作。

但我認爲你的觀點很好,在我的新skyfield圖書館中,我沒有計劃在PyEphem中遇到任何類型的魔法轉換。相反,無論是提供弧度還是度數,我都計劃讓節目明確表達他們提供的內容,並且絕不允許他們提供「未標記」數字。你可以在GitHub上查看項目,如果你想在它的演變過程中權衡它的語法:

https://github.com/brandon-rhodes/python-skyfield