首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MKMapPoint与来自MKMapRect的MKMapPointMake

MKMapPoint与来自MKMapRect的MKMapPointMake
EN

Stack Overflow用户
提问于 2013-11-14 02:36:18
回答 1查看 4K关注 0票数 2

我有以下代码:

代码语言:javascript
复制
 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。例如:

代码语言:javascript
复制
    CLLocationCoordinate2D northCoords = MKCoordinateForMapPoint(northMapPoint);

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

下面,我使用以下代码在两个坐标之间画一条线:

代码语言:javascript
复制
    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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-14 15:38:00

总体观点是正确的,但有两个问题:

  1. 代码假设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的位置也是如此。
  2. 代码假定用户位置将位于地图的中心。如果这是有保证的,那么您就可以使用上面的中点。不过,这是不必要的限制。您可以轻松地调整代码,以便即使用户位置不在中心位置也能工作: //首先将userLocation转换为映射点..。MKMapPointForCoordinate(mapView.userLocation.coordinate);userLocationMapPoint = MKMapPoint eastMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect),userLocationMapPoint.y);MKMapPoint northMapPoint = MKMapPointMake(userLocationMapPoint.x,MKMapRectGetMinY(mRect));MKMapPoint southMapPoint = MKMapPointMake(userLocationMapPoint.x,MKMapRectGetMaxY(MKMapRectGetMaxY));MKMapPoint westMapPoint = MKMapPointMake(MKMapRectGetMinX(mRect),userLocationMapPoint.y);

对于0 (N)、90 (E)、180 (S)和270 (W)位置,上述方法应该适用,但可以用一些三角函数将其推广到任意角度:

代码语言:javascript
复制
//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 )。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19968477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档