- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码:
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 对应的所有四条线。
最佳答案
总体思路是对的,但是有两个问题:
代码假设 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
位置。
代码假定用户位置将位于 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/
我正在使用Apple的Footprint: Indoor Positioning with Core Location sample code构建移动应用程序。此代码采用 Swift 3.0 格式,我
我使用此代码在 map 上显示所有注释: MKMapRect zoomRect = MKMapRectNull; for (id annotation in mapView.ann
我正在尝试放大 map ,重点关注与该 map 关联的所有图钉。我已将该信息保存在我的 map 属性中。 我从这个开始,但它还没有工作: double maxLatitude = 0;
我使用MKMapRectMake 标记东北和西南以显示区域。以下是我的做法: routeRect = MKMapRectMake(southWestPoint.x, southWestPoint.y,
我必须在 MKMapView 上显示一个 MKMapRoute,它必须显示在我 map 上的特定区域,而不是在中心,而是在顶部区域。它必须放在一个大约 80 点高的“框架”中。 我以为我可以通过使用M
我想得到一个在所有方向上都比当前 visibleMapRect 大 10-20% 的结果 MKMapRect。如果这是一个 CGRect,我将使用具有负 x 和 y 值的 CGRectInset,为我
我有一个自定义类,它扩展了 NSObject 并实现了 MKOverlay 协议(protocol)。因此,我需要实现协议(protocol)的 boundingMapRect 属性,它是一个 MKM
我需要在 map 上注释一个可见点(无需用户输入)。我正在使用 MKMapView visibleMapRect计算我想要的点。但是,从我下面的代码中,我正在阅读类似的值 let rect = map
我正在绘制一个图像作为 MKMapview 的叠加层,为此,我需要知道 MKMapRect 和 CGRect 之间的关系,以便在可见的映射矩形的矩形中绘制图像。 我没有找到任何解决方案..,请建议我,
我正在使用以下方法: - (void)loadTileAtPath:(MKTileOverlayPath)path result:(void (^)(NSData *data, NSError *er
如何将 map View 的可见矩形转换为 CLRegion 以与 CLGeocoder 一起使用? 最佳答案 哦,我刚刚在这里找到了这个答案: https://gist.github.com/340
我试图在给定的 MKMapRect 中将注释/坐标居中。我首先创建了 rect,它是 mapview 和另一个 View 之间的可见区域。然后将该矩形转换为与 map View 成比例的矩形,以便正确
我想在使用 Mapkit 的 MKMap 上使用 MKPolygon 绘制走廊。我有一条从 A 站到 B 站的路线。 我在绘制走廊的路线周围有 MKMapRects。现在我想将所有矩形合并为一个多边形
我搜索了很多答案,我无法想象这样的方法不存在!!我有一个 MKTileOverlayPath (x , y & z) 并且还能够得到这个矩形中心的经度/纬度。现在我需要获取每个矩形的跨度,这可能吗?
我正在创建一个 MKMapView 应用程序,需要在 plist 中保存几个 MKMapRect 类型的变量,以便在需要时引用它们。 我知道 MKMapRect 有 MKMapPoint origin
我的应用程序中有一个方形 MKMapView,我希望设置一个中心点和以米为单位的 View 的确切高度/宽度。 创建一个 MKCoordinateRegion 并将 map 设置到它(如在此代码中..
我有以下代码: MKMapRect mRect = self.mapView.visibleMapRect; MKMapPoint eastMapPoint = MKMapPointMake(MK
我正在尝试查看我拥有的某些范围(最大 x、最大 y、最小 x、最小 y 坐标)是否位于当前可见 map View 中。 我采用我的范围并创建一个MKMapRect: MKMapPoint upperL
给定一个 MKMapView,它包含 map 上不同点的可变数量的注释([mapView annotations])和 MKMapRect 值MKMapRectWorld,如何确定 map 上最集中于
所以我有一个函数接受两个 MKMapRect,第二个与第一个相交。因此该函数创建了一个 MKPolygon,它是第一个没有相交部分的矩形: -(void) polygons:(MKMapRe
我是一名优秀的程序员,十分优秀!