我希望能够在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()应该是什么/做什么,但是......
这是“更好”:
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);
}
我意识到,无论经度和纬度的相似性,我的逻辑无论如何都是倒退或错误的。虽然经度的经线是垂直线(“绘制”北 - 南或反之亦然),而纬度的平行线是水平线(“绘制”东西方向),沿着这些线的点代表南北位置基于纬度的平行线,代表基于经度经线的东西方位置。这似乎在我脑海中倒退,直到我看到地球上的(经度)和上下(纬度)旋转的线条,而不是像土星环一样简单地绕地球旋转;什么也有助于让我的看法正确,这提醒我自己,经度经络的价值决定了人们在哪个时区发现自己。因此,上面的代码应该改变为通过纬度来确定最远的北方和最远的南方,相反地通过经度来确定最远的东方和最远的西方。
答案 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。您可以选择为此添加固定金额,以确保您没有正确位于地图边缘的点。