3

基本上我有一个 POI 列表(名称、纬度、经度),我想在 UIView 上绘制它们,相对于我当前的纬度/经度。我正在寻找一些将这些 POI(纬度/经度)映射到UIView的最佳实践。

不想使用 MKMapView(不需要显示地图数据)。

我在读:

http://developer.apple.com/library/ios/#documentation/general/conceptual/Devpedia-CocoaApp/CoordinateSystem.html

但我不知道如何从 CLLocation 到我的 UIView 上的 (x,y)。我只想在我当前位置周围绘制那些 POI。因此,例如,如果我的屏幕代表一个 20 x 30 公里的区域,我如何将我的 POI 映射到它们对应的 (x,y) 坐标?

谢谢。

4

4 回答 4

2

你所做的有点奇怪,但你可以将纬度/经度转换为一个CGPoint类似于结构的名为 an 的结构MKMapPoint。AnMKMapPoint具有与地图上的点相对应的xy值。想象一下,如果你布置了一张世界的平面地图,0,0 是左上角。MKMapPoint是使用该坐标系在该地图上的一个点。

使用函数MKMapPointForCoordinate()将 a 转换CLLocationCoordinate2D为 anMKMapPoint

MKMapPoint myMapPoint = MKMapPointForCoordinate(myLocationCoordinate);

当你得到点列表时,你必须做一些事情,比如找到最大和最小 x 和 y 值,然后使用这些值将所有点拟合到你的视图中,否则你最终会得到非常接近的负载点在您的视图中的一个位置。

于 2012-12-15T15:40:37.480 回答
0

有许多(许多)不同的方法可以对行星进行建模并将 3D 坐标转换到 2D 表面上,并且各种方法引入的错误取决于您所在的地球的哪个部分。这个问题似乎涵盖了您所追求的大部分内容:

在带有校准点的地图上将经度和纬度转换为 XY

于 2012-12-15T14:25:01.683 回答
0

我的猜测是,对于 20 公里乘 30 公里的区域,您可以认为地球是平的,因此可以线性外推坐标。我相信您可以通过谷歌了解经纬度 0.00001 的距离有多大。

因此,如果您要在 X 轴上表示 20Km,并且您当前的位置是纬度 30.1234567,而 0.0000001 是 1 km,那么您可以将您的坐标放在屏幕的中心,将 30.1234557 作为最左边的 X 坐标等等。

我不想在这里提供答案,而只是想大声思考,因为我也想做一些类似的事情,并将其作为基于 Internet 的应用程序(尽管没有显示),在给定两个坐标的情况下,我不得不找到它们之间的距离。

于 2012-12-15T13:58:55.563 回答
0

我认为它的最佳方式(正确适用于墨卡托投影图):

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)
    }
}

我在 UIView 上添加坐标的简单项目:https ://github.com/Glechik/MapCoordinateDrawer

于 2016-05-17T13:12:47.417 回答