如何使用System.Spatial.GeographyPoint

Joh*_*ny5 7 c# geography

我需要一个函数来计算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;
  }
Run Code Online (Sandbox Code Playgroud)

以A结尾NotImplementedExceptionpoint1.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);
}
Run Code Online (Sandbox Code Playgroud)

现在,我得到了一个NullReferenceExceptionSpatialImplementation.CurrentImplementation.Operations.

Msdn对此并不是很冗长.

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

pso*_*usa 9

恕我直言,你不应该使用System.Spatial.这是为OData与Spatial的互操作性创建的半成品库,即WCF数据服务.

您可以在此处查看更多信息.此外,该库中的大多数类都是抽象的,因此最多可以实现它.

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

我不确定你在做什么样的项目,但我会建议这些指导方针:

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

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

  • 如果你需要在c#中进行进一步的空间操作,请使用像NetTopologySuite这样的东西.它有一个NuGet,它使用起来非常简单.