2013-12-25 2 views
3

Я сделал пользовательский оверлей, создав подкласс 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 

ответ

4

вы рисуете метры (как радиус), но вам нужно указать все в MapPoints.

Так преобразования единиц измерения:

~~ mapPoints = meters * MKMapPointsPerMeterAtLatitude(coordinate.latitude)

+0

ты бог. Прекрасно работает, даже не знал, что эта функция существует. – barndog

Смежные вопросы