如何确定GPS坐标是打开还是处于椭圆状态?

时间:2013-04-15 03:22:35

标签: gps coordinates coordinate-systems ellipse coordinate-transformation

好的,所以我还是新问一下Stack Overflow上的问题,所以请你好一点:)

我有一个问题,我一直试图解决一个月,结果一次又一次失败。我发现了与此类似的各种问题,但没有任何事情让我感到震惊。

到目前为止,我发现的最接近的是: Convert GPS coordinates to coordinate plane

简而言之,我需要知道的是GPS坐标是在椭圆上还是在椭圆内。

的已知,:

  • 以米为单位的椭圆宽度
  • 以米为单位的椭圆高度
  • 椭圆中心的GPS坐标(大概在坐标系上为[0,0])
  • 测试点的GPS坐标
  • 要测试的角度
  • 到测试点的距离

UNKNOWNS / NEEDS:

  • 带有测试点角度的椭圆上的点坐标
  • 具有测试点角度的椭圆上的点的距离

请帮忙,因为某些原因,我无法将我的大脑包围在这个数学中。

<小时/>

更新: 要添加更多信息,这些值在宏观方案中都非常小。

举个例子: 如果用户想知道另一个用户是否已进入某个公园/场/地理围栏区域或某些其他类型的物理区域。在这种情况下,物理区域设计为椭圆形。

另外,这是用Objective-C编写的。下面,你会看到一个随机的“+90”度,这就是当我希望它是单位圆“正常”时,潜在的机制看到0度为北(导航)。

相关守则与讨论:

- (BOOL)isLocation:(CLLocation *)location withinEllipse:(Ellipse *)ellipse
{
    BOOL locationIsWithinEllipse = NO;
    double ellipseWidth = ellipse.width;
    double ellipseHeight = ellipse.height;

    CLLocationDegrees locationAngleDegrees = 360 - ((int)([self headingBetweenCoordinate1:location.coordinate coordinate2:ellipse.locationCenter.coordinate] + 90) % 360);//Invert Direction
    double xOffsetInMeters = (ellipseWidth/2) * COS(DEGREES_TO_RADIANS(locationAngleDegrees));
    double yOffsetInMeters = (ellipseHeight/2) * SIN(DEGREES_TO_RADIANS(locationAngleDegrees));



    // The logic below will currently grab the Top-Right point as if it were a box, not the point on the Ellipse,
    // This is where things are broken. I need this to be the GPS Coordinate of the Point on the Ellipse with angle (locationAngleDegrees)

    // Grab the Coordinate on the Ellipse in the heading of the Test Point
    CLLocationDegrees pointLat = [ellipse.locationCenter addToLocationDistanceInMeters:yOffsetInMeters withBearingInDegrees:0].coordinate.latitude;
    CLLocationDegrees pointLong = [ellipse.locationCenter addToLocationDistanceInMeters:xOffsetInMeters withBearingInDegrees:90].coordinate.longitude;
    CLLocation * testPointOnEllipseLocation = [[CLLocation alloc] initWithLatitude:pointLat longitude:pointLong];




    // Just check if the Test Point is closer than the Distance of the Ellipse Point
    if(ABS([location distanceFromLocation:ellipse.locationCenter]) <= ABS([testPointOnEllipseLocation distanceFromLocation:ellipse.locationCenter]))
    {
        locationIsWithinEllipse = YES;
    }

    return locationIsWithinEllipse;
}

<小时/>

更新:

我仍然试图让这个数学正确。我理解如何使用“学校数学”完成它,但是如何将其应用于示例中的代码?此外,我认真地不理解所有这些旋转的东西,因为我已经编写了所有代码,不知道任何旋转。我相信这一切都是在Apple的低级位置处理的。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

解决此类任务的一种方法始终有效:
1)将lat,lon转换为基于仪表的笛卡尔坐标系(4-5)代码行。
在您的情况下,我将椭圆中心用作转换代码中的“中心”(例如,圆柱等距投影需要中心纬度)

然后用学校数学来解决任务:使用椭圆方程。

所有人都认为椭圆与瞄准器平行。如果没有更新您的问题。

答案 1 :(得分:0)

我通过使用谷歌的一些数学计算和(非常有用的)以下问题的指导来解决这个问题: How to determine if a latitude & longitude is within an ellipse

我还将这个参考用于焦点计算:http://www.mathopenref.com/ellipsefoci.html

引用来自Cody的链接,主要逻辑: “我的椭圆相对较小,所以我认为它是一个真正的(平面)椭圆。我能够找到椭圆焦点的纬度,然后如果从感兴趣点到每个焦点的距离之和小于2a(长轴半径),然后它在椭圆内。“

我很欣赏所提出的建议!谢谢!