Я сделал пользовательский оверлей, создав подкласс NSObject, который соответствует протоколу MKOverlay и подклассу MKOverlayPathRenderer. Моя цель состояла в том, чтобы сделать круговой оверлей, привязанный к местоположению пользователя на MKMapView, и у меня это работает отлично. Всякий раз, когда задана координата на моем наложении, мой рендерер, используя наблюдение за ключом, делает недействительным путь, который он нарисовал, а затем перерисовывает.Пользовательский MKOverlay с радиусом в метрах
Проблема, с которой я сталкиваюсь, заключается в том, что я хочу, чтобы радиус круга был в метрах, но я не думаю, что я делаю математику правильно или что-то мне не хватает. Я отправил исходный код для объекта overlay и средства визуализации ниже (интерфейс к визуализатору ничего не имеет в нем). Чтобы привести пример, у меня есть радиус, установленный на расстоянии 200 метров, но на карте, он отображается всего около 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
ты бог. Прекрасно работает, даже не знал, что эта функция существует. – barndog