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