10

我需要一个函数来计算点 A 和点 B 之间的距离。

命名空间System.Spatial似乎正是我所需要的,但我不知道如何使用它。

IPoint是一个接口,它提供LatitudeLongitude,两者都是 类型double

第一次尝试 :

  public static double CalculateDistance(IPoint pointA, IPoint pointB)
  {
     var gp1 = GeographyPoint.Create(pointA.Latitude, pointA.Longitude);
     var gp2 = GeographyPoint.Create(pointB.Latitude, pointB.Longitude);

     return gp1.Distance(gp2) ?? 0;
  }

NotImplementedExceptionon结束point1.Distance(point2)。该消息是法语的,但基本上它说“未注册操作。请使用属性 SpatialImplementation.CurrentImplementation.Operations 提供操作”。

好的,我会试试这个:

public static double CalculateDistance(IPoint pointA, IPoint pointB)
{
   var gp1 = GeographyPoint.Create(pointA.Latitude, pointA.Longitude);
   var gp2 = GeographyPoint.Create(pointB.Latitude, pointB.Longitude);

   return SpatialImplementation.CurrentImplementation.Operations.Distance(gp1, gp2);
}

现在我NullReferenceException开了一个SpatialImplementation.CurrentImplementation.Operations

Msdn 对此并没有多说。

任何人都可以解释如何获得这些实现?

4

1 回答 1

11

恕我直言,您不应该使用System.Spatial. 它是为 OData 与 Spatial 的互操作性(即 WCF 数据服务)而创建的半生不熟的库。

你可以在这里查看更多信息。此外,该库中的大多数类都是抽象的,因此由你来实现大部分。

此外,更糟糕的是,它们与实体框架空间支持不兼容。

我不确定您正在进行什么样的项目,但我会建议以下准则:

  • 如果您只需要计算点之间的距离,只需复制C# 中Haversine 公式Vincenty 公式的实现。

  • 如果您需要 DB 上的空间,只需使用 Entity Framework 5/6。

  • 如果您需要在 c# 中进行进一步的空间操作,请使用 NetTopologySuite 之类的东西。它有一个 NuGet,使用起来非常简单。

于 2013-09-30T16:50:09.850 回答