gpt4 book ai didi

ios - MKMapPoint 和 MKMapRect 的 MKMapPointMake

转载 作者:行者123 更新时间:2023-12-01 17:54:43 25 4
gpt4 key购买 nike

我有以下代码:

 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 将它们转换为 CLLocationCoordinate2D。例如:

    CLLocationCoordinate2D northCoords = MKCoordinateForMapPoint(northMapPoint);

除了northCoords,我还有centerCoords,它是 map 中心点的坐标。使用这两组坐标,我创建了一个数组 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;
}

问题:

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

enter image description here

最佳答案

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

  1. 代码假设 visibleMapRect 的边界是从 0,0 开始的,而实际上它们通常不是。 visibleMapRect.origin 属性具有起始偏移量。在计算中点时必须考虑到这一点。

    使用当前代码,如果边界是从 80 到 100,MKMapRectGetMaxX(mRect)/2 返回 50 但可见 map 矩形是从 80 到 100,所以该行在某处结束 最小 x 之前(而不是将结束 x 设置为 90)。

    所以不是 MKMapRectGetMaxX(mRect)/2,它应该是 (MKMapRectGetMinX(mRect) + MKMapRectGetMaxX(mRect))/2 或者更简单的 MKMapRectGetMidX (mRect).

    同样适用于 y 位置。

  2. 代码假定用户位置将位于 map 的中心。如果可以保证这一点,那么您可以像上面那样使用中点。然而,这是一个不必要的限制。您可以轻松调整代码,即使用户位置不在中心也能正常工作:

    //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);


以上应该适用于 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 委托(delegate)方法而不是 viewForOverlay 并返回 MKPolylineRenderer 而不是 MKPolylineView。尽管 iOS 7 目前在您仅实现 viewForOverlay 时仍然有效,但它在技术上已被弃用。您可以同时拥有这两种委托(delegate)方法,以便该应用程序可以在任何 iOS 版本中运行(iOS 6 将使用 viewForOverlay,而 iOS 7 将使用 rendererForOverlay 它就在那里)。

关于ios - MKMapPoint 和 MKMapRect 的 MKMapPointMake,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19968477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com