1

MvvmCross フレームワークを使用して、クロス プラットフォーム (iOS、Android、WP7) アプリケーションを構築しています。私は MvxGeoLocationWatcher を使用しています。これは、必要な Long、Lat、Speed、Heading などで MvxGeoLocation オブジェクトを作成します。

(カラスが飛ぶように) 2 つの場所の間の距離を見つける必要があります。Android では、 を呼び出しますfromLocation.distanceTo(toLocation)。iOS では、CLLocationDistance distance = [fromLocation distanceFromLocation:toLocation];.

そのため、これらのプラットフォームは両方とも、場所のメソッドを使用して距離を計算しますが、これは現在 MvxGeoLocation オブジェクトでは使用できません。

すぐに追加する予定はありますか?そうでない場合、この機能を追加するための最良の方法は何ですか?

  1. クラス自体を変更し、プラットフォーム固有の実装を提供しますか?おそらくそれを部分クラスにして、特定のコードをプラットフォーム固有のコード部分クラスに入れることによって。それとも、拡張メソッドを使用してですか?
  2. または、2 点を取得して距離を返すメソッドとして最適な方法かもしれません。このメソッドが MvxGeoLocationWatcher にあるのはどのような場合ですか?
  3. おそらく、km c# で 2 つのジオポイントの距離を計算するの何かを使用して、自分で計算アルゴリズムを追加し、プラットフォーム固有の実装を使用することを忘れます
4

1 に答える 1

3

現在、mvvmcross には緯度/経度の計算が意図的に含まれていません。

その動機は次のとおりです。

  • コードサイズを抑える - すべてのアプリがこれらの計算を必要とするわけではありません
  • さらに、いくつかの計算は、一般的な C# よりもネイティブ ライブラリを使用したほうがよいと考えています。たとえば、一部のポリゴン計算は、ネイティブ ハードウェア アクセラレーションの恩恵を受けます。この種の考え方は、地理計算だけでなく、他の領域にも当てはまります。たとえば、画像操作などが必要な場合は、ネイティブ アクセラレーションを使用することが理にかなっています。

将来のある時点で、mvvmcross が「公式の」ロケーション ヘルパー IoC プラグイン (または拡張メソッドのセット) を提供する可能性があります。 .. また、他の人がそれらを作成して公開することも非常に嬉しく思います。

そう....

非常に単純なレベルでは、2 つの緯度/経度ポイント間の距離を計算するのは C# で簡単に行うことができます。http://www.movable-type.co にある優れた JavaScript コードのように、かなり単純なコード例が山ほどあります。 uk/scripts/latlong.html - そして、 http: //sharpmap.codeplex.com/ のような github と codeplex にはたくさんのライブラリがあります。

RunSat (iPhone を含む) では、以下を使用します。

using System;

namespace Cirrious.NewRunSat.Core.Models.Utils
{
    public class DistanceCalcs
    {
        /// <summary>
        /// Calculates the distance between two points of latitude and longitude.
        /// Great Link - http://www.movable-type.co.uk/scripts/latlong.html
        /// </summary>
        /// <param name="lat1">First coordinate.</param>
        /// <param name="long1">First coordinate.</param>
        /// <param name="lat2">Second coordinate.</param>
        /// <param name="long2">Second coordinate.</param>
        /// <returns>the distance in metres</returns>
        public static Double DistanceInMetres(double lat1, double lon1, double lat2, double lon2)
        {

            if (lat1 == lat2 && lon1 == lon2)
                return 0.0;

            var theta = lon1 - lon2;

            var distance = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) +
                           Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) *
                           Math.Cos(deg2rad(theta));

            distance = Math.Acos(distance);
            if (double.IsNaN(distance))
                return 0.0;

            distance = rad2deg(distance);
            distance = distance * 60.0 * 1.1515 * 1609.344;

            return (distance);
        }

        private static double deg2rad(double deg) {
          return (deg * Math.PI / 180.0);
        }

        private static double rad2deg(double rad) {
          return (rad / Math.PI * 180.0);
        }
    }
}

このスニペットのライセンスは CC 帰属であることに注意してください - これは可動タイプから派生したものであるため - http://www.movable-type.co.uk/scripts/latlong.html :

私は、オープンソースの情報圏への貢献として、これらの公式とスクリプトを自由に使用および適応できるように提供しています。私の著作権表示とこのページへの参照を保持している場合に限り、これらのスクリプトを [単純な帰属ライセンスの下で、明示的または黙示的な保証なしで] 再利用することを歓迎します。

于 2012-04-26T11:02:49.353 に答える