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

+0

Nah, это 1024 * 768 ** баллов. ** Кварц не работает с пикселями, он работает с точками. – 2013-04-20 19:30:23

ответ

7

Ваш метод convertLatLongCoord: не пытается настроить результирующие координаты точки на экран. Как написано, вы можете получить x и y значения в диапазоне -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); 
} 

SCALE и OFFSET должна быть величина определяется следующим образом:

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