4

MKOverlay プロトコルに準拠する NSObject サブクラスと MKOverlayPathRenderer のサブクラスを作成して、カスタム オーバーレイを作成しました。私の目標は、MKMapView のユーザーの場所に固定された円形のオーバーレイを作成することでした。それはうまく機能しています。オーバーレイの座標が設定されるたびに、レンダラーはキー値の監視を使用して、描画したパスを無効にしてから再描画します。

私が抱えている問題は、円の半径をメートル単位にしたいということですが、数学を正しく行っているとは思わないか、何かが欠けていると思います。オーバーレイ オブジェクトとレンダラーのソース コードを以下に投稿しました (レンダラーへのインターフェイスには何も含まれていません)。例を挙げると、半径を 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

1 に答える 1

5

メートルを (半径として) 描画しますが、MapPoints ですべてを指定する必要があります。

したがって、単位を変換します。

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

于 2013-12-25T01:40:19.960 に答える