1

私のアプリでは、円の周囲の座標の配列(CLLocationCoordinate2D)があります。そして今、私はどこかから座標を取得しています。新しい座標が円の中にあるかどうかを確認する必要があります。そして、もしそうなら、私はその座標にピンを表示したいだけで、基本的にそれはその領域に該当するはずです。これを確認するにはどうすればよいですか?

ありがとう、

4

1 に答える 1

4

座標の配列が緯度と経度、CLLocationCoordinate2D構造物、またはCLLocationオブジェクトであるかどうかはわかりませんでしたが、オブジェクトを作成したCLLocation場合 (まだオブジェクトがない場合)、呼び出しdistanceFromLocationて、それがどれだけ離れているかを確認できます。別の場所。周囲の座標の配列に加えて、中心の座標もあると思いますか?

をお持ちCLLocationCoordinate2Dの場合は、次のことができます。

CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude
                                                  longitude:coordinate.longitude];

CLLocation *centerLocation = [[CLLocation alloc] initWithLatitude:centerCoordinate.latitude
                                                        longitude:centerCoordinate.longitude];

CLLocationDistance distance = [location distanceFromLocation:centerLocation];

オフラインでチャットすると、マップ上の座標の配列はユーザ​​ーのジェスチャーの結果のように聞こえます (座標の円の中心がなかった理由はこれで説明できます)。

この場合、マッピング メソッドを使用してリージョンに座標が含まれているかどうかを判断するのではなく、Quartz メソッドを使用しCGPointてビュー内の がクローズド内に含まれているかどうかをテストすることをお勧めしUIBezierPathます。ユーザーのジェスチャーから構築します。

したがって:

  • UIBezierPathユーザーが画面上で指をドラッグすると、 aが作成されます。

  • 完了したら、結果のパスを問題の座標と比較します。たとえば、マップ ビューにユーザーの位置が表示されている場合userLocation、マップのプロパティを確認し、その座標を からCLLocationCoordinate2Dビューの座標に変換するには、マップ ビューのconvertCoordinate:toPointToViewメソッドを使用します)。

  • CGPointユーザーの現在位置のマップビュー内にあるため、UIBezierPathインスタンス メソッドを使用しcontainsPointて、ポイントがベジエ パス内にあるかどうかをテストできます。

したがって、次のようになります。

- (void)turnOnGestureForView:(MKMapView *)mapView
{
    mapView.scrollEnabled = NO;

    UIPanGestureRecognizer *gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    [mapView addGestureRecognizer:gesture];
}

- (void)turnOffGesture:(UIGestureRecognizer *)gesture map:(MKMapView *)mapView
{
    [mapView removeGestureRecognizer:gesture];
    mapView.scrollEnabled = YES;
}

- (void)handleGesture:(UIPanGestureRecognizer *)gesture
{
    static UIBezierPath *path;
    static CAShapeLayer *shapeLayer;

    CGPoint location = [gesture locationInView:gesture.view];

    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        if (!shapeLayer)
        {
            shapeLayer = [[CAShapeLayer alloc] init];
            shapeLayer.fillColor = [[UIColor clearColor] CGColor];
            shapeLayer.strokeColor = [[UIColor redColor] CGColor];
            shapeLayer.lineWidth = 3.0;
            [self.mapView.layer addSublayer:shapeLayer];
        }
        path = [UIBezierPath bezierPath];
        [path moveToPoint:location];
    }
    else if (gesture.state == UIGestureRecognizerStateChanged)
    {
        [path addLineToPoint:location];
        shapeLayer.path = [path CGPath];
    }
    else if (gesture.state == UIGestureRecognizerStateEnded)
    {
        MKMapView *mapView = (MKMapView *)gesture.view;

        [path addLineToPoint:location];
        [path closePath];
        CGPoint currentLocation = [mapView convertCoordinate:mapView.userLocation.coordinate
                                                    toPointToView:gesture.view];
        if ([path containsPoint:currentLocation])
            NSLog(@"%s path contains %@", __FUNCTION__, NSStringFromCGPoint(currentLocation));
        else
            NSLog(@"%s path does not contain %@", __FUNCTION__, NSStringFromCGPoint(currentLocation));

        [shapeLayer removeFromSuperlayer];
        shapeLayer = nil;

        // if you want to turn off the gesture and turn scrolling back on, you can do that now

        [self turnOffGesture:gesture map:mapView];
    }
}
于 2013-02-01T20:36:10.947 に答える