来自MKMapRect的MKMapPoint和MKMapPointMake

时间:2013-11-14 02:36:19

标签: ios mapkit

我有以下代码:

 MKMapRect mRect = self.mapView.visibleMapRect;
 MKMapPoint eastMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect), MKMapRectGetMaxY(mRect)/2);
 MKMapPoint northMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect)/2, 0);
 MKMapPoint southMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect)/2, MKMapRectGetMaxY(mRect));
 MKMapPoint westMapPoint = MKMapPointMake(0, MKMapRectGetMaxY(mRect)/2);

我正在使用CLLocationCoordinate2D将这些转换为MKCoordinateForMapPoint。例如:

    CLLocationCoordinate2D northCoords = MKCoordinateForMapPoint(northMapPoint);

northCoords一起,我有centerCoords,它是地图中心点的坐标。使用这两组坐标,我创建了一个数组CLLocationCoordinate2D coordinates[2],我将这两组添加到其中......

接下来,我使用以下代码在两个坐标之间绘制一条线:

    MKPolyline *polyLine = [MKPolyline polylineWithCoordinates:coordinates count:2];
    [_mapView addOverlay:polyLine];


- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 
{
    MKPolylineView *polylineView = [[MKPolylineView alloc] initWithPolyline:overlay];
    polylineView.strokeColor = [UIColor redColor];
    polylineView.lineWidth = 5.0;
    return polylineView;
}

问题:

折线叠加起点(地图中心)始终从中心开始正确。然而,该线的另一端(北/南/东/西)没有正确指向它应该的位置。在下图中,我将绘制与上面的4个MKMapPoint相对应的所有四行。

enter image description here

1 个答案:

答案 0 :(得分:4)

总体思路是正确的,但有两个问题:

  1. 代码假定visibleMapRect的边界来自0,0,它们通常不是。 visibleMapRect.origin属性具有起始偏移量。计算中点时必须考虑到这一点。

    使用当前代码,如果边界从80到100,MKMapRectGetMaxX(mRect)/2返回50,但可见地图rect从80到100,所以行之前的最小值 x(而不是将结尾x设置为90)。

    因此,MKMapRectGetMaxX(mRect)/2应该是(MKMapRectGetMinX(mRect) + MKMapRectGetMaxX(mRect))/2,而不是MKMapRectGetMidX(mRect),而不是y

    同样适用于//first convert userLocation to map points... MKMapPoint userLocationMapPoint = MKMapPointForCoordinate(mapView.userLocation.coordinate); MKMapPoint eastMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect), userLocationMapPoint.y); MKMapPoint northMapPoint = MKMapPointMake(userLocationMapPoint.x, MKMapRectGetMinY(mRect)); MKMapPoint southMapPoint = MKMapPointMake(userLocationMapPoint.x, MKMapRectGetMaxY(mRect)); MKMapPoint westMapPoint = MKMapPointMake(MKMapRectGetMinX(mRect), userLocationMapPoint.y); 职位。

  2. 代码假定用户位置位于地图的中心。如果这是有保证的,那么您可以使用上述中点。但是,这是一个不必要的限制。您可以轻松调整代码,以便即使用户位置不在中心也能正常工作:

    //radiusMapPoints will be the length of the line (max of width or height).
    double radiusMapPoints = MAX(mRect.size.width, mRect.size.height);
    
    //thetaRadians is the heading of the line in radians.
    //Example below is for 45.0 degrees.
    double thetaRadians = 45.0 * (M_PI/180.0);
    
    //endMapPoint is end of line starting from user location.
    MKMapPoint endMapPoint;
    endMapPoint.x = userLocationMapPoint.x + (radiusMapPoints * sin(thetaRadians));
    endMapPoint.y = userLocationMapPoint.y - (radiusMapPoints * cos(thetaRadians));
    
    CLLocationCoordinate2D lineCoords[2];
    lineCoords[0] = mapView.userLocation.coordinate;
    lineCoords[1] = MKCoordinateForMapPoint(endMapPoint);
    
    MKPolyline *polyLine = [MKPolyline polylineWithCoordinates:lineCoords count:2];
    //can also use polylineWithPoints and pass MKMapPoints instead
    [mapView addOverlay:polyLine];
    

  3. 以上内容适用于0(N),90(E),180(S)和270(W)位置,但可以使用某些三角函数对任何角度进行推广:

    rendererForOverlay


    另请注意,对于iOS 7,您应该实施viewForOverlay委托方法而不是MKPolylineRenderer并返回MKPolylineView而不是viewForOverlay。虽然iOS 7目前仍在使用,如果您只实现viewForOverlay,但它在技术上已被弃用。您可以使用两种委托方法,以便应用程序适用于任何iOS版本(iOS 6将使用rendererForOverlay,iOS 7将使用{{1}}它就在那里。