将小数纬度/经度坐标转换为iPad屏幕坐标

ten*_*ing 3 objective-c latitude-longitude ios cartesian-coordinates

我有一个纬度/经度小数点坐标,我想将其转换为适合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);
}
Run Code Online (Sandbox Code Playgroud)

如何将小数点坐标转换为将显示在iPad屏幕上的坐标?

rma*_*ddy 9

您的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);
}
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

这假设您希望地图填充最小的屏幕尺寸.