1

ユーザーの現在の場所を含むCLLocationオブジェクトがあり、角度を付けることができる長方形の各コーナーに4つの緯度/経度のペアがあります。次に、CLLocation座標がその長方形内にあるかどうかを確認します。

長方形の座標は次のとおりです

#define NorthEast_LAT 51.514894
#define NorthEast_LNG -0.135306
#define SouthEast_LAT 51.514831
#define SouthEast_LNG -0.135153
#define NorthWest_LAT 51.514719
#define NorthWest_LNG -0.135858
#define SouthWest_LAT 51.514556
#define SouthWest_LNG -0.135714

次のコードを試しましたが、長方形の角度が0度の場合にのみ機能すると思います。

 BOOL withinRect = [delegate.CLController latlngWithInBox:location 
                                                    point1:CLLocationCoordinate2DMake(NorthEast_LAT, NorthEast_LNG) 
                                                    point2:CLLocationCoordinate2DMake(SouthEast_LAT, SouthEast_LNG) 
                                                    point3:CLLocationCoordinate2DMake(NorthWest_LAT, NorthWest_LNG)
                                                    point4:CLLocationCoordinate2DMake(SouthWest_LAT, SouthWest_LNG)];

 - (BOOL) latlngWithInBox:(CLLocation *)position point1:(CLLocationCoordinate2D)point1 point2:(CLLocationCoordinate2D)point2 point3:(CLLocationCoordinate2D)point3 point4:(CLLocationCoordinate2D)point4 {

if (position.coordinate.latitude >= point3.latitude && position.coordinate.latitude <= point2.latitude
    && position.coordinate.longitude >= point3.longitude && position.coordinate.longitude <= point2.longitude) {
    return YES;
}
return NO;

}

4

3 に答える 3

8

ある点がマップ長方形内にあるかどうかを判断する別の方法は、MKMapKitの関数を使用することです。

  1. MKMapPointForCoordinate-座標をマップポイントに変換します
  2. MKMapRectMake-これらのポイントを使用してrectを作成する
  3. MKMapRectContainsPoint-指定されたマップポイントが長方形内にあるかどうかを判断します

利点は、MKMapKit(MKMapPoint、MKMapRect)がマップのメルカトル図法を使用するため、回転楕円体の計算を提供する必要がないことです。ただし、これらの機能の一部はiOS4.0以降で使用できます。

アップデート:

// 1 ------- 2
// |         |
// |      x  |
// |         |
// 3 ------- 4    

// 1 = topLeftCorner
// 4 = bottomRightCorner
// x = targetCoordinate

CLLocationCoordinate2D topLeftCorner = /* some coordinate */, bottomRightCorner = /* some coordinate */;
CLLocationCoordinate2D targetCoordinate = /* some coordinate */;
MKMapPoint topLeftPoint = MKMapPointForCoordinate(topLeftCorner);
MKMapPoint bottomRightPoint = MKMapPointForCoordinate(bottomRightCorner);
MKMapRect mapRect = MKMapRectMake(topLeftPoint.x, topLeftPoint.y, bottomRightPoint.x - topLeftPoint.x, bottomRightPoint.y - topLeftPoint.y);
MKMapPoint targetPoint = MKMapPointForCoordinate(targetCoordinate);   

BOOL isInside = MKMapRectContainsPoint(mapRect, targetPoint);
于 2012-05-18T13:35:25.767 に答える
1

地理座標の長方形が球体上にあることを無視しましょう(そこでは数学が困難です)。したがって、ポイントが四角形内にあるかどうかを確認する必要があります。

最も簡単な方法は、最初に制限を追加することです。ポイントは特定の順序(NE、NW、SE、SW)で指定する必要があります。次に、それらを通常の2D座標(経度= x、緯度= y)として扱います。

次のステップは、問題を減らすことです。たとえば、NE-NW-SEとNW-SE-SWのように、座標が2つの三角形を形成するようにします。次に、ポイントがこれら2つの三角形のいずれかにあるかどうかを確認します。

于 2012-05-18T12:48:46.347 に答える
0
- (BOOL) latlngWithInBox:(CLLocation *)position point1:(CLLocationCoordinate2D)point1 point2:(CLLocationCoordinate2D)point2 point3:(CLLocationCoordinate2D)point3 point4:(CLLocationCoordinate2D)point4 {
    //&& position.coordinate.latitude >= [[point4 objectAtIndex:0] floatValue] && position.coordinate.latitude <= [[point1 objectAtIndex:0] floatValue] && position.coordinate.longitude <= [[point4 objectAtIndex:1] floatValue] && position.coordinate.longitude >= [[point1 objectAtIndex:1] floatValue]
    if (PointInTriangle(position.coordinate, point1, point2, point3) || PointInTriangle(position.coordinate, point2, point3, point4)) {
        return YES;
    }
    return NO;
}

float sign(CLLocationCoordinate2D p1, CLLocationCoordinate2D p2, CLLocationCoordinate2D p3)
{
    return (p1.longitude - p3.longitude) * (p2.latitude - p3.latitude) - (p2.longitude - p3.longitude) * (p1.latitude - p3.latitude);
}

bool PointInTriangle(CLLocationCoordinate2D pt, CLLocationCoordinate2D v1, CLLocationCoordinate2D v2, CLLocationCoordinate2D v3)
{
    bool b1, b2, b3;

    b1 = sign(pt, v1, v2) < 0.0f;
    b2 = sign(pt, v2, v3) < 0.0f;
    b3 = sign(pt, v3, v1) < 0.0f;

//    NSLog(@"b1-%@", [NSNumber numberWithBool:b1]);
//    NSLog(@"b2-%@", [NSNumber numberWithBool:b2]);
//    NSLog(@"b3-%@", [NSNumber numberWithBool:b3]);

    return ((b1 == b2) && (b2 == b3));
}
于 2012-05-18T13:49:16.673 に答える