4

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

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

它应该以美国夏威夷州的瓦胡岛为中心。我在这里找到了这个数学,所以我不确定发生了什么。

代码 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 把我放在它应该在的地方非常南边和东边一点。

4

1 回答 1

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 时。在这种情况下,您有两条相反的子午线,将地球一分为二,并且对于中间两个“四分之一”子午线的作用,右侧和左侧都合适。这取决于你,选择什么。

于 2014-02-15T00:02:37.503 回答