Ios 在UIView(非MKMapView)中使用lat/long的最佳实践
基本上,我有一个POI列表(名称、纬度、长度),我想在UIView上绘制它们,相对于我当前的纬度/长度。我正在寻找将这些POI(lat/long)映射到UIView的最佳实践 我不想使用MKMapView(不需要显示地图数据) 我在读: 但是我不知道如何在我的UIView上从一个CLLocation到一个(x,y)。我只想在我现在的位置画那些POI。例如,如果我的屏幕代表一个20×30公里的区域,我如何将我的POI映射到它们相应的(x,y)坐标Ios 在UIView(非MKMapView)中使用lat/long的最佳实践,ios,cocoa-touch,uiview,geolocation,uikit,Ios,Cocoa Touch,Uiview,Geolocation,Uikit,基本上,我有一个POI列表(名称、纬度、长度),我想在UIView上绘制它们,相对于我当前的纬度/长度。我正在寻找将这些POI(lat/long)映射到UIView的最佳实践 我不想使用MKMapView(不需要显示地图数据) 我在读: 但是我不知道如何在我的UIView上从一个CLLocation到一个(x,y)。我只想在我现在的位置画那些POI。例如,如果我的屏幕代表一个20×30公里的区域,我如何将我的POI映射到它们相应的(x,y)坐标 P.>我猜想,对于一个30公里的20公里的区域,
P.>我猜想,对于一个30公里的20公里的区域,你可以认为地球是平的,因此线性地推断出坐标。我相信你可以通过谷歌搜索,找出0.00001的经纬度差是多少 因此,如果要在X轴上表示20Km,并且当前位置的纬度为30.1234567,0.0000001为1km,则可以将坐标放置在屏幕的中心,将30.1234557作为最左侧的X坐标,依此类推 我不是想在这里提供答案,只是想大声思考,因为我也想做一些类似的事情,并且作为一个基于互联网的应用程序(没有显示),在给定两个坐标的情况下,我必须找到它们之间的距离。有很多(很多)对行星建模和将三维坐标转换到二维表面的不同方法,以及不同方法引入的误差因您所处的地球部位而异。这个问题似乎涵盖了你所追求的大部分内容:
您所做的有点奇怪,但是您可以将纬度/经度转换为类似于
CGPoint
的结构,称为MKMapPoint
。MKMapPoint
具有与地图上的点相对应的x
和y
值。想象一下,如果你画了一张平面的世界地图,0,0是左上角MKMapPoint
是地图上使用该坐标系的点
使用函数MKMapPointForCoordinate()
将CLLocationCoordinate2D
转换为MKMapPoint
MKMapPoint myMapPoint = MKMapPointForCoordinate(myLocationCoordinate);
当您获得点列表时,您必须执行一些操作,例如查找最大和最小x和y值,然后使用这些值将所有点拟合到您的视图中,否则您将在视图中的一个位置得到大量非常接近的点。我认为这是最好的方法(正确适用于):
我在UIView上添加坐标的简单项目:不要尝试此操作。在您考虑的尺寸(20km)下,变换肯定不是线性的,也不是一致的。在我的日常工作中,我们发现可以在米的距离上得到变换失真。井20*30KM就是一个例子。我想收缩并缩放到更小(或更大)的区域。但这是否意味着我需要使用MKMap?我去玩它。我不明白有什么奇怪?我基本上想要没有卫星图像的MKMapView。你可以使用
MKMapPointForCoordinate()
而不使用MKMapView
。您仍然需要导入MapKit框架才能使用该函数。此外,您还可以在没有卫星图像的情况下查看地图。只需将MKMapType
设置为MKMapTypeStandard
。
extension UIView
{
func addLocation(coordinate: CLLocationCoordinate2D)
{
// max MKMapPoint values
let maxY = Double(267995781)
let maxX = Double(268435456)
let mapPoint = MKMapPointForCoordinate(coordinate)
let normalizatePointX = CGFloat(mapPoint.x / maxX)
let normalizatePointY = CGFloat(mapPoint.y / maxY)
let pointView = UIView(frame: CGRectMake(0, 0, 5, 5))
pointView.center = CGPointMake(normalizatePointX * frame.width, normalizatePointY * frame.height)
pointView.backgroundColor = UIColor.blueColor()
addSubview(pointView)
}
}