Swift 使用世界地图在 uiimageview 上绘制坐标
Swift plot coordinates on uiimageview with world map
我正在尝试在包含世界地图的 UIImage
上绘制地球上的一些坐标。 (我不想用地图)
请参阅下面的 UIImageView 示例:
如您所见,它运行良好,但坐标和 X Y 的映射不正确!
Amsterdam
的坐标是:(52.36666489, 4.883333206),Center
的坐标是(0,0).
我已经做了以下事情来尝试实现这一点,但不幸的是这没有成功:
- 我首先尝试 'normalize' 坐标,因为纬度范围从
-90
到 90
,纬度范围从 -180
到 180
。这是通过将 90 加到实际纬度和 180 到实际经度来完成的,这会产生 'normalized' 版本:
let normalizedLat = location.coordinate.latitude + 90.0.
let normalizedLng = location.coordinate.longitude + 180.0
- 之后我计算了
normalizedLat
和 normalizedLng
应该缩放的比例因子:
let heightScaleFactor = mapImageView.frame.height / 180.0
let widthScaleFActor = mapImageView.frame.width / 360.0
和 3. 之后我得到了比例因子,我终于可以通过以下方式计算坐标:
let x = Double(widthScaleFActor * CGFloat(normalizedLng))
let 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))
也有可能您的地图投影没有简单的线性纬度刻度。 0-10 度可能是 12 个像素,而 10-20 度可能是 11 个像素,等等,而 80-90 度只有 3 个像素(或其他)。
我正在尝试在包含世界地图的 UIImage
上绘制地球上的一些坐标。 (我不想用地图)
请参阅下面的 UIImageView 示例:
如您所见,它运行良好,但坐标和 X Y 的映射不正确!
Amsterdam
的坐标是:(52.36666489, 4.883333206),Center
的坐标是(0,0).
我已经做了以下事情来尝试实现这一点,但不幸的是这没有成功:
- 我首先尝试 'normalize' 坐标,因为纬度范围从
-90
到90
,纬度范围从-180
到180
。这是通过将 90 加到实际纬度和 180 到实际经度来完成的,这会产生 'normalized' 版本:
let normalizedLat = location.coordinate.latitude + 90.0.
let normalizedLng = location.coordinate.longitude + 180.0
- 之后我计算了
normalizedLat
和normalizedLng
应该缩放的比例因子:
let heightScaleFactor = mapImageView.frame.height / 180.0
let widthScaleFActor = mapImageView.frame.width / 360.0
和 3. 之后我得到了比例因子,我终于可以通过以下方式计算坐标:
let x = Double(widthScaleFActor * CGFloat(normalizedLng))
let 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))
也有可能您的地图投影没有简单的线性纬度刻度。 0-10 度可能是 12 个像素,而 10-20 度可能是 11 个像素,等等,而 80-90 度只有 3 个像素(或其他)。