1

すべての場所を表示するズーム設定でプッシュピン/ウェイポイントの配列を使用して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

経度の子午線と緯度の緯線に関して、私の論理はとにかく逆方向、または間違っていることに気づきました。経度の子午線が垂直線(南北に「描画」)であり、緯線が水平線(東から西に「描画」)であることは事実ですが、これらの線に沿った点は緯線に基づく南北の位置。経度の子午線に基づく東西の位置を表します。これは、土星の環のように単に地球を一周するのではなく、地球を横切って(経度)そして上下に(緯度)回転する線を視覚化するまで、私の心の中で後ろ向きに見えました。また、私の認識を正しくするのに役立ったのは、どのタイムゾーンで自分自身を見つけるかを決定するのは経度の子午線の値であることを思い出したことです。それで、

4

2 に答える 2

2

Haversine式を使用して、球の表面に沿った距離を計算できます。

地球を球のサイズとして使用して距離を計算するC++ 関数を次に示します。C# に簡単に変換できます。

緯度または経度のいずれかで距離を見つけたい場合は、式を単純化できることに注意してください(これは、あなたがやろうとしているように聞こえます)。

于 2012-11-21T20:13:42.723 に答える
-6

直線距離を求めるには、ピタゴラスの定理を使用して斜辺を見つけます。

d = ((デルタ x)^2 + (デルタ y)^2)^.5

基本的には、x 方向と y 方向の両方の変化を 2 乗して足し、平方根をとります。

あなたの疑似コードでは、多くのポイントを持つことができ、それらすべてを包含する最大距離を見つけたいように見えます。これは、マップのズームの縮尺を把握しようとしている場合に意味があります。同じ式が機能するはずです。デルタ x には milesBetweenEastAndWestExtremes を、デルタ y には milesBetweenNorthAndSouthExtremes を使用するだけです。マップの端にポイントがないようにするためだけに、これに固定量を追加することを選択できます。

于 2012-11-21T19:50:01.070 に答える