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
值中添加另一个模糊因子来调整赤道偏移。我明白了!非常感谢你!嘿,我需要建立一个像链接中那样的地图。您的解决方案有帮助吗?非常少,我认为它工作得很好,但我有很多问题与图像缩放等。如果你可以为你的图像设置一个固定的大小,那么它会更容易。但如果不是这样,那就很难了。