Swift 使用世界地图在uiimageview上快速绘制坐标

Swift 使用世界地图在uiimageview上快速绘制坐标,swift,uiimageview,uiimage,location,cllocation,Swift,Uiimageview,Uiimage,Location,Cllocation,我正试图在包含世界地图的UIImage上绘制地球上的一些坐标。(我不想使用地图) 请参见下面的UIImageView示例: 正如你看到的,它运行得很好,但是坐标和xy的映射是不正确的 阿姆斯特丹的坐标为:(52.36666489,4.883333206),中心的坐标为(0,0) 为了实现这一点,我做了以下几件事,但不幸的是,这并没有奏效: 我首先尝试“标准化”坐标,因为纬度范围从-90到90和纬度-180到180。这是通过将实际纬度加90,将实际经度加180来实现的,即“标准化”版本: 让no

我正试图在包含世界地图的
UIImage
上绘制地球上的一些坐标。(我不想使用地图)

请参见下面的UIImageView示例:

正如你看到的,它运行得很好,但是坐标和xy的映射是不正确的

阿姆斯特丹的坐标为:(52.36666489,4.883333206),
中心的坐标为(0,0)

为了实现这一点,我做了以下几件事,但不幸的是,这并没有奏效:

  • 我首先尝试“标准化”坐标,因为纬度范围从
    -90
    90
    和纬度
    -180
    180
    。这是通过将实际纬度加90,将实际经度加180来实现的,即“标准化”版本:
  • 让normalizedLat=location.coordinate.lation+90.0。
    让normalizedLng=location.coordinate.longitude+180.0

  • 之后,我计算了比例因子,
    normalizedLat
    normalizedLng
    应按以下比例缩放:
  • 让heightScaleFactor=mapImageView.frame.height/180.0
    设widthScaleFActor=mapImageView.frame.width/360.0

    三,。之后,我得到了比例因子,我最终可以通过以下方式计算坐标:

    设x=Double(widthScaleFActor*CGFloat(normalizedLng))
    设y=Double(heightScaleFactor*CGFloat(normalizedLat))
    dot.frame=CGRect(x:x,y:y,宽度:Double(dot.frame.width),高度:Double(dot.frame.height))
    

    但出于某种奇怪的原因,阿姆斯特丹不在阿姆斯特丹的位置上,中心也不在中心位置上


    我很肯定我的计算错了。有什么想法吗?

    记住,在iOS中,原点在左上角,而不是左下角。正y向下,而不是向上

    你需要考虑到这一点

    dot.frame = CGRect(x: x, y: mapImageView.frame.height - y, width: Double(dot.frame.width), height: Double(dot.frame.height))
    

    也注意到你的图像中的赤道并不在中间。它在图像中较低,因此您需要根据图像中赤道的偏移量在计算

    y
    值时添加额外的偏移量

    dot.frame = CGRect(x: x, y: mapImageView.frame.height - y + equatorOffset, width: Double(dot.frame.width), height: Double(dot.frame.height))
    

    地图投影也可能没有简单的线性纬度比例。0-10度可能是12个像素,而10-20度可能是11个像素,等等。80-90只是3个像素(或其他)。哦,你完全正确,
    mapImageView.frame.height-y
    成功了!现在地图看起来已经好多了。然而,偏移量仍然有点错误。你能看一下吗?赤道没有穿过图像的中心。稍微低一点。您需要在
    y
    值中添加另一个模糊因子来调整赤道偏移。我明白了!非常感谢你!嘿,我需要建立一个像链接中那样的地图。您的解决方案有帮助吗?非常少,我认为它工作得很好,但我有很多问题与图像缩放等。如果你可以为你的图像设置一个固定的大小,那么它会更容易。但如果不是这样,那就很难了。