Пользовательский MKOverlay с радиусом в метрах

Я создал пользовательский оверлей, создав подкласс NSObject, который соответствует протоколу MKOverlay и подклассу MKOverlayPathRenderer. Моя цель состояла в том, чтобы сделать круговой оверлей, привязанный к местоположению пользователя на MKMapView, и у меня это работает отлично. Всякий раз, когда задана координата на моем наложении, мой рендерер, используя наблюдение за ключом, делает недействительным путь, который он нарисовал, а затем перерисовывает.

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу, чтобы радиус круга был в метрах, но я не думаю, что я правильно делаю математику или что-то мне не хватает. Я отправил исходный код для объекта 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 

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

    Итак, преобразуйте единицы:

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

    Interesting Posts
    Давайте будем гением компьютера.