3

iPad座標系の領域内に収まるポイントに変換したい緯度/経度の10進座標があります。

私のコードは緯度/経度の座標を取り、それらをデカルト座標に変換します (この質問に基づいて:デカルト座標に変換します) 変換の結果は (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 画面に表示される座標に変換するにはどうすればよいですか?

4

1 に答える 1

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);
}

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;

これは、マップが最小の画面サイズを埋めることを前提としています。

于 2013-04-20T21:08:36.743 に答える