你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS-地圖真實坐標表示形式之間轉換(double型,int型 互轉)

iOS-地圖真實坐標表示形式之間轉換(double型,int型 互轉)

編輯:IOS開發綜合

在開發中可能會遇到這種需求,前端獲取的地理坐標並不能在後台以double的形式表示,需要將其轉化為其他樣式比如:XX度XX分XX秒 的形式表示 進而轉化為秒的形式即整形的形式

封裝了兩個類可直接實現地圖經緯度坐標真實和整形表示方法的轉換方式:

/**
 如何將度(DDD):: 108.90593度換算成度分秒(DMS)東經E 108度54分22.2秒?轉換方法是將108.90593整數位不變取108(度),用0.90593*60=54.3558,取整數位54(分),0.3558*60=21.348再取整數位21(秒),故轉化為108度54分21秒.

 同樣將度分秒(DMS):東經E 108度54分22.2秒 換算成度(DDD)的方法如下:108度54分22.2秒=108+(54/60)+(22.2/3600)=108.90616度
 因為計算時小數位保留的原因,導致正反計算存在一定誤差,但誤差影響不是很大。1秒的誤差就是幾米的樣子。GPS車友可以用上述方法換算成自己需要的單位坐標。
 */
/**
 *  傳入地圖坐標得到服務器存儲度數
 *
 *  @param degree 坐標
 */
+(NSInteger)secondFromDegree:(CGFloat)degree{
    NSInteger degreeTemp,minuteTemp,secondTemp;
    CGFloat temp;
    degreeTemp = (NSInteger)degree;
    temp = (CGFloat)(degree - degreeTemp) * 60;
    minuteTemp = (NSInteger)temp;
    secondTemp = (NSInteger)((temp - minuteTemp) * 60);
    return degreeTemp * 3600 + minuteTemp * 60 + 21;
}
/**
 *  傳入服務器存儲度數得到地圖坐標
 *
 *  @param second 服務器度數
 */
+(CGFloat)degreeFromSecond:(NSInteger)second{
    NSInteger degreeTemp,minuteTemp,secondTemp;
    degreeTemp = (NSInteger)second / 3600;
    minuteTemp = (NSInteger)second % 3600 / 60;
    secondTemp = (NSInteger)second % 3600 % 60;
    return (CGFloat)(degreeTemp + (minuteTemp / 60.0) + (secondTemp / 3600.0));
}

經緯度互換
度(DDD):E 108.90593度 N 34.21630度
如何將度(DDD):: 108.90593度換算成度分秒(DMS)東經E 108度54分22.2秒?轉換方法是將108.90593整數位不變取108(度),用0.90593*60=54.3558,取整數位54(分),0.3558*60=21.348再取整數位21(秒),故轉化為108度54分21秒.
同樣將度分秒(DMS):東經E 108度54分22.2秒 換算成度(DDD)的方法如下:108度54分22.2秒=108+(54/60)+(22.2/3600)=108.90616度
因為計算時小數位保留的原因,導致正反計算存在一定誤差,但誤差影響不是很大。1秒的誤差就是幾米的樣子。GPS車友可以用上述方法換算成自己需要的單位坐標。

經緯度換算成米
緯度分為60分,每一分再分為60秒以及秒的小數。

緯度線投射在圖上看似水平的平行線,但實際上是不同半徑的圓。有相同特定緯度的所有位置都在同一個緯線上。
赤道的緯度為0°,將行星平分為南半球和北半球。
緯度是指某點與地球球心的連線和地球赤道面所成的線面角,其數值在0至90度之間。位於赤道以北的點的緯度叫北緯,記為N,位於赤道以南的點的緯度稱南緯,記為S。
緯度數值在0至30度之間的地區稱為低緯地區,緯度數值在30至60度之間的地區稱為中緯地區,緯度數值在60至90度之間的地區稱為高緯地區。
赤道、南回歸線、北回歸線、南極圈和北極圈是特殊的緯線。
緯度1秒的長度
地球的子午線總長度大約40008km。平均:
緯度1度 = 大約111km
緯度1分 = 大約1.85km
緯度1秒 = 大約30.9m
根據地球上任意兩點的經緯度計算兩點間的距離(可以用勾股定理c=a2+b2)
地球是一個近乎標准的橢球體,它的赤道半徑為6378.140千米,極半徑為 6356.755千米,平均半徑6371.004千米。如果我們假設地球是一個完美的球體,那麼它的半徑就是地球的平均半徑,記為R。如果以0度經線為基 准,那麼根據地球表面任意兩點的經緯度就可以計算出這兩點間的地表距離(這裡忽略地球表面地形對計算帶來的誤差,僅僅是理論上的估算值)。設第一點A的經 緯度為(LonA, LatA),第二點B的經緯度為(LonB, LatB),按照0度經線的基准,東經取經度的正值(Longitude),西經取經度負值(-Longitude),北緯取90-緯度值(90- Latitude),南緯取90+緯度值(90+Latitude),則經過上述處理過後的兩點被計為(MLonA, MLatA)和(MLonB, MLatB)。那麼根據三角推導,可以得到計算兩點距離的如下公式:
C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB)
Distance = R*Arccos(C)*Pi/180
這裡,R和Distance單位是相同,如果是采用6371.004千米作為半徑,那麼Distance就是千米為單位,如果要使用其他單位,比如mile,還需要做單位換算,1千米=0.621371192mile
如果僅對經度作正負的處理,而不對緯度作90-Latitude(假設都是北半球,南半球只有澳洲具有應用意義)的處理,那麼公式將是:

C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)
Distance = R*Arccos(C)*Pi/180

以上通過簡單的三角變換就可以推出。
如果三角函數的輸入和輸出都采用弧度值,那麼公式還可以寫作:

C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180)
Distance = R*Arccos(C)*Pi/180

也就是:

C = sin(LatA/57.2958)*sin(LatB/57.2958) + cos(LatA/57.2958)*cos(LatB/57.2958)*cos((MLonA-MLonB)/57.2958)
Distance = R*Arccos(C) = 6371.004*Arccos(C) kilometer = 0.621371192*6371.004*Arccos(C) mile = 3958.758349716768*Arccos(C) mile

在實際應用當中,一般是通過一個個體的郵政編碼來查找該郵政編碼對應的地區中心的經緯度,然 後再根據這些經緯度來計算彼此的距離,從而估算出某些群體之間的大致距離范圍(比如酒店旅客的分布范圍-各個旅客的郵政編碼對應的經緯度和酒店的經緯度所 計算的距離范圍-等等),所以,通過郵政編碼查詢經緯度這樣一個數據庫是一個很有用的資源。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved