目前 mvvmcross 故意不包括 lat/lng 计算。
这样做的动机是:
- 减少代码大小 - 并非每个应用程序都需要这些计算
- 此外,我认为某些计算最好由本机库而不是通用 C# 完成 - 例如,某些多边形计算将受益于本机硬件加速。这种类型的想法不仅适用于地理计算,还适用于其他领域 - 例如,无论需要像图像处理这样的事情,那么使用本机加速是有意义的。
可能 mvvmcross 在将来的某个时候提供了一个“官方的”位置助手 IoC 插件(或一组扩展方法)......例如,也许我们围绕http://xamarin.com/mobileapi构建了一个 IoC 插件。 ..我也很高兴其他人也能构建和发布它们。
所以....
在一个非常简单的层面上,计算两个 lat/lng 点之间的距离在 C# 中很容易实现 - 有大量相当简单的代码示例可用,例如http://www.movable-type.co 上的优秀 javascript 示例。 uk/scripts/latlong.html - github 和 codeplex 上有大量库,例如http://sharpmap.codeplex.com/
在 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:
我提供这些公式和脚本供免费使用和改编,作为我对开源信息领域的贡献,我从中获得了很多。欢迎您重新使用这些脚本 [根据简单的署名许可,没有任何明示或暗示的保证],前提是您保留我的版权声明和对本页的引用。