我有以下代码:
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);
Run Code Online (Sandbox Code Playgroud)
我正在将这些转换为CLLocationCoordinate2D
with MKCoordinateForMapPoint
。例如:
CLLocationCoordinate2D northCoords = MKCoordinateForMapPoint(northMapPoint);
Run Code Online (Sandbox Code Playgroud)
与 一起northCoords
,我有centerCoords
which 是地图中心点的坐标。使用这两组坐标,我创建了一个数组,将这两组坐标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;
}
Run Code Online (Sandbox Code Playgroud)
问题:
折线叠加起点(地图中心)始终从中心开始是正确的。然而,线路的另一端(北/南/东/西)没有正确指向它应该在的位置。在下图中,我正在绘制与上面的 4 MKMapPoint 对应的所有四条线。
小智 5
总体思路是对的,但是有两个问题:
代码假定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);
Run Code Online (Sandbox Code Playgroud)
以上应该适用于 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];
Run Code Online (Sandbox Code Playgroud)
另请注意,对于 iOS 7,您应该实现rendererForOverlay
委托方法而不是viewForOverlay
并返回一个MKPolylineRenderer
而不是一个MKPolylineView
。尽管 iOS 7 目前仍然有效,如果你只实现viewForOverlay
它,它在技术上已被弃用。您可以同时使用这两种委托方法,以便应用程序在任何 iOS 版本中运行(iOS 6 将使用viewForOverlay
,iOS 7 将使用rendererForOverlay
它在那里)。
归档时间: |
|
查看次数: |
3756 次 |
最近记录: |