2011-11-07 443 views
4

我正在使用的一項服務要求我將緯度/經度作爲整數傳遞給地址。目前,我的經/緯度的存儲爲雙打:將緯度/經度轉換爲整數

double lat = 38.898748; 
double lon = -77.037684; 

我已經用盡我的谷歌福而找不到/經度緯度轉換爲整數表示的方法。任何幫助,將不勝感激。

+7

您需要從服務規範(或實例)。有多種方法可以做到這一點。 –

+0

你想要四捨五入嗎?還是更精確一點?可能是幾分鐘或幾秒?正如亨克所說,這取決於。 – Jodrell

+1

@HenkHolterman,我將不得不給他們的支持發郵件。 –

回答

5

有時很簡單,只需乘以100萬。

乘以.000001轉換回來。

這個假設你只想精確到小數點後第六位。

+1

儘管此轉換適用於您(基於您接受答案),但您仍應檢查您和您的提供商的大地測量系統。許多情況非常相似,在許多情況下,差異可能不會顯現或可忽略/不明顯,但在某些情況下可能極端。 –

3

我可以看到這種情況發生的唯一方法是如果你移動小數點。

int lat = (int)(38.898748 * 1000000.0); 
int lon = (int)(-77.037684 * 1000000.0); 
+0

但爲什麼不是'10000000'或'10000'? –

+0

@HenkHolterman - 任何一個乘法都沒關係,會給你錯誤的答案。 –

+0

@亨克 - 如果你使用noggin,你會注意到他的例子使用了6位精度。他實際上可以使用任何精度。 – ChaosPandion

1

如果您需要在幾秒鐘的座標,只要乘以60 * 60

int latitude = (int)Math.Round(lat * 60.0 * 60.0); 
int longitude = (int)Math.Round(lon * 60.0 * 60.0); 

如果您需要在座標更高的分辨率,例如1/100秒,只是乘以100多個。

+0

爲什麼downvote?如果你不解釋你認爲是錯誤的,它不能改善答案。 – Guffa

+0

這個批評指向所有加入這個問題的人中的90%,並清楚地表明爲什麼它應該在http://gis.stackexchange.com/上被詢問。 如果你使用座標,你至少必須知道地球是不統一的,並且存在比「google谷歌地圖現在使用什麼」更多的座標系。 我很確定我讀了GMaps在座標系中的變化(一些細節),但對於大多數腳踏實地的用例,請記住「WGS84」。 –

6

您需要知道您使用的Geodetic System以及API的期望值。例如。 WGS84,NAD83,OSGB36,ED50 ...(例如:Google Earth uses WGS84

如果他們需要一個整數,那麼他們可能使用與谷歌和其他提供商不同的東西。有可能四捨五入一個雙精度或其他整數轉換將不起作用。您需要大地測量系統信息,然後在兩個值之間進行轉換。

0

答案可能是另一個,

int FactorConversion(double degrees) 
{ 
    return (int) degrees * MagicConversionFactor 
    //You supply this number, a likely candidate is 360 since 
    //this converts degrees to seconds 
} 
可兼

int BinaryConversion32(float degrees) 
{ 
    return BitConvetor.ToInt32(BitConvertor.GetBytes(degrees)) 
} 

long BinaryConversion64(double degrees) 
{ 
    return BitConvetor.ToInt64(BitConvertor.GetBytes(degrees)) 
} 

注意的是8字節類型。正如我以前和其他人所說的,這完全取決於API的期望。

第二個選項將是無損但奇怪的。

1

我將對此進行一次野蠻刺探,並猜測您希望將純度轉換爲Degrees:Minutes:Seconds形式的單個整數。

這裏有一種方法可以將它轉換爲一個整數,但顯然你要確認這是他們正在使用的格式。

double originalLat = 38.898748, 
    TEMPdecimal; 

int degrees = (int)originalLat; 

TEMPdecimal = (originalLat - degrees) * 60; 

int minutes = (int)TEMPdecimal; 

TEMPdecimal = (TEMPdecimal - minutes) * 60; 

int seconds = (int)TEMPdecimal; 

int lat = (degrees * 10000) + (minutes * 100) + seconds; 

在這種情況下,返回是385355或38度53分55秒。對不起,如果這看起來有點草率,並且類型轉換可能不是最有效的(肯定需要確保它正確輪迴,我認爲類型轉換爲int的方式總是四捨五入),但它會給你經度/緯度。

+1

我在數據集中遇到了這種奇怪的格式。這個答案解釋了它。謝謝! – bdetweiler

0
double_lat = 38.898748; 

double_lon = -77.037684; 

一個簡單的方法來存儲小數位爲整數:

lat = (double_lat + 90) * 1000000; 

lon = (double_lon + 180) * 1000000; 

lat = 128898748; 
lon = 102962316;