坐标区域的中心坐标

时间:2012-11-20 17:21:06

标签: objective-c mkmapview coordinates geography

我有2个坐标,左上角和右下角。我想找到该地区的中心点。现在我有以下方法来计算它。中心点远离。当我用

调用方法时
[self.map setRegionTopLeft: CLLocationCoordinate2DMake(21.57524, -157.984514)
               bottomRight: CLLocationCoordinate2DMake(21.309766, -157.80766)
                  animated:YES];

它应该以美国夏威夷州的瓦胡岛为中心。我找到了这个数学here,所以我不确定它们是怎么回事。

代码A - 这是关闭的。它不会把我放在岛附近。

- (CLLocationCoordinate2D)centerPointFromRegionTopLeft:(CLLocationCoordinate2D)topLeft
                                           bottomRight:(CLLocationCoordinate2D)bottomRight
{
    CLLocationCoordinate2D centerPoint;

    centerPoint.longitude = (topLeft.longitude + bottomRight.longitude) / 2;
    if (fabs(bottomRight.longitude - topLeft.longitude) > 180)
    {
        if (centerPoint.longitude > 0)
        {
            centerPoint.longitude = centerPoint.longitude + 180;
        } else {
            centerPoint.longitude = centerPoint.longitude - 180;
        }
    }

    centerPoint.latitude = asin((sin(bottomRight.latitude) + sin(topLeft.latitude))/2);

    return centerPoint;
}

我原本也尝试过这种方法。当我想到一个矩形的中心时,它就是我脑海中浮现的东西。如果让我更接近中心应该是什么 - 我可以看到岛屿 - 但它仍然关闭。

代码B - 我试过的原始代码。这更接近我的预期,但仍然关闭。

- (CLLocationCoordinate2D)centerPointFromRegionTopLeft:(CLLocationCoordinate2D)topLeft
                                           bottomRight:(CLLocationCoordinate2D)bottomRight
{
    CLLocationCoordinate2D centerPoint;

    centerPoint.latitude =  ((topLeft.latitude + bottomRight.latitude) / 2);
    centerPoint.longitude = ((topLeft.longitude + bottomRight.longitude) / 2);

    return centerPoint;
}

所以给定一个坐标区域(topLeft,bottomRight)如何获得中心坐标?我的想法是我应该能够给出任何2个坐标并得到中心坐标。

更新* 代码B有效。我的topLeft和bottomRight错了。代码A让我非常向南,并且在我应该的位置的东边。

1 个答案:

答案 0 :(得分:0)

你需要L(经度)和B(纬度)的中间值。对于B来说问题是在杆子周围,但是当你设置它时,你根本无法“将杆盖在杆子上”,所以,这里真的没问题。

Middle(B1,B2)=(B1+B2)/2.

但是L更糟糕。 L可以从-179跳到-179。另一个问题:(-179,+ 179)的中间应该是180,而中间(-1,+ 1)应该是0.也就是说,我们应该总是在相对点之间沿着较短的路径选择中间,而不是在整个地球周围

我们应该移动零子午线,使L1,L2之间的差值小于180,使它们正常中间,然后返回零子午线。

  • 让L1
  • 如果L2-L1> 180,让我们为新的零子午线选择L2。
    • 移= L2
    • L2 = L2移位,L1 = L1 + 360移位。现在,注意,L1-L2< 180!
    • LmShifted =(L1 + L2)/ 2
    • Lm的= LmShifted +移。
    • 如果我们将这些公式放在一起,我们将:
    • Lm的=(L1-L2 + 360)/ 2 + L2
  • 如果L2-L1 <180,则Lm =(L1 + L2)/ 2

问题是当L2-L1 = 180时。在这种情况下,你有两个相反的经线,将地球分为两个,而中间的角色是“四分之一”子午线,向右和向左,适合。这取决于你,选择什么。