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