【问题标题】:Trouble converting MapKit user coordinates to screen coordinates无法将 MapKit 用户坐标转换为屏幕坐标
【发布时间】:2012-01-17 19:57:57
【问题描述】:

好的,这实际上是一个线程中的三个不同的问题:

1) 我正在使用:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [mapView setFrame :CGRectMake(-100,-100,520,520)];
    [mapView setAutoresizesSubviews:true];
    mapView.showsUserLocation = YES;

    locManager = [[CLLocationManager alloc] init];
    locManager.delegate = self;
    [locManager startUpdatingLocation];
    [locManager startUpdatingHeading];

    [bt_toolbar setEnabled:YES];
}


- (IBAction) CreatePicture
{
     CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(mapView.userLocation.coordinate.latitude, mapView.userLocation.coordinate.longitude);

     CGPoint annPoint = [self.mapView convertCoordinate:coord toPointToView:self.mapView];    
     mapPic = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pic.png"]];
     mapPic.frame = CGRectMake(annPoint.x, annPoint.y, 32, 32);
     [self.view addSubview:macPic];
}

使用 GCRectMake 在用户坐标上放置图像,但遗憾的是图像没有放置在正确的位置:

如果我移动地图,图片将始终以与用户位置完全相同的偏移量放置。我错过了什么?它不应该直接放在用户上方吗?我猜我首先给 mapView 的偏移量(-100,-100)是造成这种情况的原因(我在下面有一个工具栏,因此是偏移量)。

2) 我的 iOS 5 模拟器表现得很疯狂,出于某种原因将我的位置放在凤凰城的格伦代尔(不应该在库比蒂诺吗??),并且表现得像我在向东移动一样;不过,在我的 iPhone 4 中一切正常(除了图片的位置不正确)。有什么想法吗?

3) 我一直在考虑改用注释,但我听说它们是静态的(我真的需要它们是动态的)。这是真的吗?

谢谢!

【问题讨论】:

  • 您能否将添加 mapPic 的部分包含到您的视图层次结构中?听起来您可能正在使用 mapView 的坐标系,但将 mapPic 放在具有不同坐标系的超级视图(可能是视图控制器的视图)中。
  • 您好,感谢您的回复。就是一个简单的addSubView,就加进去了。

标签: iphone ios ios5 ios-simulator mapkit


【解决方案1】:

我认为您最好使用自己的图像使用自定义 MKPinAnnotationView。 按照这个答案。 Add image behind MKPinAnnotationView

【讨论】:

    【解决方案2】:

    当添加一个子视图时,它的框架原点是相对于它的父视图的。在这种情况下,您从地图视图派生了一个原点,然后将图像添加到视图控制器的视图中。您需要将图像的原点转换为 self.view 的坐标系,如下所示:

    CGPoint imageOrigin = [self.view convertPoint:annPoint fromView:self.mapView];
    mapPic.frame.origin = imageOrigin;
    [self.view addSubview:macPic];
    

    注意:这是未经测试的代码,但主要是您需要在 mapView 的坐标空间(这是您从 [self.mapView convertCoordinate:coord toPointToView:self.mapView] 得到的)到 self.view 的坐标之间进行转换空间。这个例子有点做作来说明,因为更简单的方法是首先使用 self.view 的坐标空间:

    CGPoint annPoint = [self.mapView convertCoordinate:coord toPointToView:self.view];    
    

    【讨论】:

    • 这不是完全匹配(图像不会完全覆盖蓝点),但可以。感谢您的提醒! :)
    • 图片的左上角是否与蓝点的中心对齐?尝试将您的图像视图集中在该点上。
    • 确实如此(排队)。是否可以对齐图像的中心而不是左上角?如果有,怎么做?
    【解决方案3】:

    MKMapView 提供以下方法在视图空间和地理坐标之间进行转换:

    – convertCoordinate:toPointToView:
    – convertPoint:toCoordinateFromView:
    – convertRegion:toRectToView:
    – convertRect:toRegionFromView:
    

    这些对于将触摸转换为地图坐标等任务非常有用。对于您描述的任务,我认为地图叠加层比尝试使用子视图在地图上绘制更合适。叠加层是一种注释,允许您绘制您喜欢的任何内容,但让地图负责确定叠加层何时可见以及何时需要绘制。

    3) 我一直在考虑改用注释,但我听说了 它们是静态的(我真的需要它们动态)。这是真的吗?

    这里的“静态”与“动态”是什么意思?您的意思是要更改覆盖视图中的内容吗?还是您想更改叠加层本身的位置?我认为应该可以根据需要经常更新覆盖视图。我不确定您是否可以通过简单地调整其 boundingMapRect 属性来移动覆盖,但我希望它能够工作。如果没有,您可以随时移除叠加层并重新添加。

    尝试创建自己的地图叠加系统而不是使用 MapKit 提供的工具应该是您的选项列表中的最后一件事。当您可以使用框架而不是反对它时,生活总是会变得更轻松,而且您的代码将来出现故障的可能性也会大大降低。

    【讨论】:

    • 我想改变叠加层本身的位置;更具体地说,我想让它移动到一组坐标(因此是整个动态与静态的问题)。
    • 另一件事:地图叠加层是不是有点受限,比如只限于绘制多边形?我可以使用它们将图像放在地图上吗?
    • 最后一件事:@kalperin 的回答解决了主要问题,但由于我实际上问了三个问题,所以你得到 +50 代表是公平的。也是。我们该如何做到这一点,我是否应该重复问题,将链接发送给您,您回答并给您 +50?
    • @Hal 不,你可以在叠加层中绘制任何你喜欢的东西。来自 MKOverlayView 文档:“您可以继承 MKOverlayView 以创建基于自定义形状和内容的叠加层。” MapKit 中提供了一些绘制多边形和折线的子类,但您不仅限于这些子类。我注意到MKOverlay的boundingMapRect被标记为readonly,所以我不知道地图是否会注意到变化,但同样,你总是可以从地图中删除它,改变它,然后重新添加。我怀疑用户会注意到。
    • @Hal 我很感激考虑 w.r.t.奖金,但不要担心。我鼓励您尝试叠加,因为我相信这是一个更好的解决方案,但您应该选择一个“正确”的答案并根据您认为的最佳答案奖励任何奖金。奖金就是这样——很高兴得到,而不是期待。 (谁知道呢?你可能会得到更好的答案。)祝你好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多