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

标签 swift uiimageview uiimage location cllocation

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

请参阅下面的 UIImageView 示例:

World map

如您所见,它运行良好,但坐标和 X Y 的映射不正确!

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

我已经做了以下事情来尝试实现这一点,但不幸的是这没有成功:

  1. 我首先尝试“规范化”坐标,因为纬度范围从 -9090 和纬度范围从 -180180。这是通过将实际纬度增加 90 并将实际经度增加 180 来完成的,这会产生“标准化”版本:

设 normalizedLat = location.coordinate.latitude + 90.0。 让 normalizedLng = location.coordinate.longitude + 180.0

  1. 之后,我计算了 normalizedLatnormalizedLng 应该缩放的比例因子:

让 heightScaleFactor = mapImageView.frame.height/180.0 让 widthScaleFActor = mapImageView.frame.width/360.0

然后 3. 之后我得到了比例因子,我终于可以通过以下方式计算坐标:

让 x = Double(widthScaleFActor * CGFloat(normalizedLng)) 让 y = Double(heightScaleFactor * CGFloat(normalizedLat)) dot.frame = CGRect(x: x, y: y, width: Double(dot.frame.width), height: 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))

您的 map 投影也可能没有简单的线性纬度刻度。 0-10 度可能是 12 个像素,而 10-20 度可能是 11 个像素,等等,而 80-90 度只是 3 个像素(或其他)。

关于使用世界地图在 uiimageview 上快速绘制坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46029649/

相关文章:

ios - 重复UITextView的背景图片?

ios - 合并音频和视频 Swift

php - 与 Swift/PHP 的 HTTP 连接

ios - 如何从应用程序的文档目录中检索音乐的艺术家信息

ios - UITableviewCell 中的图像大小无法正确加载

swift - 从 iPhone 访问 UIImage 时出错,但从 Xcode 模拟器访问时出错

swift - 在 Realm 中查询 Int 时值无效

ios - 加载大量远程图像 - 内存问题

ios - 在 Swift 中优化嵌套 for 循环

iphone - iOS 中的 UIImage 或 CGImage API 是否可以进行这种屏蔽?