是否有算法计算坐标之间的英里数?

时间:2012-11-21 19:32:43

标签: c# geolocation bing-maps

我希望能够在Windows 8 / Store应用程序中显示Bing地图,其中包含一组缩放设置的图钉/航点,该设置将显示每个位置,但不会超过 - IOW,我想要尽可能多的细节尽可能地显示所有位置/坐标。

我有这个伪代码:

public static int GetMapZoomSettingForCoordinates(List<String> coordinatesList)
{
    string furthestNorth = GetFurthestNorth(coordinatesList);
    string furthestSouth = GetFurthestSouth(coordinatesList);
    string furthestEast = GetFurthestEast(coordinatesList);
    string furthestWest = GetFurthestWest(coordinatesList);
    int milesBetweenNorthAndSouthExtremes = GetMilesBetween(furthestNorth, furthestSouth);
    int milesBetweenEastAndWestExtremes = GetMilesBetween(furthestEast, furthestWest);
    int greaterCardinalDistance = Math.Max(milesBetweenNorthAndSouthExtremes, milesBetweenEastAndWestExtremes);
    return GetZoomSettingForDistance(greaterCardinalDistance);
}

...但“粘滞点”(难点)是“里程碑”功能。是否存在用于计算两个坐标之间的英里数的现有算法?

我确实意识到这是以美国为中心的一堆代码(英里对公里数);就目前而言,按照设计。

更新

这是我的新伪代码(实际编译代码,但未经测试):

public static int GetMapZoomSettingForCoordinates(List<string> coordinatePairsList)
{
    List<double> LatsList = new List<double>();
    List<double> LongsList = new List<double>();
    List<string> tempList = new List<string>();

    foreach (string s in coordinatePairsList)
    {
        tempList.AddRange(s.Split(';'));
        double dLat;
        double.TryParse(tempList[0], out dLat);
        double dLong;
        double.TryParse(tempList[0], out dLong);
        LatsList.Add(dLat);
        LongsList.Add(dLong);
        tempList.Clear();
    }

    double furthestNorth = GetFurthestNorth(LatsList);
    double furthestSouth = GetFurthestSouth(LatsList);
    double furthestEast = GetFurthestEast(LongsList);
    double furthestWest = GetFurthestWest(LongsList);
    int milesToDisplay = 
        HaversineInMiles(furthestWest, furthestNorth, furthestEast, furthestSouth);
    return GetZoomSettingForDistance(milesToDisplay);
}

private static double GetFurthestNorth(List<double> longitudesList)
{
    double northernmostVal = 0.0;
    foreach (double d in longitudesList)
    {
        if (d > northernmostVal)
        {
            northernmostVal = d;
        }
    }
    return northernmostVal;
}

......我仍然不知道GetZoomSettingForDistance()应该是什么/做什么,但是......

更新2

这是“更好”:

public static int GetMapZoomSettingForCoordinates(List<Tuple<double, double>> coordinatePairsList)
{
    var LatsList = new List<double>();
    var LongsList = new List<double>();

    foreach (Tuple<double,double> tupDub in coordinatePairsList)
    {
        LatsList.Add(tupDub.Item1);
        LongsList.Add(tupDub.Item2);
    }

    double furthestNorth = GetFurthestNorth(LongsList);
    double furthestSouth = GetFurthestSouth(LongsList);
    double furthestEast = GetFurthestEast(LatsList);
    double furthestWest = GetFurthestWest(LatsList);
    int milesToDisplay =
        HaversineInMiles(furthestWest, furthestNorth, furthestEast, furthestSouth); 
    return GetZoomSettingForDistance(milesToDisplay);
}

更新3

我意识到,无论经度和纬度的相似性,我的逻辑无论如何都是倒退或错误的。虽然经度的经线是垂直线(“绘制”北 - 南或反之亦然),而纬度的平行线是水平线(“绘制”东西方向),沿着这些线的点代表南北位置基于纬度的平行线,代表基于经度经线的东西方位置。这似乎在我脑海中倒退,直到我看到地球上的(经度)和上下(纬度)旋转的线条,而不是像土星环一样简单地绕地球旋转;什么也有助于让我的看法正确,这提醒我自己,经度经络的价值决定了人们在哪个时区发现自己。因此,上面的代码应该改变为通过纬度来确定最远的北方和最远的南方,相反地通过经度来确定最远的东方和最远的西方。

2 个答案:

答案 0 :(得分:2)

您可以使用Haversine公式计算球体表面的距离。

Here's a C++ function使用地球计算距离作为球体的大小。它很容易转换为C#。

请注意,如果您想要在纬度或纵向找到距离(这听起来像是您尝试做的话),可以简化公式。

答案 1 :(得分:-5)

要获得直线距离,请使用毕达哥拉斯定理来找到斜边。

d =((Δx)^ 2 +(Δy)^ 2)^。5

基本上对x方向和y方向的变化进行平方,加上它们,然后取平方根。

在你的伪代码中看起来你可能有很多点,你想找到一个应该包含所有这些点的最大距离,如果你想要找出一个缩放地图的比例,这是有意义的。相同的公式应该可以使用,只需使用milesBetweenEastAndWestExtremes代替delta x,使用milesBetweenNorthAndSouthExtremes代替delta y。您可以选择为此添加固定金额,以确保您没有正确位于地图边缘的点。