将地理坐标转换为自定义UIView上的CGPoint

3
我正在开发一个应用程序,其中一个功能是在自定义的UIImageView上显示地理坐标。由于我不擅长数学,所以我无法获得正确的值。这是我的做法:
我有一张2048x2048的图片,我将其放入UIScrollView中,当我获取坐标时,比如“悉尼 -33.856963,151.215219”,我将它们转换为UIView坐标(x,y)。
- (void)viewDidLoad
{
    [super viewDidLoad];
    scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height)];
    scrollView.delegate = self;
    scrollView.showsVerticalScrollIndicator = YES;
    scrollView.scrollEnabled = YES;
    scrollView.userInteractionEnabled = YES;
    [scrollView setBounces:NO];
    scrollView.minimumZoomScale = 0.5;
    scrollView.maximumZoomScale = 100.0;


    mainImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, IMAGE_SIZE, IMAGE_SIZE)];
    mainImageView.image = [UIImage imageNamed:@"map.jpg"];
    mainImageView.contentMode = UIViewContentModeScaleAspectFit;
    tipScroll.contentSize = CGSizeMake(IMAGE_SIZE, IMAGE_SIZE);


    [scrollView addSubview:mainImageView];
    [self.view addSubview:scrollView];

    NSString* fileContents = @"-33.856963,151.215219";
    NSArray* pointStrings = [fileContents componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    for (int i = 0; i<[pointStrings count]; i++) {
        NSArray* latLonArr = [currentPointString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]];
        [self getCoordinates:latLonArr];

    }

 }  
-(void)getCoordinates:(NSArray *)latLonArr{

    double comparatorWidth = IMAGE_SIZE/360.0f;
    double comparatorHeight = IMAGE_SIZE/180.0f;


    double Xl = [[latLonArr objectAtIndex:1] doubleValue]; //151.215219
    double Yl = [[latLonArr objectAtIndex:0] doubleValue]; //-33.856963

    coordX = (Xl+180.0f)*comparatorWidth;
    coordY = (90.0f-Yl)*comparatorHeight;

    UIImage *image=[UIImage imageNamed:[NSString stringWithFormat:@"star.png"]];

    imageView=[[UIImageView alloc] init];

    [imageView setFrame:CGRectMake(coordX,coordY,10,10)];

    [imageView setImage:image];
    [scrollView addSubview:imageView];
}

离中心坐标(0,0)越远,点的准确性就越低。如果我有西非城市的坐标,那么它会非常准确,但悉尼的偏差很大。我该怎么解决?

悉尼图片


2
你的地图图片使用的是什么投影方式?是墨卡托投影吗?这一点很重要。 - occulus
"悉尼偏离很大。" -- 以什么方式?X,Y,还是两者都有?点的“偏离”与原点相比如何?它们离原点有多远?这只是一个缩放问题吗? - occulus
“coordY = (90.0f-Yl)*comparatorHeight” 这段代码让我感到有些可疑。你确定它不应该是 “coordY = (90.0f + Yl)*comparatorHeight” 吗? - occulus
我确定它是"coordY = (90.0f-Yl)*comparatorHeight",悉尼在X和Y两个方向上都偏移了。我会在我的问题中放一张图片。您能否更详细地解释一下图像投影,我不知道那是什么。 - Spire
我在我的回答中提到了两种常见的投影方式。 - occulus
要将CLLocationCoordinate2D转换为CGPoint,请参见此处的答案 - https://dev59.com/O3M_5IYBdhLWcg3wdy5g#37276779 - Savchenko Dmitry
2个回答

2

是的,如果你使用等经纬投影,地理坐标可以直接转换为二维坐标。这就是我问他是否在使用墨卡托投影的原因。 - occulus
谢谢你们两个的建议。 - Spire

1
看一下你发布的图片上的白色水平线。它们并不是均匀间隔的 - 它们朝着图像底部变宽。这意味着你的地图图片不是使用等经纬投影制作的,可能是一张墨卡托投影图片。
你发布的代码将纬度/经度转换为Y/X,只需要使用偏移和缩放就可以适用于等经纬投影图像。
对于墨卡托投影,转换更复杂。请参见在墨卡托投影中将纬度/经度点转换为像素(x,y)
所以你有两个选择:
A) 使用等经纬投影地图图像
B) 继续使用墨卡托地图图像,并修复你的纬度/经度->Y/X转换算法

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接