2013-04-20 184 views
2

我有一個經度/緯度小數座標,我想將其轉換爲適合iPad座標系統區域的點。將十進制經度/緯度座標轉換爲iPad屏幕座標

我的代碼需要經緯度座標並將它們轉換爲笛卡爾座標(基於此問題:convert to cartesian coordinates)轉換結果爲(2494.269287,575.376465)。

這裏是我的代碼(沒有編譯或運行時錯誤):

#define EARTH_RADIUS 6371 

- (void)drawRect:(CGRect)rect 
{ 
    CGPoint latLong = {41.998035, -116.012215}; 

    CGPoint newCoord = [self convertLatLongCoord:latLong]; 

    NSLog(@"Cartesian Coordinate: (%f, %f)",newCoord.x, newCoord.y); 

    //Draw dot at coordinate 
    CGColorRef darkColor = [[UIColor colorWithRed:21.0/255.0 
              green:92.0/255.0 
              blue:136.0/255.0 
              alpha:1.0] CGColor]; 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, darkColor); 
    CGContextFillRect(context, CGRectMake(newCoord.x, newCoord.y, 100, 100)); 

} 

-(CGPoint)convertLatLongCoord:(CGPoint)latLong 
{ 
    CGFloat x = EARTH_RADIUS * cos(latLong.x) * cos(latLong.y); 
    CGFloat y = EARTH_RADIUS * cos(latLong.x) * sin(latLong.y); 

    return CGPointMake(x, y); 
} 

我如何轉換小數座標的座標,將顯示了一個iPad屏幕上?

+0

而不是'EARTH_RADIUS',乘以屏幕的寬度和高度。 – 2013-04-20 19:20:31

+0

@ H2CO3 - 你是什麼意思?視網膜iPad的分辨率是2048 X 1536.我把它們放在一起,產生的座標比以前大得多。 – tentmaking 2013-04-20 19:28:09

+0

Nah,它是1024 * 768 **點。**石英不適用於像素,它適用於點。 – 2013-04-20 19:30:23

回答

7

您的convertLatLongCoord:方法不會嘗試將結果點調整爲屏幕座標。如書面所示,您可以獲得xy的值,範圍爲-EARTH_RADIUS+EARTH_RADIUS。這些需要縮放以適應屏幕。

類似以下應該有所幫助:

- (CGPoint)convertLatLongCoord:(CGPoint)latLong { 
    CGFloat x = EARTH_RADIUS * cos(latLong.x) * cos(latLong.y) * SCALE + OFFSET; 
    CGFloat y = EARTH_RADIUS * cos(latLong.x) * sin(latLong.y) * SCALE + OFFSET; 

    return CGPointMake(x, y); 
} 

SCALEOFFSET應該是確定的值如下:

CGSize screenSize = [UIScreen mainScreen].applicationFrame.size; 
CGFloat SCALE = MIN(screenSize.width, screenSize.height)/(2.0 * EARTH_RADIUS); 
CGFloat OFFSET = MIN(screenSize.width, screenSize.height)/2.0; 

這是假設你想要的地圖,以填補最小屏幕尺寸。

+0

工作正常!非常感謝。 – tentmaking 2013-04-21 04:11:46