- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我通过制作符合 MKOverlay 协议(protocol)的 NSObject 子类和 MKOverlayPathRenderer 的子类来制作自定义叠加层。我的目标是制作一个锚定到 MKMapView 上的用户位置的圆形叠加层,并且我的工作正常。每当设置叠加层上的坐标时,我的渲染器都会使用键值观察使它绘制的路径无效,然后重新绘制。
我遇到的问题是我希望圆的半径以米为单位,但我认为我的数学计算不正确或者我遗漏了什么。我在下面发布了覆盖对象和渲染器的源代码(渲染器的接口(interface)中没有任何内容)。举个例子,我将半径设置为 200 米,但在 map View 中,它只显示为大约 10 米。有人知道如何解决这个问题吗?
//Custom Overlay Object Interface
@import Foundation;
@import MapKit;
@interface CustomRadiusOverlay : NSObject <MKOverlay>
+ (id)overlayWithCoordinate:(CLLocationCoordinate2D)coordinate radius:(CLLocationDistance)radius;
@property (nonatomic) CLLocationCoordinate2D coordinate;
@property (nonatomic) MKMapRect boundingMapRect;
@property (nonatomic) CLLocationDistance radius;
@end
//Custom overlay
#import "CustomRadiusOverlay.h"
@implementation LFTRadiusOverlay
+ (id)overlayWithCoordinate:(CLLocationCoordinate2D)coordinate radius:(CLLocationDistance)radius{
CustomRadiusOverlay* overlay = [LFTRadiusOverlay new];
overlay.coordinate = coordinate;
overlay.radius = radius;
return overlay;
}
- (MKMapRect)boundingMapRect{
MKMapPoint upperLeft = MKMapPointForCoordinate(self.coordinate);
MKMapRect bounds = MKMapRectMake(upperLeft.x, upperLeft.y, self.radius*2, self.radius*2);
return bounds;
}
- (void)setCoordinate:(CLLocationCoordinate2D)coordinate{
_coordinate = coordinate;
self.boundingMapRect = self.boundingMapRect;
}
@end
#import "CustomOverlayRadiusRenderer.h"
#import "CustomRadiusOverlay.h"
@interface CustomOverlayRadiusRenderer()
@property (nonatomic) CustomRadiusOverlay* circleOverlay;
@end
@implementation CustomOverlayRadiusRenderer
- (id)initWithOverlay:(id<MKOverlay>)overlay{
self = [super initWithOverlay:overlay];
if(self){
_circleOverlay = (LFTRadiusOverlay*)overlay;
[_circleOverlay addObserver:self forKeyPath:@"coordinate" options:NSKeyValueObservingOptionNew context:NULL];
self.fillColor = [UIColor redColor];
self.alpha = .7f;
}
return self;
}
- (void)createPath{
CGMutablePathRef path = CGPathCreateMutable();
MKMapPoint mapPoint = MKMapPointForCoordinate(self.circleOverlay.coordinate);
CGPoint point = [self pointForMapPoint:mapPoint];
CGPathAddArc(path, NULL, point.x, point.y, self.circleOverlay.radius, 0, kDegreesToRadians(360), YES);
self.path = path;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
[self invalidatePath];
}
@end
最佳答案
您绘制米(作为半径)但您需要在 MapPoints 中指定所有内容。
所以转换单位:
~~ mapPoints = 米 * MKMapPointsPerMeterAtLatitude(coordinate.latitude)
关于ios - 以米为单位的自定义 MKOverlay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768261/
我正在尝试向 MKMapView 添加叠加层,通过首先在 map 叠加层 (mapView.overlays: [MKoverlay]) 存储中查找叠加层来避免重复。 这就是我目前正在尝试的 func
我想创建一个将几个 MKShape 组合在一起的 MKOverlay,但我在使用复合 MKOverlayRenderer 时遇到了问题。 我想避免将所有这些都作为单独的 MKOverlays 和 MK
我正在使用 MKMapView 和 MKPolyline 来显示路线形状。当在我的 MKMapView 上放置一个注释并且那里已经有另一个注释时,它会异步地向我的方向提供程序发送路由调用并添加形状覆盖
我目前正在 Apple MapKit 中使用 MKOverlays。我尝试绘制建筑物内部的房间,当我将 map 置于 3D 模式时,房间会消失并显示在 map 中的建筑物下方。 以下是我将它们添加到
在我的应用程序中,我使用 MKPolyline 来跟踪用户的路径。有时(并非所有时间,我不明白),当新线段添加到 map 时,整条线都会闪烁。有时它没有。这是用于添加行的代码: CLLocationC
我通过制作符合 MKOverlay 协议(protocol)的 NSObject 子类和 MKOverlayPathRenderer 的子类来制作自定义叠加层。我的目标是制作一个锚定到 MKMapVi
我的 map 中有两个覆盖选项:MKCircleOverlay 和 MKPolygonOverlay。第一个是可变半径,通过 UISlider 控制。最后一个是可自定义的,具体取决于角的数量和位置。如
我已将 MKCircle 作为 MKOverlay 添加到我的 MKMapView。我还添加了一个 UISlider 来决定圆的半径。不幸的是,当使用它时,它似乎有点“滞后”,不像我想要的那样流畅。
我正在尝试使用 MKOverlayView 添加 png 图像作为自定义 map 。我几乎就在那里 - 我能够将图像排列在正确的位置,并且我知道 MKOverlayView 子类中的 -drawMap
我正在使用自定义 MKOverlay 在 MKMapView 上绘制天气数据。绘图是在 CoreGraphics 中完成的。对于这种特殊情况,由于它处理平铺的方式,在 drawMapRect:zoom
我已经使用手势识别器和给定叠加层的 boundingRect 来确定用户何时点击它。但是,我现在想让标注出现在用户点击的覆盖区域上,就像注释一样。我必须将叠加层创建为注释才能完成此操作吗?谢谢。 最佳
我正在尝试在平铺图像(下面的代码)顶部显示带有 kml 叠加层的平铺图像,并且收到以下错误: 'NSInvalidArgumentException', reason: '-[MKPolyline t
我在 CALayer(在 MKOverlay 上)上有一个带有一系列动画图像的 MKOverlay。每当我在 map 上移动或缩放时,都会再次添加 MKOverlay,这会导致同一叠加层的多个版本一次
我的应用程序是实时跟踪器,多个用户登录并通过将他们的坐标发送到我们的网络服务来更新他们的位置,然后每 2 分钟回调一次,让我们在我的 MapView 上显示所有用户。 每次我在 connectionD
如何更改 MKOverlay 的不透明度? 它目前是透明的 - 我不想要。 最佳答案 我深入引用了如何做到这一点: 在 TileMap 示例中,我们在 drawMapRect:zoomScale:in
我正在尝试使用谓词过滤掉 MKOverlays 数组,但出现异常。 NSArray *pointsArray = [viewController.mapView overlays];
我正在根据方向绘制叠加层。我从路线 a 到路线 b,然后从路线 b 到路线 c。 我想检测覆盖是否在 mkoverlay 上的任何地方被点击。 我用了这个例子Detecting touches on
我正在尝试更改 map 上现有 MKOverlay 的颜色。 我添加了几个 MKPolygons 作为 mapView 的独特叠加层。在渲染它们时,叠加层的颜色由 mapView rendererFo
我需要自定义 MKOverlay 笔触样式。我需要在叠加层内部使用更宽更浅的颜色,就像这个笔触。 我知道怎么画了, class PolygonRenderer:MKPolygonRenderer {
更具体地说...iOS 的 MapKit 框架是否在渲染之前内置了 MKPolyline 和 MKPolygon 叠加层的泛化? 模拟器看起来很粗糙,显示的是几条由数百个点组成的折线。我是否达到了 i
我是一名优秀的程序员,十分优秀!