我有以下代码:
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);我正在用MKCoordinateForMapPoint将它们转换为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。

发布于 2013-11-14 15:38:00
总体观点是正确的,但有两个问题:
visibleMapRect的边界为0,0,而它们通常不是。visibleMapRect.origin属性有起始偏移量。在计算当前代码的midpoint.With时必须考虑到这一点,如果边界是从80到100,MKMapRectGetMaxX(mRect)/2返回50,但可见的映射重排从80到100,因此行结束于最小x之前(而不是将结束x设置为90)。
所以,它应该是MKMapRectGetMaxX(mRect)/2,而不是(MKMapRectGetMinX(mRect) + MKMapRectGetMaxX(mRect))/2,或者更简单的MKMapRectGetMidX(mRect)。
y的位置也是如此。对于0 (N)、90 (E)、180 (S)和270 (W)位置,上述方法应该适用,但可以用一些三角函数将其推广到任意角度:
//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];还请注意,对于iOS 7,您应该实现rendererForOverlay委托方法而不是viewForOverlay,并返回MKPolylineRenderer而不是MKPolylineView。虽然iOS 7目前仍然有效,但如果您只实现viewForOverlay,则在技术上是不推荐的。您可以使用这两种委托方法,这样应用程序就可以在任何iOS版本中工作(iOS 6将使用viewForOverlay,而iOS 7将使用它在那里的rendererForOverlay )。
https://stackoverflow.com/questions/19968477
复制相似问题