ios - 如何将任意两点从图像映射到 map View ?在 iOS 覆盖 mapkit 上下文中

标签 ios mapkit overlay

我可以从 mapview 中选择点并在那里叠加图像,以便图像的左上角和右下角映射到相应的 mapview 点。

但是我怎样才能将任意两个点(不是那些角点)从图像映射到 mapview 的两个选定点?喜欢这个应用程序的校准功能https://itunes.apple.com/us/app/mapcha/id956671318?mt=8

感谢任何提示,无论是特定于 SDK 的还是涉及到解决方案的数学。

已编辑: 对不起,我没有意识到我的解释对你没有意义。 我认为通过提供 the reference app 我的要求很容易理解和引用功能(校准)。

好的,这里再解释一下。我关注了this tutorial达到像this image这样的结果.现在,我想要做的就是让我的应用程序用户能够将他们自己的图像附加到 map 上他们想要的位置,就像引用应用程序的校准功能一样。

注意: 您无需安装引用应用程序即可了解校准功能,因为只需查看标题为步骤 1、步骤 2、步骤 3、步骤 4 和完成的图像即可理解。

以下是这些点的文本,以防引用不再可用。

  • 第 1 步:为 map 拍照或使用照片库中的照片。确保北朝上。
  • 第二步:在纸质 map 上选择一个点,在标准 map 上定位。
  • 第 3 步:重复另一个点。相距较远的点会产生更好的结果。
  • 第 4 步:预览 map 并检查对齐方式。如果需要,调整透明度。
  • 完成:现在您可以在纸质 map 上看到您当前的位置。

已编辑:

我没有得到如图所示的预期结果,但看起来很接近。

enter image description here

这是我正在使用的代码快照。

 -(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context {

    CGImageRef imageReference = self.overlayImage.CGImage;

    MKMapRect theMapRect = self.overlay.boundingMapRect;
    CGRect theRect = [self rectForMapRect:theMapRect];

    double imgWidthScaleFactor = 1.0;
    if (_imgWidth > 0) {
        imgWidthScaleFactor = theRect.size.width / _imgWidth;
    }

    double imgHeightScaleFactor = 1.0;
    if (_imgHeight > 0) {
        imgHeightScaleFactor = theRect.size.height / _imgHeight;
    }

    CGPoint contextCenter = CGPointMake(CGRectGetMidX(theRect), CGRectGetMidY(theRect));
    CGContextTranslateCTM(context, contextCenter.x, contextCenter.y);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextRotateCTM(context, _radian);
    CGContextTranslateCTM(context, -contextCenter.x, -contextCenter.y);
    CGContextTranslateCTM(context, imgWidthScaleFactor*_pivotX, imgHeightScaleFactor*_pivotY);
    CGContextSetAlpha(context, 0.5);
    CGContextDrawImage(context, theRect, imageReference);

}

最佳答案

那么,让我首先解释这个示例应用程序背后的直觉:

贴在 map 上的图片:

/*    _____
     |     |
     |     |           __
     |_____|          |__|

  (image to stick)    (map)
*/

如您所见,我制作的图像形状和大小与 map 不同。现在,您必须在 map 上选择两个点并在图像上选择两个点的原因是为您的图像提供比例尺。

/*    _____
     |   * |
     |*    |           
     |_____|          

   (image to stick, with chosen points as *)    
*/

我。计算图像上两个选定点与 map 上两个选定点之间的距离,我们称它们为 d_imaged_map

现在您只需执行以下操作即可缩放图像:

float scale  = (d_map/d_image);

二。使用比例尺,您将能够找到 map 上图像的右上角和 map 上图像的左下角。您可以使用这些点并使用以下方法将它们转换为坐标:

CLLocationCoordinate2D image_corner_coordinate = [*yourMap* convertPoint:*image_corner* toCoordinateFromView:self.view];

瞧,你有你的西南和东北坐标来固定你的叠加层!

***编辑****

OP 向问题添加了附加信息,明确要求能够处理与 map 上所选点不同角度的图像。虽然我相信上面的答案、步骤 I 和 II 应该足以弄清楚如何达到预期的效果,但为了完整起见,我们还是继续:

第一步 (.5)

使用步骤 I 中计算的缩放因子。我们首先将图像缩小到合适的大小。然后,给出比我们知道的 map 上的两个给定点和图像上的两个给定点,我们计算旋转因子。

鉴于图像现在是正确的比例,考虑这一点的方法如下:您固定在其匹配 map 点上的两个点中,然后开始旋转图像直到另一个点匹配。找到旋转因子后,继续执行步骤 II 以获得最终答案。

关于ios - 如何将任意两点从图像映射到 map View ?在 iOS 覆盖 mapkit 上下文中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36523028/

相关文章:

iphone - 以 1.5 倍速、2 倍速播放视频文件

快速计算两个位置之间的距离

iphone - 我怎样才能知道MKMapview何时setRegion :animated: has finished?

ios - 如何模糊一半屏幕的容器背景

text - 如何向形状叠加层添加阴影而不遮挡其文本? swift 用户界面

ios标签栏按钮到模态视图

iphone - 为什么游戏开发者要将许多图像放入一张大图像中?

ios - MKAnnotationView 自定义标注对辅助功能(VoiceOver)不可见

filter - 尝试使用 2 个叠加层创建视频

ios - SpriteKit : what causes touchesMoved to stop getting called?