Преобразование десятичных координат широты / долготы в координаты экрана iPad

У меня есть десятичные координаты широты и долготы, которые я хотел бы преобразовать в точки, которые будут соответствовать области системы координат iPad.

Мой код принимает координаты широты / долготы и преобразует их в декартовы координаты (на основе этого вопроса: преобразовать в декартовы координаты) Результатом преобразования являются (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?


person tentmaking    schedule 20.04.2013    source источник
comment
Вместо EARTH_RADIUS умножьте на ширину и высоту экрана.   -  person    schedule 20.04.2013
comment
@ H2CO3 - Что вы имеете в виду? Разрешение Retina iPad составляет 2048 X 1536. Я умножил их вместе, и полученные координаты были намного больше, чем раньше.   -  person tentmaking    schedule 20.04.2013
comment
Нет, это 1024 * 768 точек. Кварц не работает с пикселями, он работает с точками.   -  person    schedule 20.04.2013
comment
Это по-прежнему дает разные большие числа.   -  person tentmaking    schedule 20.04.2013


Ответы (1)


Ваш 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;

Предполагается, что вы хотите, чтобы карта занимала наименьший размер экрана.

person rmaddy    schedule 20.04.2013