すべての場所を表示するズーム設定でプッシュピン/ウェイポイントの配列を使用してWindows8/ 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);
}
...しかし、「こだわりのポイント」(難しい部分)は「milesBetween」機能です。2つの座標間のマイルを計算するための既存のアルゴリズムはありますか?
私はこれが今のところ米国中心のコードの束であることを理解しています(マイル対キロメートル)。つまり、今のところ、設計どおりです。
アップデート
これは私の新しい擬似コードです(実際のコンパイルコードですが、テストされていません):
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
経度の子午線と緯度の緯線に関して、私の論理はとにかく逆方向、または間違っていることに気づきました。経度の子午線が垂直線(南北に「描画」)であり、緯線が水平線(東から西に「描画」)であることは事実ですが、これらの線に沿った点は緯線に基づく南北の位置。経度の子午線に基づく東西の位置を表します。これは、土星の環のように単に地球を一周するのではなく、地球を横切って(経度)そして上下に(緯度)回転する線を視覚化するまで、私の心の中で後ろ向きに見えました。また、私の認識を正しくするのに役立ったのは、どのタイムゾーンで自分自身を見つけるかを決定するのは経度の子午線の値であることを思い出したことです。それで、