1

我正在使用 MvvmCross 框架来构建一个跨平台(iOS、Android、WP7)应用程序。我正在使用 MvxGeoLocationWatcher,它为我创建具有所需的经度、纬度、速度、航向等的 MvxGeoLocation 对象。

我需要找到两个位置之间的距离(如乌鸦飞翔)。在 Android 上,我调用fromLocation.distanceTo(toLocation). 在 iO 上我会使用CLLocationDistance distance = [fromLocation distanceFromLocation:toLocation];.

因此,这两个平台都使用位置上的方法来计算距离,而这目前在 MvxGeoLocation 对象上不可用。

有计划尽快添加吗?如果不是,我添加此功能的最佳方法是什么?

  1. 我是否会更改类本身并提供特定于平台的实现 - 也许通过使其成为部分类并将特定代码放入特定于平台的代码部分类中。或者也许通过使用扩展方法?
  2. 或者也许最好的方法是采用两点并返回距离的方法。在什么情况下这个方法应该在 MvxGeoLocationWatcher 上?
  3. 在我自己中添加计算算法,可能使用计算两个地理点在 km c# 中的距离并忘记使用平台特定的实现
4

1 回答 1

3

目前 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

我提供这些公式和脚本供免费使用和改编,作为我对开源信息领域的贡献,我从中获得了很多。欢迎您重新使用这些脚本 [根据简单的署名许可,没有任何明示或暗示的保证],前提是您保留我的版权声明和对本页的引用。

于 2012-04-26T11:02:49.353 回答